Islamic Azad University
Qazvin Branch
Faculty of Industrial and Mechanics , Department of Mechanical
Engineering
Subject
Compare Some Algorithms for Solving Nonlinear Equation
Thesis Advisor
Dr.Marufi
By
Parham Sagharichi Ha
Assignment of Numerical Analysis Parham Sagharichi Ha
Problem
The speed v of a Saturn V rocket in vertical flight near the surface of earth can
be approximated by
๐ฃ = ๐ข ln๐0
๐0 โ ๏ฟฝฬ๏ฟฝ๐กโ ๐๐ก
๐ข = 2510๐
๐ = ๐ฃ๐๐๐๐๐๐ก๐ฆ ๐๐ ๐๐ฅโ๐๐ข๐ ๐ก ๐๐๐๐๐ก๐๐ฃ๐ ๐ก๐ ๐กโ๐ ๐๐๐๐๐๐ก
๐0 = 2.8 โ 106๐๐ = ๐๐๐ ๐ ๐๐ ๐๐๐๐๐๐ก ๐๐ก ๐๐๐๐ก๐๐๐
๏ฟฝฬ๏ฟฝ = 13.3 โ 103๐๐
๐ = ๐๐๐ก๐ ๐๐ ๐๐ข๐๐ ๐๐๐๐ ๐ข๐๐๐ก๐๐๐
๐ = 9.81๐
๐ 2= ๐๐๐๐ฃ๐๐ก๐๐ก๐๐๐๐๐ ๐๐๐๐๐๐๐๐๐ก๐๐๐
๐ก = ๐ก๐๐๐
Determine the time when the rocket reaches the speed of sound (335 m/s).
Solution
๐ข ๐๐๐0
๐0 โ ๏ฟฝฬ๏ฟฝ๐กโ ๐๐ก โ ๐ฃ = 0
Now we want to determine time in the above equation
Assignment of Numerical Analysis Parham Sagharichi Ha
Matlab
1) Bisection Method
Script :
clc
close all
clear all
%%
% Subject : Bisect Algorithm
% Author: Parham Sagharichi Ha Email :
%%
%-------------------S------T------A------R------T------------
-------------%
global tolerance
tolerance = 1e-4; % for example : 1e-4 = 10^-4
u = 2510;
M0 = 2.8*10^6;
mdot = 13.3*10^3;
g = 9.81;
v = 335;
xlower = 0;
xupper = 100;
myfun = @(t)(u.*log(M0./(M0-mdot.*t))-g.*t-v);
[root,iflag] = fbisect(myfun,xlower,xupper);
switch iflag
case -2
disp('Initial range does not only contain one root')
otherwise
disp([' Root = ' num2str(root) ...
' found in ' num2str(iflag) ' iterations'])
end
%---------------F------I------N------I------S------H---------
-------------%
Assignment of Numerical Analysis Parham Sagharichi Ha
Function :
function [root,iflag] = fbisect(myfun,a,b)
if a>=b
disp(' attention b>a in [a b] ')
return
end
global tolerance
x = a:0.001:b;
y = feval(myfun,x);
fa = y(1);
fb = y(end);
ymax = max(y);
ymin = min(y);
figure
plot(x,y)
grid on
hold on
plot([a a],[ymin ymax])
plot([b b],[ymin ymax])
iflag = 0;
iterations = 0 ;
while (fa*fb<0) & (b-a)>tolerance
iterations = iterations + 1;
c = (a+b)/2;
fc = feval(myfun,c);
plot([c c],[ymin ymax])
pause
if fa*fc<0
b = c; fb = fc;
elseif fa*fc>0
a = c; fa = fc;
else
iflag = 1;
root = c
return
end
end
switch iterations
case 0
iflag = -2; root = NaN;
otherwise
iflag = iterations; root = c;
end
Assignment of Numerical Analysis Parham Sagharichi Ha
Result :
Root = 70.8779 found in 20 iterations
2) Linear Interpolation (False Position) Method :
Script :
clc
close all
clear all
%%
% Subject : False Postion Algorithm
% Author: Parham Sagharichi Ha Email :
%%
%-------------------S------T------A------R------T------------
-------------%
global tolerance
tolerance = 1e-4; % for example : 1e-4 = 10^-4
u = 2510;
M0 = 2.8*10^6;
mdot = 13.3*10^3;
g = 9.81;
v = 335;
xlower = 0;
xupper = 100;
myfun = @(t)(u.*log(M0./(M0-mdot.*t))-g.*t-v);
[root,iflag] = finter(myfun,xlower,xupper);
switch iflag
case -2
disp('Initial range does not only contain one root')
otherwise
disp([' Root = ' num2str(root) ...
' found in ' num2str(iflag) ' iterations'])
end
%---------------F------I------N------I------S------H---------
-------------%
Assignment of Numerical Analysis Parham Sagharichi Ha
Function :
function [root,iflag] = finter(myfun,a,b)
if a>=b
disp(' attention b>a in [a b] ')
return
end
global tolerance
x = a:0.001:b;
y = feval(myfun,x);
fa = y(1);
fb = y(end);
ymax = max(y);
ymin = min(y);
figure
plot(x,y)
grid on
hold on
plot([a a],[ymin ymax])
plot([b b],[ymin ymax])
iflag = 0;
iterations = 0 ;
while (fa*fb<0) & (b-a)>tolerance
iterations = iterations + 1;
c = b - (fb)*(a-b)/(fa-fb);
fc = feval(myfun,c);
plot([c c],[ymin ymax])
pause
if fa*fc<0
b = c; fb = fc;
elseif fa*fc>0
a = c; fa = fc;
else
iflag = 1;
root = c
return
end
end
switch iterations
case 0
iflag = -2; root = NaN;
otherwise
Assignment of Numerical Analysis Parham Sagharichi Ha
iflag = iterations; root = c;
end
Result :
Root = 70.878 found in 24 iterations
3) Newton-Raphson Method :
Script :
clc
close all
clear all
%%
% Subject : Newton_Raphson Algorithm
% Author: Parham Sagharichi Ha Email :
%%
%-------------------S------T------A------R------T------------
-------------%
format short E
tolerance = 1e-4; % for example : 1e-4 = 10^-4
xlower = 0;
xupper = 100;
xguess = 45;
if (xguess>xupper)||(xlower>xguess)
disp(' error , repate again ')
return
end
xrange = xlower:0.1:xupper;
s = size(xrange);
u = 2510;
M0 = 2.8*10^6;
mdot = 13.3*10^3;
g = 9.81;
v = 335;
syms x
myfun = u.*log(M0./(M0-mdot.*x))-g.*x-v;
Assignment of Numerical Analysis Parham Sagharichi Ha
u = 2510;
M0 = 2.8*10^6;
mdot = 13.3*10^3;
g = 9.81;
v = 335;
for i = 1:s(2);
y(i) = double(subs(myfun,[x],[xrange(i)]));
end
fa = y(1);
fb = y(end);
ymax = max(y);
ymin = min(y);
figure
plot(xrange,y)
grid on
hold on
plot([xlower xlower],[ymin ymax])
plot([xupper xupper],[ymin ymax])
plot([xlower xupper],[0 0])
iflag = 0;
iterations = 1 ;
f = double(subs(myfun,[x],xguess));
myfun_prime = jacobian(myfun,x);
fprime = double(subs(myfun_prime,[x],xguess));
xn = xguess;
xnew = xn - f/fprime;
plot([xn xn],[0 f])
pause
plot([xn xnew],[f 0])
while (abs(xnew-xn)>tolerance) & (iterations<30)
iterations = iterations + 1;
xn = xnew;
f = double(subs(myfun,[x],xn));
fprime = double(subs(myfun_prime,[x],xn));
xnew = xn - f/fprime;
root = xnew;
pause
plot([xn xn],[0 f])
pause
plot([xn xnew],[f 0])
end
Assignment of Numerical Analysis Parham Sagharichi Ha
switch iterations
case 30
disp(' Not root found ');
otherwise
disp([' Root = ' num2str(root) ...
' found in ' num2str(iterations) ' iterations
'])
end
%---------------F------I------N------I------S------H---------
-------------%
Result :
Root = 70.878 found in 5 iterations
4) Muellerโs Method :
Script :
clc
close all
clear all
%%
% Subject : Muellerโs Algorithm
% Author: Parham Sagharichi Ha Email :
%%
%-------------------S------T------A------R------T------------
-------------%
tolerance = 1e-4; % for example : 1e-4 = 10^-4
u = 2510;
M0 = 2.8*10^6;
mdot = 13.3*10^3;
g = 9.81;
v = 335;
xlower = 0;
xupper = 100;
Assignment of Numerical Analysis Parham Sagharichi Ha
xguess = 45;
if (xguess>xupper)||(xlower>xguess)
disp(' error , repate again ')
return
end
myfun = @(t)(u.*log(M0./(M0-mdot.*t))-g.*t-v);
x = [xlower xguess xupper]';%[x2 x0 x1]
xe = xlower:0.1:xupper;
ye = feval(myfun,xe);
ymax = max(ye);
ymin = min(ye);
figure
plot(xe,ye)
grid on
hold on
rline = plot([xlower xlower],[ymin ymax]);
mline = plot([xguess xguess],[ymin ymax]);
fline = plot([xupper xupper],[ymin ymax]);
pause
iterations = 0;
while (true)
iterations = iterations +1;
y = feval(myfun,x);%[f2 f0 f1]
h1 = x(3)-x(2);
h2 = x(2)-x(1);
gamma = h2/h1;
c = y(2);
a = (gamma*y(3)-y(2)*(1+gamma)+y(1))/(gamma*h1^2*(1+gamma));
b = (y(3)-y(2)-a*h1^2)/h1;
if b>0
root = x(2)-(2*c)/(b+sqrt(b^2-4*a*c));
else
root = x(2)-(2*c)/(b-sqrt(b^2-4*a*c));
end
pause
rootline = plot([root root],[ymin ymax]);
if root>x(2)
x = [x(2) root x(3)];
else
x = [x(1) root x(2)];
end
pause
delete(rootline)
delete(rline)
delete(mline)
delete(fline)
Assignment of Numerical Analysis Parham Sagharichi Ha
rline = plot([x(1) x(1)],[ymin ymax]);
mline = plot([x(2) x(2)],[ymin ymax]);
fline = plot([x(3) x(3)],[ymin ymax]);
if (abs(feval(myfun,root))<(10^-8))&(iterations<30)
break
end
end
switch iterations
case 30
disp(' Not root found ');
otherwise
disp([' Root = ' num2str(root) ...
' found in ' num2str(iterations) ' iterations
'])
end
Result :
Root = 70.878 found in 5 iterations
5) ๐ฅ = ๐(๐ฅ) Method :
๐ข ๐๐๐0
๐0 โ ๏ฟฝฬ๏ฟฝ๐กโ ๐๐ก โ ๐ฃ = 0
First Equation :
๐ก =๐ข
๐๐๐
๐0
๐0 โ ๏ฟฝฬ๏ฟฝ๐กโ
๐ฃ
๐
Second Equation :
๐ก =๐0
๏ฟฝฬ๏ฟฝ(exp (
๐๐ก + ๐ฃ๐ข ) โ 1
exp (๐๐ก + ๐ฃ
๐ข ))
Assignment of Numerical Analysis Parham Sagharichi Ha
Script :
clc
close all
clear all
%%
% Subject : x=g(x) Algorithm
% Author: Parham Sagharichi Ha Email :
%%
%-------------------S------T------A------R------T------------
-------------%
tolerance = 1e-4; % for example : 1e-4 = 10^-4
u = 2510;
M0 = 2.8*10^6;
mdot = 13.3*10^3;
g = 9.81;
v = 335;
xlower = 0;
xupper = 100;
xguess = 45;
if (xguess>xupper)||(xlower>xguess)
disp(' error , repate again ')
return
end
myfun1 = @(t)((u/g).*log(M0./(M0-mdot.*t))-v/g);
myfun2 = @(t)((M0/mdot).*(exp((g.*t+v)/u)-
1)./exp((g.*t+v)/u));
xold1 = xguess;
xnew1 = feval(myfun1,xold1);
iterations1 = 0;
while (abs(xnew1-xold1)>tolerance)&(iterations1<30)
iterations1 = iterations1 + 1;
xold1 = xnew1;
xnew1 = feval(myfun1,xold1);
Assignment of Numerical Analysis Parham Sagharichi Ha
end
root1 = xnew1(end);
switch iterations1
case 30
disp(' Not root found ');
otherwise
disp([' Root1 = ' num2str(root1) ...
' found in ' num2str(iterations1) ' iterations1
'])
end
xold2 = xguess;
xnew2 = feval(myfun2,xold2);
iterations2 = 0;
while (abs(xnew2-xold2)>tolerance)&(iterations2<30)
iterations2 = iterations2 + 1;
xold2 = xnew2;
xnew2 = feval(myfun2,xold2);
end
root2 = xnew2(end)
switch iterations2
case 30
disp(' Not root found ');
otherwise
disp([' Root2 = ' num2str(root2) ...
' found in ' num2str(iterations2) ' iterations2
'])
end
Result :
Not root found
root2 =
7.0878e+01
Root2 = 70.8779 found in 20 iterations2
References
Kiusalaas, J. (2009) Numerical Methods in Engineering with MATLABยฎ