Bisection Method Code MATLAB

2,318 views (last 30 days)
Emmanuel Pardo-Cerezo
Emmanuel Pardo-Cerezo on 4 Oct 2019
Edited: Walter Roberson on 17 May 2023 at 17:16
Problem 4 Find an approximation to (sqrt 3) correct to within 10−4 using the Bisection method (Hint: Consider f(x) = x 2 − 3.) (Use your computer code)
I have no idea how to write this code. he gave us this template but is not working. If you run the program it prints a table but it keeps running. for some reason the program doesnt stop.
tol = 1.e-10;
a = 1.0;
b = 2.0;
nmax = 100;
% Initialization
itcount = 0;
error = 1.0;
% Graph of the function
xval = linspace(a,b,100);
for i=1:100
fval(i) = func(xval(i));
end
plot(xval,fval);
grid on;
hold on;
% iteration begins here
while (itcount <= nmax && error >= tol)
itcount = itcount + 1;
% Generate and save iteratres
x = a + (b-a)/2;
z(itcount) = x;
fa = func(a);
fb = func(b);
fx = func(x);
error = abs(fx);
% error = abs(x - xold);
if (error < tol)
x_final = x;
else
if (fa*fx < 0)
% root is between a and x
b = x;
else
% root is between x and b
a = x;
end
end
plot(z(1:itcount),zeros(itcount,1),'r+');
pause(5)
end
if (itcount < nmax);
val = func(x);
fprintf(1,'Converged solution after %5d iterations',itcount);
fprintf(1,' is %15.7e, %e \n',x_final, val);
else fprintf(1,'Not converged after %5d iterations',nmax);
end
function val = func(x)
%val = x^3 + 4 * x^2 - 10;
val = x^3 - x - 3;
%val = sin(x);
end
  2 Comments
Aristi Christoforou
Aristi Christoforou on 14 Apr 2021
function[x]=bisect(m)
a=1;
b=3;
k=0;
while b-a>eps*b
x=(a+b)/2
if x^2>m
b=x
else
a=x
end
k=k+1
end

Sign in to comment.

Answers (5)

David Hill
David Hill on 4 Oct 2019
function c = bisectionMethod(f,a,b,error)%f=@(x)x^2-3; a=1; b=2; (ensure change of sign between a and b) error=1e-4
c=(a+b)/2;
while abs(f(c))>error
if f(c)<0&&f(a)<0
a=c;
else
b=c;
end
c=(a+b)/2;
end
Not much to the bisection method, you just keep half-splitting until you get the root to the accuracy you desire. Enter function above after setting the function.
f=@(x)x^2-3;
root=bisectionMethod(f,1,2);
  1 Comment
Justin Vaughn
Justin Vaughn on 10 Oct 2022
Thank you for this because I was not sure of how to easily send a functino into my method's function. yours helped tremendously!

Sign in to comment.


Prathamesh Purkar
Prathamesh Purkar on 6 Jun 2021
Edited: Walter Roberson on 3 Dec 2021
tol = 1.e-10;
a = 1.0;
b = 2.0;
nmax = 100;
% Initialization
itcount = 0;
error = 1.0;
% Graph of the function
xval = linspace(a,b,100);
for i=1:100
fval(i) = func(xval(i));
end
plot(xval,fval);
grid on;
hold on;
% iteration begins here
while (itcount <= nmax && error >= tol)
itcount = itcount + 1;
% Generate and save iteratres
x = a + (b-a)/2;
z(itcount) = x;
fa = func(a);
fb = func(b);
fx = func(x);
error = abs(fx);
% error = abs(x - xold);
if (error < tol)
x_final = x;
else
if (fa*fx < 0)
% root is between a and x
b = x;
else
% root is between x and b
a = x;
end
end
plot(z(1:itcount),zeros(itcount,1),'r+');
pause(5)
end
if (itcount < nmax);
val = func(x);
fprintf(1,'Converged solution after %5d iterations',itcount);
fprintf(1,' is %15.7e, %e \n',x_final, val);
else
fprintf(1,'Not converged after %5d iterations',nmax);
end
function val = func(x)
%val = x^3 -x + 1;
val = x^3 -x + 1;
%val = sin(x);
end

narendran
narendran on 2 Jul 2022
This answer was flagged by Image Analyst
5cosx + 4.5572 -cos30cosx-ssin30sinx
  2 Comments
Walter Roberson
Walter Roberson on 2 Jul 2022
syms x
y = 5*cos(x) + 4.5572 - cos(30)*cos(x)-sin(30)*sin(x)
y = 
fplot(y, [-20 20]); yline(0)
vpasolve(y,x)
ans = 

Sign in to comment.


SHUBHAM GHADOJE
SHUBHAM GHADOJE on 29 May 2021
function c = bisectionMethod(f,j,k,error)%f=@(x)x^2-3; j=1; k=2; (ensure change of sign between a and b) error=1e-4
c=(j+k)/2;
while abs(f(c))>error
if f(c)<0&&f(a)<0
j=c;
else
k=c;
end
c=(j+k)/2;
end

Aman Pratap Singh
Aman Pratap Singh on 3 Dec 2021
Edited: Walter Roberson on 3 Dec 2021
f = @(x)('x^3-2x-5');
a = 2;
b = 3;
eps = 0.001;
m = (a+b)/2;
fprintf('\nThe value of, after bisection method, m is %f\n', m);
while abs(b-a)>eps
if (f(a)*f(m))<0
b=m;
else
a=m;
end
m = (a+b)/2;
end
fprintf('\nThe value of, after bisection method, m is %f\n', m);
  1 Comment
Walter Roberson
Walter Roberson on 3 Dec 2021
f = @(x)('x^3-2x-5');
That means that f will become a function handle that, given any input, will return the character vector ['x', '^', '3', '-', '2', 'x', '-', '5'] which is unlikely to be what you want to have happen.
f(0)
ans = 'x^3-2x-5'
f(1)
ans = 'x^3-2x-5'
f(rand(1,20))
ans = 'x^3-2x-5'

Sign in to comment.

Categories

Find more on Entering Commands in Help Center and File Exchange

Community Treasure Hunt

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

Start Hunting!