Program for Bisection Method
Last Updated :
20 Sep, 2022
Given a function f(x) on floating number x and two numbers ‘a’ and ‘b’ such that f(a)*f(b) < 0 and f(x) is continuous in [a, b]. Here f(x) represents algebraic or transcendental equation. Find root of function in interval [a, b] (Or find a value of x such that f(x) is 0).
Example:
Input: A function of x, for example x3 - x2 + 2.
And two values: a = -200 and b = 300 such that
f(a)*f(b) < 0, i.e., f(a) and f(b) have
opposite signs.
Output: The value of root is : -1.0025
OR any other value with allowed
deviation from root.
What are Algebraic and Transcendental functions?
Algebraic function are the one which can be represented in the form of polynomials like f(x) = a1x3 + a2x2 + ….. + e where aa1, a2, … are constants and x is a variable.
Transcendental function are non algebraic functions, for example f(x) = sin(x)*x – 3 or f(x) = ex + x2 or f(x) = ln(x) + x ….
What is Bisection Method?
The method is also called the interval halving method, the binary search method or the dichotomy method. This method is used to find root of an equation in a given interval that is value of ‘x’ for which f(x) = 0 .
The method is based on The Intermediate Value Theorem which states that if f(x) is a continuous function and there are two real numbers a and b such that f(a)*f(b) 0 and f(b) < 0), then it is guaranteed that it has at least one root between them.
Assumptions:
- f(x) is a continuous function in interval [a, b]
- f(a) * f(b) < 0
Steps:
- Find middle point c= (a + b)/2 .
- If f(c) == 0, then c is the root of the solution.
- Else f(c) != 0
- If value f(a)*f(c) < 0 then root lies between a and c. So we recur for a and c
- Else If f(b)*f(c) < 0 then root lies between b and c. So we recur b and c.
- Else given function doesn’t follow one of assumptions.
Since root may be a floating point number, we repeat above steps while difference between a and b is greater than and equal to a value ? (A very small value).
Below is implementation of above steps.
C++
#include<bits/stdc++.h>
using namespace std;
#define EPSILON 0.01
double func( double x)
{
return x*x*x - x*x + 2;
}
void bisection( double a, double b)
{
if (func(a) * func(b) >= 0)
{
cout << "You have not assumed right a and b\n" ;
return ;
}
double c = a;
while ((b-a) >= EPSILON)
{
c = (a+b)/2;
if (func(c) == 0.0)
break ;
else if (func(c)*func(a) < 0)
b = c;
else
a = c;
}
cout << "The value of root is : " << c;
}
int main()
{
double a =-200, b = 300;
bisection(a, b);
return 0;
}
|
Java
class GFG{
static final float EPSILON = ( float ) 0.01 ;
static double func( double x)
{
return x*x*x - x*x + 2 ;
}
static void bisection( double a, double b)
{
if (func(a) * func(b) >= 0 )
{
System.out.println( "You have not assumed"
+ " right a and b" );
return ;
}
double c = a;
while ((b-a) >= EPSILON)
{
c = (a+b)/ 2 ;
if (func(c) == 0.0 )
break ;
else if (func(c)*func(a) < 0 )
b = c;
else
a = c;
}
System.out.printf( "The value of root is : %.4f"
,c);
}
public static void main(String[] args)
{
double a =- 200 , b = 300 ;
bisection(a, b);
}
}
|
Python3
def func(x):
return x * x * x - x * x + 2
def bisection(a,b):
if (func(a) * func(b) > = 0 ):
print ( "You have not assumed right a and b\n" )
return
c = a
while ((b - a) > = 0.01 ):
c = (a + b) / 2
if (func(c) = = 0.0 ):
break
if (func(c) * func(a) < 0 ):
b = c
else :
a = c
print ( "The value of root is : " , "%.4f" % c)
a = - 200
b = 300
bisection(a, b)
|
C#
using System;
class GFG
{
static float EPSILON = ( float )0.01;
static double func( double x)
{
return x * x * x -
x * x + 2;
}
static void bisection( double a,
double b)
{
if (func(a) * func(b) >= 0)
{
Console.WriteLine( "You have not assumed" +
" right a and b" );
return ;
}
double c = a;
while ((b - a) >= EPSILON)
{
c = (a + b) / 2;
if (func(c) == 0.0)
break ;
else if (func(c) * func(a) < 0)
b = c;
else
a = c;
}
Console.WriteLine( "The value of " +
"root is : " + c);
}
static public void Main ()
{
double a = -200, b = 300;
bisection(a, b);
}
}
|
PHP
<?php
$EPSILON = 0.01;
function func( $x )
{
return $x * $x * $x -
$x * $x + 2;
}
function bisection( $a , $b )
{
global $EPSILON ;
if (func( $a ) *
func( $b ) >= 0)
{
echo "You have not assumed " .
"right a and b" , "\n" ;
return ;
}
$c = $a ;
while (( $b - $a ) >= $EPSILON )
{
$c = ( $a + $b ) / 2;
if (func( $c ) == 0.0)
break ;
else if (func( $c ) * func( $a ) < 0)
$b = $c ;
else
$a = $c ;
}
echo "The value of root is : " , $c ;
}
$a =-200;
$b = 300;
bisection( $a , $b );
?>
|
Javascript
<script>
let EPSILON = 0.01;
function func(x)
{
return x*x*x - x*x + 2;
}
function bisection(a, b)
{
if (func(a) * func(b) >= 0)
{
document.write( "You have not assumed"
+ " right a and b" );
return ;
}
let c = a;
while ((b-a) >= EPSILON)
{
c = (a+b)/2;
if (func(c) == 0.0)
break ;
else if (func(c)*func(a) < 0)
b = c;
else
a = c;
}
document.write( "The value of " +
"root is : " + c.toFixed(4));
}
let a =-200, b = 300;
bisection(a, b);
</script>
|
Output:
The value of root is : -1.0025
Time complexity :- Time complexity of this method depends on the assumed values and the function.
What are pros and cons?
Advantage of the bisection method is that it is guaranteed to be converged. Disadvantage of bisection method is that it cannot detect multiple roots.
In general, Bisection method is used to get an initial rough approximation of solution. Then faster converging methods are used to find the solution.
We will soon be discussing other methods to solve algebraic and transcendental equations
References:
Introductory Methods of Numerical Analysis by S.S. Sastry
https://en.wikipedia.org/wiki/Bisection_method
Like Article
Suggest improvement
Share your thoughts in the comments
Please Login to comment...