Effacer les filtres
Effacer les filtres

How can I input values?

5 vues (au cours des 30 derniers jours)
Melchor
Melchor le 11 Mai 2023
syms x;
f = input('Type the function expression, f: ');
xi = input('Enter the initial estimate, x0: ');
tol = input('Tolerable error: ');
disp(' Results of Newton-Raphson Iteration')
disp('=================================================================')
fprintf('k\txi\t\txr\t\tf(xi)\t\tder(xi)\n');
i = 1000;
k = 1;
g = diff(f,x);
fa = eval(subs(f,x,xi));
while abs(fa)> tol
fa = eval(subs(f,x,xi));
ga = eval(subs(g,x,xi));
b = xi - fa/ga;
fprintf('%d\t%f\t%f\t%f\t%f\n',k,xi,b,fa,ga);
xi = b;
k = k + 1;
end
fprintf('Root is %f\n', xi);
f=@(x)exp(x)+23*x;
xint=[2 5];
tol=1e-6;
perf='max';
[iter,x,fval]=goldensection(f,xint,tol,perf)
-----------------------------
function [iter,root]=falsepos(f,x,tol)
format short g
if(f(x(1))*f(x(2)))>0
error('Your initial values are incorrect! Cannot find root within the interval.')
else
k=1;
xr=(x(1)+x(2))/2;
iter(1,1:7)=[k x xr f(x(1)) f(x(2)) f(xr)];
while(abs(iter(k,7))>tol)
k=k+1;
if (iter(k-1,7)*iter(k-1,5))<0
iter(k,3)=iter(k-1,4);
iter(k,6)=iter(k-1,7);
iter(k,2)=iter(k-1,2);
iter(k,5)=iter(k-1,5);
else
iter(k,2)=iter(k-1,4);
iter(k,5)=iter(k-1,7);
iter(k,3)=iter(k-1,3);
iter(k,6)=iter(k-1,6);
end
iter(k,4)=(iter(k,2)+iter(k,3))/2;
iter(k,7)=f(iter(k,4));
iter(k,1)=k;
end
root=iter(k,4);
end
end
f=@(x) exp(x)-3*x;
x=[0 1];
tol = 1e-5;
[iter,root]=falsepos(f,x,tol)
or (bisect)
k=1;
xr=(x(1)+x(2))/2;
iter(1,1:7)=[k x xr f(x(1)) f(x(2)) f(xr)];
while(abs(iter(k,7))>tol)
k=k+1;
if (iter(k-1,7)*iter(k-1,5))<0
iter(k,3)=iter(k-1,4);
iter(k,6)=iter(k-1,7);
iter(k,2)=iter(k-1,2);
iter(k,5)=iter(k-1,5);
else
iter(k,2)=iter(k-1,4);
iter(k,5)=iter(k-1,7);
iter(k,3)=iter(k-1,3);
iter(k,6)=iter(k-1,6);
end
iter(k,4)=(iter(k,2)+iter(k,3))/2;
iter(k,7)=f(iter(k,4));
iter(k,1)=k;
end
root=iter(k,4);
end
end
f=@(x) exp(x)-3*x;
x=[0 1];
tol = 1e-5;
[iter,root]=bisection(f,x,tol)
  2 commentaires
Walter Roberson
Walter Roberson le 11 Mai 2023
You show a function named falsepos but you call a function named goldensection ??
Walter Roberson
Walter Roberson le 11 Mai 2023
fa = eval(subs(f,x,xi));
You should never eval() the result of subs(). MATLAB has no documented meaning for eval() of a symbolic expression. You should either use vpa() or double() instead of eval(), depending what you are trying to do.

Connectez-vous pour commenter.

Réponses (1)

Sulaymon Eshkabilov
Sulaymon Eshkabilov le 11 Mai 2023
You code contains several crucial errors including wrong call of fcn, wrong placements of commands after the fcn file, wrong input variables and output variables, calling inexistance or not yet defined fcns (bisection), etc. Here is the corrected code (maybe still a few edits are necessary). It runs ok, computes the solutions and shows all iteration values. It can be tested with e.g.:
Input 1. ... f: @ @(x) exp(x)-3*x
Input 2. ... : [0, 1]
Input 3. ... : 1e-1
syms x;
f = input('Type the function expression, f: ');
xi = input('Enter the initial estimate, x0: ');
tol = input('Tolerable error: ');
disp(' Results of Newton-Raphson Iteration')
disp('=================================================================')
fprintf('k\txi\t\txr\t\tf(xi)\t\tder(xi)\n');
i = 1000;
k = 1;
g = diff(f,x);
fa = double(f(xi));
f=@(x)exp(x)-3*x;
x=[0 1];
tol = 1e-5;
[iter,root]=falsepos(f,x,tol)
f=@(x) exp(x)-3*x;
x=[0 1];
tol = 1e-5;
%[iter,root]=bisection(f,x,tol)
while abs(fa)> tol
fa = double(f(xi));
ga = double(subs(g,xi));
b = xi - fa/ga;
fprintf('%d\t%f\t%f\t%f\t%f\n',k,xi,b,fa,ga);
xi = b;
k = k + 1;
end
fprintf('Root is %f\n', xi);
xr=(x(1)+x(2))/2;
iter(1,1:7)=[k x xr f(x(1)) f(x(2)) f(xr)];
k=1;
while(abs(iter(k,7))>tol)
k=k+1;
if (iter(k-1,7)*iter(k-1,5))<0
iter(k,3)=iter(k-1,4);
iter(k,6)=iter(k-1,7);
iter(k,2)=iter(k-1,2);
iter(k,5)=iter(k-1,5);
else
iter(k,2)=iter(k-1,4);
iter(k,5)=iter(k-1,7);
iter(k,3)=iter(k-1,3);
iter(k,6)=iter(k-1,6);
end
iter(k,4)=(iter(k,2)+iter(k,3))/2;
iter(k,7)=f(iter(k,4));
iter(k,1)=k;
end
root=iter(k,4);
f=@(x)exp(x)+23*x;
xint=[2 5];
tol=1e-6;
perf='max';
[iter,x]=falsepos(f,xint,tol)
%-----------------------------
function [iter,root]=falsepos(f,x,tol)
format short g
if(f(x(1))*f(x(2)))>0
error('Your initial values are incorrect! Cannot find root within the interval.')
else
k=1;
xr=(x(1)+x(2))/2;
iter(1,1:7)=[k x xr f(x(1)) f(x(2)) f(xr)];
while(abs(iter(k,7))>tol)
k=k+1;
if (iter(k-1,7)*iter(k-1,5))<0
iter(k,3)=iter(k-1,4);
iter(k,6)=iter(k-1,7);
iter(k,2)=iter(k-1,2);
iter(k,5)=iter(k-1,5);
else
iter(k,2)=iter(k-1,4);
iter(k,5)=iter(k-1,7);
iter(k,3)=iter(k-1,3);
iter(k,6)=iter(k-1,6);
end
iter(k,4)=(iter(k,2)+iter(k,3))/2;
iter(k,7)=f(iter(k,4));
iter(k,1)=k;
end
root=iter(k,4);
end
end

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by