Filter löschen
Filter löschen

Bisection method relative error

2 Ansichten (letzte 30 Tage)
Sazcl
Sazcl am 17 Mär. 2022
Kommentiert: Jan am 2 Aug. 2023
Hello everyone, I don't use MATLAB very well. I have a question. If you can help, I'd appreciate.
I have a function below that I have to find its roots using bisection method. I want the for loop to stop on the point where relative error is lower than %0.05. I couldn't understand how I can define n.
f=@(x) log(x)-cos(x)-exp(-x);
x1=1;
x2=2;
xmid=(x1+x2)/2
for i=1:n;
if (f(xmid)*f(x2))<0
x1=xmid;
else
x2=xmid;
end
xmid=(x1+x2)/2;
end
fprintf('The root is: %3.8g\n',xmid)

Akzeptierte Antwort

Mohammed Hamaidi
Mohammed Hamaidi am 17 Mär. 2022
Bearbeitet: Mohammed Hamaidi am 18 Mär. 2022
Hi
Just use "while" loop with your condition as follows:
f=@(x) log(x)-cos(x)-exp(-x);
x1=1;
x2=2;
xmid=(x1+x2)/2;
while (x2-x1)>0.0005
if (f(xmid)*f(x2))<0
x1=xmid;
else
x2=xmid;
end
xmid=(x1+x2)/2;
end
fprintf('The root is: %3.8g\n',xmid)
  4 Kommentare
Sazcl
Sazcl am 17 Mär. 2022
It really helped, I got it done.
Thank you both.
Jan
Jan am 18 Mär. 2022
If this answer solves the problem, please accept it.

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (1)

John
John am 31 Jul. 2023
function [p, pN] = Bisection_371(a,b,N, tol)
if f(a)*f(b) > 0
disp("IVT does not guarantee a root in [a,b]")
elseif f(a)*f(b) == 0
disp("The root is either a or b")
else
for n = 1:N
p = (a+b)/2;
pN(n) = p;
if f(p) == 0 || (b-a)/2 < tol
break
elseif f(p)*f(a) < 0
b = p;
else
a = p;
end
end
end
end
%f = @(x)x^2 - 1;
function y = f(x)
y = x^2 - 1;
end
  1 Kommentar
Jan
Jan am 2 Aug. 2023
For numerical reasons it is rather unlikely that the condiotion f(p) == 0 is met exactly. Use a tolerance instead.

Melden Sie sich an, um zu kommentieren.

Kategorien

Mehr zu Loops and Conditional Statements finden Sie in Help Center und File Exchange

Tags

Produkte

Community Treasure Hunt

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

Start Hunting!

Translated by