why is my ea not being recognized?

Clinton Mitchell · Sep 8, 2023 · 1.9K views
Question
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 The function does not change sign within this bound % Print the results ea = ea*100; Unrecognized function or variable 'ea'. 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')  
Expert Answer
Profile picture of Prashant Kumar
Prashant Kumar PhD Expert
Answered Aug 26, 2026
There are a few inconsistencies.
 
(1) The simulation in [for ... end] loop never reached due to if condition f(xl)*f(xu) <0. The actual values of f(xl)*f(xu) were in sym and greater than 0. Therefore, by changing it to double and the if condition (f(xl)*f(xu)>), you will get the simulation results.
 
(2) The found true roots were in sym.
 
(3) Similarly, y1 = f(x1) was in sym that need to be numerical. Thus, double() is needed.
 
(4) if val = 0 is not correct that must be val == 0.
 
(5) It is better (must be) to use fplot() instead of plot to plot actual faction. By this way tru solutions can be shown explicitly - see figure (2).
 
Here is the corrected code:
 
 
clc; clearvars;
L = 1.25; E = 50000; I = 30000; w0 = 2.5;
syms f(x)
f(x) = (w0/(120*E*I*L))*(-x^5+2*(L^2)*(x^3)-(L^4)*x);
df = diff(f,x); 
true = double(df(2)); 
roots = vpasolve(f==0, x);
true_roots =double(roots(:));
xl = 200;
xu = 300;
xr = (xl + xu) / 2;
es = 0.001;
xr_new(1) = xr;
if double(f(xl)) * double(f(xu)) >0
    disp('The function changes sign within this bound')
    for i = 1:100
        val(i) = double(f(xl)) * double(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
The function changes sign within this bound
The root lies in the upper interval
The root lies in the upper interval
The root lies in the upper interval
The root lies in the upper interval
The root lies in the upper interval
The root lies in the upper interval
The root lies in the upper interval
The root lies in the upper interval
% Print the results
ea = ea*100;
fprintf('The absolute approximate error is: %1.5f \n',ea)
The absolute approximate error is: 0.06515 
n_iterations = i+1;
fprintf('The total number of iterations are: %d \n',n_iterations)
The total number of iterations are: 9 
root = xr_new(1,end);
fprintf('The approximate root of the function is: %1.5f \n', root)
The approximate root of the function is: 299.80469 
x1 = -1000 : 1000;
y1 = double(f(x1));
xmin = -1000; xmax = 1000; ymin = -0.5; ymax = 0.5;
figure(1)
plot(x1, y1)
hold on
plot(true_roots,0,'mo','MarkerFaceColor','m')
set(gca,'XAxisLocation','origin','YAxisLocation','origin','XMinorTick','on')
xlabel('x \rightarrow')
ylabel('\uparrow f(x)')
title('Graphical root')
hold off

 

figure(2)
Fun = @(x) (w0/(120*E*I*L))*(-x.^5+2*(L^2)*(x.^3)-(L^4)*x);
fplot(Fun, [-1.5, 1.5], 'kx-')
hold on
plot(true_roots,0,'mo','MarkerFaceColor','m')
set(gca,'XAxisLocation','origin','YAxisLocation','origin','XMinorTick','on')
xlabel('x \rightarrow')
ylabel('\uparrow f(x)')
title('Graphical root')

 

100% Run Guarantee 3-Hour Fast-Track Delivery

Need a Custom Version or Complete Simulation for This Problem?

Our 500+ PhD engineers build, debug, and optimize working MATLAB scripts and Simulink (.slx) models tailored to your exact assignment rubrics with zero plagiarism.

Tested on MATLAB R2024b / R2026a
Turnitin 0% Plagiarism Report
Free 7-Day Revisions Guarantee
Have a different question? Ask here

Get a Free Consultation or a Sample Assignment Review!