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에서 Equation Solving에 대해 자세히 알아보기
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!

