why is my ea not being recognized?
Ältere Kommentare anzeigen
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')
Akzeptierte Antwort
Weitere Antworten (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
am 8 Feb. 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 Kommentare
Walter Roberson
am 8 Feb. 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
am 8 Feb. 2023
Walter Roberson
am 8 Feb. 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
Kategorien
Mehr zu Equation Solving finden Sie in Hilfe-Center und File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!

