How to Implement the Bisection Root-Finding Method in MATLAB?

  • Thread starter Thread starter dillonmhudson
  • Start date Start date
  • Tags Tags
    Function Matlab
Click For Summary
SUMMARY

The forum discussion focuses on implementing the Bisection Root-Finding Method in MATLAB, specifically through a function named bisection. The function accepts a function handle, lower and upper bounds, maximum acceptable error, and maximum iterations as inputs. Key issues addressed include the proper handling of NaN values using isnan and correcting logical conditions in the code to avoid erroneous exit flags. The final solution successfully locates roots of functions defined within specified bounds.

PREREQUISITES
  • Understanding of MATLAB programming and syntax
  • Familiarity with numerical methods, specifically root-finding techniques
  • Knowledge of function handles in MATLAB
  • Basic concepts of error handling and iteration control in algorithms
NEXT STEPS
  • Explore MATLAB's isnan function for robust error checking
  • Learn about MATLAB function handles and their applications in numerical methods
  • Investigate other root-finding methods such as Newton-Raphson and Secant Method
  • Study MATLAB's debugging tools to troubleshoot and optimize code
USEFUL FOR

Students, educators, and professionals in mathematics, engineering, and computer science who are implementing numerical methods in MATLAB for root-finding problems.

dillonmhudson
Messages
47
Reaction score
0

Homework Statement


Create and test a MATLAB function called bisection that implements the bisection root finding method. You will have to use a function handle and exit flag coding.

Homework Equations


-

The Attempt at a Solution



Code:
% bisection.m

function [root, err, iter, exitFlag] = bisection (fun, lb, ub, errMax, iterMax)

% This function performs the bisection algorithm on a function to
% locate a root of the function (location where it crosses zero). The
% function must be of a single variable and must return a scalar result
% (i.e., a scalar function of a scalar argument). 
% 
% The approximation loop is controlled by three termination criteria:
%  - estimate of the approximation error is less than errTol
%  - number of iterations is greater than iterMax
%  - function value magnitude is less than funTol
%
% The initial bracket controls the search. The initial bracket must be
% defined such that the sign of the function is opposite at each end of the
% bracket (to ensure a zero crossing exists between the two. THERE IS NO
% ERROR CHECKING for this in the current code.
%
% Inputs:  @fun = function that is the subject of the root-finding
%          lb = lower bound of the bisection search bracket
%          ub = upper bound of the bisection search bracket
%          errMax = maximum acceptable relative approximation error
%          iterMax = maximum number of iterations
%
% Outputs: root = approximation of root location
%          err = relative approximation error of solution
%          iter = number of iterations taken to find the solution
%          exitFlag = indicates termination status of function
% 
% Exit Flag Encoding: 1: Alrogithm terminated normally (due to error being
%                        sufficiently small)
%                     0: Alrogithm terminated due to maximum number of
%                        iterations being reached
%                    -1: Algorithm terminated due to invalid bracket 
%                        specification (no root in bracket)
%                    -2: Algorithm terminated due to invalid return value
%                        from function fun (e.g., NaN, Inf, empty brakets)

%%%%%%%%%%%%%%%%%%%%%%%%%%
% GENERAL INITIALIZATION %
%%%%%%%%%%%%%%%%%%%%%%%%%%
iter = 0;       % iteration counter variable
done = false;   % Boolean variable to control looping
root = (ub+lb)/2; % initial approximation of root location 
err = 100*abs([ub-lb]/[ub+lb]); % estimate of error

if fun(lb)*fun(ub)>0
    exitFlag = -1;
    error('invalid bracket: exitFlag = %g\n',exitFlag);

elseif fun(root)+errMax>0 && fun(root)-errMax<0;
    exitFlag = 1;
    err = 100*abs([ub-lb]/[ub+lb]); % estimate of error
    done=true;
        
elseif fun(lb)+errMax>0 && fun(lb)-errMax<0;
    exitFlag = 1;
    err = 100*abs([ub-lb]/[ub+lb]); % estimate of error
    root=lb;
    done=true;
        
elseif fun(ub)+errMax>0 && fun(ub)-errMax<0;
    exitFlag = 1;
    err = 100*abs([ub-lb]/[ub+lb]); % estimate of error
    root=ub;
    done=true;

elseif fun(lb)==NaN || Inf || -Inf || isempty(lb);
    exitFlag = -2;
    error('invalid lower bound: exitFlag = %g\n',exitFlag);
    done = true;

elseif fun(ub)==NaN || Inf || -Inf || isempty(ub);
    exitFlag = -2;
    error('invalid upper bound: exitFlag = %g\n',exitFlag);
    done = true;

else
    return;
     
end

%%%%%%%%%%%%%%%%%%%%%%
% MAIN ITERATION LOOP
%%%
while ~done
    
    iter = iter+1;      % increment iteration counter
    
        % determine which way to go with next bracket
    if fun(lb)*fun(root)<0
        ub = root;
    else
        lb = root;
    end
    
    % update approximation of root location based on new bracket
    root = (ub+lb)/2;     
    
    err = 100*abs([ub-lb]/[ub+lb]); % estimate of error
        
    % loop control -- check for termination criteria
    if err<errMax
        exitFlag = 1;
        done = true;
    elseif iter >= iterMax
        exitFlag = 0;
               
        % if the next line executes, it means at least one of the
        % termination criteria was true
        done = true;    
    end

end

Example of function call:
Code:
[root, err, iter, exitFlag] = bisection (@(x)x^3-3*x,-4,2,.0001, 1000)
My problem with the code is that the error flag -2 keeps popping up when I am trying to find a root
 
Physics news on Phys.org
Two things: first, Doing fun(lb)==NaN doesn't work. Try it out, NaN==NaN returns 0, not 1. There's a function isnan that you should use instead,
isnan(fun(lb))

Second, you have a serious parenthesis problem. fun(lb)==NaN || Inf doesn't do (fun(lb)==NaN)||(fun(lb)==Inf), it does (fun(lb)==NaN) || Inf and Inf counts as true so your program always takes that part of the if statement and runs it
 
Ok, thanks that helps. Between you and a TA I got it to work so thank you!
 

Similar threads

  • · Replies 1 ·
Replies
1
Views
6K
  • · Replies 2 ·
Replies
2
Views
2K
  • · Replies 2 ·
Replies
2
Views
3K
  • · Replies 1 ·
Replies
1
Views
3K
Replies
4
Views
2K
Replies
2
Views
3K
  • · Replies 4 ·
Replies
4
Views
24K
Replies
7
Views
9K
  • · Replies 1 ·
Replies
1
Views
4K
  • · Replies 6 ·
Replies
6
Views
3K