why is my ea not being recognized?
Mostrar comentarios más antiguos
clc; clear all;
L = 1.25; E = 50000; I = 30000; w0 = 2.5;
syms x
f(x) = (w0/(120*E*I*L))*(-x^5+2*(L^2)*(x^3)-(L^4)*x);
df = diff(f,x);
true = df(2);
roots = solve(f==0, x);
true_roots = double(roots);
xl = 200;
xu = 300;
xr = (xl + xu) / 2;
es = 0.001;
xr_new(1) = xr;
if f(xl) * f(xu) < 0
disp('The function changes sign within this bound')
for i = 1:100
val(i) = f(xl) * f(xr_new(i));
if val(i) < 0
disp('The root lies in the lower interval')
xu = xr_new(i);
elseif val(i) > 0
disp('The root lies in the upper interval')
xl = xr_new(i);
else val = 0;
fprintf('The approximate root of the function is %1.2f \n',xr_new(i))
break
end
xr_new(i+1) = (xl + xu) / 2;
ea = abs((xr_new(i+1) - xr_new(i))./xr_new(i+1));
if ea < es
break
end
end
else
disp('The function does not change sign within this bound')
end
% Print the results
ea = ea*100;
fprintf('The absolute approximate error is: %1.5f \n',ea)
n_iterations = i+1;
fprintf('The total number of iterations are: %d \n',n_iterations)
root = xr_new(1,end);
fprintf('The approximate root of the function is: %1.5f \n', root)
x1 = -1000 : 1000;
y1 = f(x1);
y = double(y1);
xmin = -1000; xmax = 1000; ymin = -0.5; ymax = 0.5;
plot(x1, y1)
hold on
plot(true_root,0,'mo','MarkerFaceColor','m')
set(gca,'XAxisLocation','origin','YAxisLocation','origin','XMinorTick','on')
xlabel('x \rightarrow')
ylabel('\uparrow f(x)')
title('Graphical root')
Respuesta aceptada
Más respuestas (2)
ea is not defined because f(xl) * f(xu) >= 0
L = 1.25; E = 50000; I = 30000; w0 = 2.5;
syms x
f(x) = (w0/(120*E*I*L))*(-x^5+2*(L^2)*(x^3)-(L^4)*x);
xl = 200;
xu = 300;
f(xl) * f(xu)
so the code inside "if f(xl) * f(xu) < 0" does not execute; only the code inside the "else" block executes.
Note the displayed message: "The function does not change sign within this bound"
Walter Roberson
el 8 de Feb. de 2023
if f(xl) * f(xu) < 0
In the case where that does not hold true, the for loop is never entered and ea is never assigned to.
Notice you get the output message "The function does not change sign within this bound"
3 comentarios
Walter Roberson
el 8 de Feb. de 2023
the true_roots shows you that the actual zeros are contained within [-2 2], no-where near the 200 to 300 you are searching.
Clinton Mitchell
el 8 de Feb. de 2023
Walter Roberson
el 8 de Feb. de 2023
Change
else
disp('The function does not change sign within this bound')
end
to
else
disp('The function does not change sign within this bound')
ea = inf;
end
Categorías
Más información sobre Equation Solving en Centro de ayuda y File Exchange.
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!

