How can I input values?

2 visualizaciones (últimos 30 días)
Melchor
Melchor el 11 de Mayo de 2023
Respondida: Sulaymon Eshkabilov el 11 de Mayo de 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 comentarios
Walter Roberson
Walter Roberson el 11 de Mayo de 2023
You show a function named falsepos but you call a function named goldensection ??
Walter Roberson
Walter Roberson el 11 de Mayo de 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.

Iniciar sesión para comentar.

Respuestas (1)

Sulaymon Eshkabilov
Sulaymon Eshkabilov el 11 de Mayo de 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

Etiquetas

Community Treasure Hunt

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

Start Hunting!

Translated by