why is my ea not being recognized?
古いコメントを表示
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')
採用された回答
その他の回答 (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
2023 年 2 月 8 日
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 件のコメント
Walter Roberson
2023 年 2 月 8 日
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
2023 年 2 月 8 日
Walter Roberson
2023 年 2 月 8 日
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
カテゴリ
ヘルプ センター および File Exchange で Loops and Conditional Statements についてさらに検索
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!

