Regula-falsi Method that keeps running

11 vues (au cours des 30 derniers jours)
BG
BG le 19 Mar 2023
Commenté : BG le 19 Mar 2023
I have this script for Regula-Falsi Method to get a root of a function but it just keeps running. Anyone can help find what's wrong?
f = @(x) 2.^x - x.^2 - 2; % Function whose roots are desired
xL = 4; xU = 5; % Initial guesses
Tol = 1e-6; % Tolerance (0.000001)
c = 0; % Counter for the no. of iterations
while abs( xU-xL ) > Tol
c = c + 1
xm = xU-f(xU)* (xU-xL)/f(xU)- f(xL); % Compute xm
fm = f(xm); % Evaluate the function at x = xm
% % Print the intermediate results
fprintf('Iteration: %d\t',c);
fprintf ('[xL,xU,xm ] = [%.6f, %.6f, %.6f]\n', xL,xU,xm);
if f(xL ) *fm < 0 % If the root is on the left,
xU = xm ; % then set xm as the new xU.
elseif fm * f( xU ) < 0 % But if the root is on the
xL = xm ; % then set xm as the new xL.
else
break; % Stop! xm is exactly the root
end
end
plot(xm,f(xm),'r*', 'Markersize', 10); % plot the xm points
fprintf ('The root is: %.6f \n', xm);

Réponse acceptée

Alan Stevens
Alan Stevens le 19 Mar 2023
Brackets!!
f = @(x) 2.^x - x.^2 - 2; % Function whose roots are desired
xL = 4; xU = 5; % Initial guesses
Tol = 1e-6; % Tolerance (0.000001)
c = 0; % Counter for the no. of iterations
while abs( xU-xL ) > Tol
c = c + 1;
xm = xU-f(xU)* (xU-xL)/(f(xU)- f(xL)); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% Put brackets round f(xU)-f(xL)
fm = f(xm); % Evaluate the function at x = xm
% % Print the intermediate results
fprintf('Iteration: %d\t',c);
fprintf ('[xL,xU,xm ] = [%.6f, %.6f, %.6f]\n', xL,xU,xm);
if f(xL ) *fm < 0 % If the root is on the left,
xU = xm ; % then set xm as the new xU.
elseif fm * f( xU ) < 0 % But if the root is on the
xL = xm ; % then set xm as the new xL.
else
break; % Stop! xm is exactly the root
end
end
Iteration: 1
[xL,xU,xm ] = [4.000000, 5.000000, 4.285714]
Iteration: 2
[xL,xU,xm ] = [4.285714, 5.000000, 4.390866]
Iteration: 3
[xL,xU,xm ] = [4.390866, 5.000000, 4.425434]
Iteration: 4
[xL,xU,xm ] = [4.425434, 5.000000, 4.436351]
Iteration: 5
[xL,xU,xm ] = [4.436351, 5.000000, 4.439754]
Iteration: 6
[xL,xU,xm ] = [4.439754, 5.000000, 4.440811]
Iteration: 7
[xL,xU,xm ] = [4.440811, 5.000000, 4.441138]
Iteration: 8
[xL,xU,xm ] = [4.441138, 5.000000, 4.441240]
Iteration: 9
[xL,xU,xm ] = [4.441240, 5.000000, 4.441271]
Iteration: 10
[xL,xU,xm ] = [4.441271, 5.000000, 4.441281]
Iteration: 11
[xL,xU,xm ] = [4.441281, 5.000000, 4.441284]
Iteration: 12
[xL,xU,xm ] = [4.441284, 5.000000, 4.441285]
Iteration: 13
[xL,xU,xm ] = [4.441285, 5.000000, 4.441285]
Iteration: 14
[xL,xU,xm ] = [4.441285, 5.000000, 4.441285]
Iteration: 15
[xL,xU,xm ] = [4.441285, 5.000000, 4.441285]
Iteration: 16
[xL,xU,xm ] = [4.441285, 5.000000, 4.441285]
Iteration: 17
[xL,xU,xm ] = [4.441285, 5.000000, 4.441285]
Iteration: 18
[xL,xU,xm ] = [4.441285, 5.000000, 4.441285]
Iteration: 19
[xL,xU,xm ] = [4.441285, 5.000000, 4.441285]
Iteration: 20
[xL,xU,xm ] = [4.441285, 5.000000, 4.441285]
Iteration: 21
[xL,xU,xm ] = [4.441285, 5.000000, 4.441285]
Iteration: 22
[xL,xU,xm ] = [4.441285, 5.000000, 4.441285]
Iteration: 23
[xL,xU,xm ] = [4.441285, 5.000000, 4.441285]
Iteration: 24
[xL,xU,xm ] = [4.441285, 5.000000, 4.441285]
Iteration: 25
[xL,xU,xm ] = [4.441285, 5.000000, 4.441285]
Iteration: 26
[xL,xU,xm ] = [4.441285, 5.000000, 4.441285]
Iteration: 27
[xL,xU,xm ] = [4.441285, 5.000000, 4.441285]
Iteration: 28
[xL,xU,xm ] = [4.441285, 5.000000, 4.441285]
Iteration: 29
[xL,xU,xm ] = [4.441285, 5.000000, 4.441285]
Iteration: 30
[xL,xU,xm ] = [4.441285, 5.000000, 4.441285]
plot(xm,f(xm),'r*', 'Markersize', 10); % plot the xm points
fprintf ('The root is: %.6f \n', xm);
The root is: 4.441285
  1 commentaire
BG
BG le 19 Mar 2023
Thank you so much. I didn't see that.

Connectez-vous pour commenter.

Plus de réponses (0)

Catégories

En savoir plus sur Dialog Boxes dans Help Center et File Exchange

Produits


Version

R2022b

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by