# How to Use the Bisection Method for Numerical Computing

Last Updated on August 9, 2023 by Editorial Team

#### Author(s): Chinmay Bhalerao

Originally published on Towards AI.

## Understanding the root-finding bisection method and its working

WE CAN CONNECT ON :U+007C LINKEDIN U+007C TWITTER U+007C MEDIUM U+007C SUBSTACK U+007C

A subfield of computer science and mathematics known as numerical computing focuses on employing computer-implemented numerical methods and algorithms to solve mathematical problems. It entails running simulations and calculations to arrive at approximations of answers to mathematical puzzles that could be challenging or impossible to solve analytically.

We have many equations in mathematics. To use those equations in real life, we have to solve those equations. We say “ EQUATION IS SOLVED” when we find its roots.f(x) = 0 where f(x) is a continuous function, and we want to find the value(s) of ‘x’ that makes the function equal to zero. When we put roots into the equation, the equation becomes zero. Let's see a simple example,

f(x) = x * x — 1

x * x — 1 = 0

f(1) = (1) * (1) –1 = 0

f(-1) = (-1) * (-1) –1=0

So 1 and –1 are roots of the above equations.

How did we understand that?

We put 1 in place of x in the equation. That's how we can solve these equations. But sadly, in real life, equations aren't that much simple to solve.

To solve real-life equations, we have many methods known as “ROOT FINDING METHODS”. These methods are very useful for numerical computing, optimization, Interpolation, curve fitting, Numerical analysis, and in many more fields.

If we started talking about evolution, then it would take a whole blog, but let's start directly with the implementation of techniques.

## Bisection method

The bisection method in mathematics is a simple approach for locating numerical roots to an equation with a single unknown. The bisection method is the simplest numerical method for resolving the transcendental problem. We shall go into great detail on the bisection approach with solved issues in this article.

To determine the roots of a polynomial problem, utilize the bisection method. It splits and separates the interval in which the equation’s root is located. The continuous functions intermediate theorem serves as the method’s guiding premise. It operates by reducing the distance between the positive and negative intervals until it approaches the right response. By averaging the positive and negative intervals, this technique reduces the distance between the variables.

Although it is a straightforward process, it moves slowly. The bisection method is sometimes referred to as the dichotomy method, binary search method, interval halving method, and root-finding method.

## Bisection Method Algorithm

For any continuous function f(x), [Source]

Find two points, say a and b such that a < b and f(a)* f(b) < 0

Find the midpoint of a and b, say “c”

t is the root of the given function if f(c) = 0; else follow the next step

Divide the interval [a, b] — If f(c)*f(a) <0, there exist a root between c and a
– else if f(c) *f (b) < 0, there exist a root between c and b

Repeat above three steps until f(c) = 0.

The bisection method is an approximation method to find the roots of the given equation by repeatedly dividing the interval. This method will divide the interval until the resulting interval is found, which is extremely small.

CODE:

Disclaimer/Warning: This code is just to show how to create a basic bisection code in Python. I am not claiming any optimization in the code and further improvements are needed according to the specific problem statement.

Let's take a simple function.

F(x) = x * x — 3

`def fun(x): return x * x - 3`

Let's write a very basic code to create a simple pipeline for bisection method code.

`a = 1 #Approx first rootb = 2 #Approx second root #Function declarationdef fun(x): return x*x - 3a_original = fun(a)b_original = fun(b)i = 0while i < 50 : #Do this for 50 times  c = (a + b)/2 c_original = fun(c) if c_original < 0: a = c else: b = c# plt.plot(a) print("The a is {}".format(a)) print("The b is {}".format(b)) i+=1`

The above is very basic but a basic code which is representing the bisection method at a brute-force level.

## Let's see its output

`The a is 1.5The b is 2The a is 1.5The b is 1.75The a is 1.625The b is 1.75The a is 1.6875The b is 1.75The a is 1.71875The b is 1.75The a is 1.71875The b is 1.734375The a is 1.7265625The b is 1.734375The a is 1.73046875The b is 1.734375The a is 1.73046875The b is 1.732421875The a is 1.7314453125The b is 1.732421875The a is 1.73193359375The b is 1.732421875The a is 1.73193359375The b is 1.732177734375The a is 1.73193359375The b is 1.7320556640625The a is 1.73199462890625The b is 1.7320556640625The a is 1.732025146484375The b is 1.7320556640625The a is 1.7320404052734375The b is 1.7320556640625The a is 1.7320480346679688The b is 1.7320556640625The a is 1.7320480346679688The b is 1.7320518493652344The a is 1.7320499420166016The b is 1.7320518493652344The a is 1.7320499420166016The b is 1.732050895690918The a is 1.7320504188537598The b is 1.732050895690918The a is 1.7320506572723389The b is 1.732050895690918The a is 1.7320507764816284The b is 1.732050895690918The a is 1.7320507764816284The b is 1.7320508360862732The a is 1.7320508062839508The b is 1.7320508360862732The a is 1.7320508062839508The b is 1.732050821185112The a is 1.7320508062839508The b is 1.7320508137345314The a is 1.7320508062839508The b is 1.732050810009241The a is 1.7320508062839508The b is 1.732050808146596The a is 1.7320508072152734The b is 1.732050808146596The a is 1.7320508072152734The b is 1.7320508076809347The a is 1.732050807448104The b is 1.7320508076809347The a is 1.7320508075645193The b is 1.7320508076809347The a is 1.7320508075645193The b is 1.732050807622727The a is 1.7320508075645193The b is 1.7320508075936232The a is 1.7320508075645193The b is 1.7320508075790713The a is 1.7320508075645193The b is 1.7320508075717953The a is 1.7320508075681573The b is 1.7320508075717953The a is 1.7320508075681573The b is 1.7320508075699763The a is 1.7320508075681573The b is 1.7320508075690668The a is 1.732050807568612The b is 1.7320508075690668The a is 1.7320508075688394The b is 1.7320508075690668The a is 1.7320508075688394The b is 1.7320508075689531The a is 1.7320508075688394The b is 1.7320508075688963The a is 1.7320508075688679The b is 1.7320508075688963The a is 1.7320508075688679The b is 1.732050807568882The a is 1.732050807568875The b is 1.732050807568882The a is 1.732050807568875The b is 1.7320508075688785The a is 1.7320508075688767The b is 1.7320508075688785The a is 1.7320508075688767The b is 1.7320508075688776`

The above output is of playing with a and b for 50 iterations. The system will get in trouble in processing numbers greater than 16 digits due to limitations. But we can see that the values of roots are coming closer and closer.

The last a is 1.73205080

The last b is 1.73205080

Substituting these latest values in the equation will get you,

F(a) = -0.000176000…..

F(b) = 0.000176000…..

Very close to 0 !!!

Now we know this logic is working. let's optimize the code and visualize the output so that we can understand it better.

`import matplotlib.pyplot as pltdef Bisection_method(a, b, iterations): def fun(x): return x * x - 3 # Create a figure and axis for the plot plt.figure() plt.xlabel('x') plt.ylabel('y') plt.title('Visualization of Equation y = x^2 - 3') # Plot the equation y = x^2 - 3 for the range [a, b] x_values = [x / 100.0 for x in range(int(a * 100), int(b * 100) + 1)] y_values = [fun(x) for x in x_values] plt.plot(x_values, y_values, color='orange', label='y = x^2 - 3') # Plot initial points a and b on the graph plt.plot(a, fun(a), 'ro', label='f(a)') plt.plot(b, fun(b), 'go', label='f(b)') # Plot the x-axis line plt.axhline(linewidth=2, y=0, color='brown', linestyle='dashdot') plt.axhline(y=fun(a), color='blue', linestyle='dashdot') plt.axhline(y=fun(b), color='blue', linestyle='dashdot') plt.legend() plt.grid() # Update the plot and display it plt.pause(1) a_vals = [a] b_vals = [b] i = 0 while i < iterations: c = (a + b) / 2 c_original = fun(c) if c_original < 0: a = c else: b = c i += 1 a_vals.append(a) b_vals.append(b) # Plot all the values of a and b in different colors plt.plot([fun(a_val) for a_val in a_vals], 'mo', label='f(a)',color='orange') plt.axhline(y=0, color='brown', linestyle='dashdot') plt.plot([fun(b_val) for b_val in b_vals], 'co', label='f(b)') plt.axhline(y=0, color='brown', linestyle='dashdot') plt.legend() plt.grid() # Update the plot and display it# plt.pause(1) plt.show()`
`#Call the function with initial values for a, b, and the number of iterationsa_initial = 1b_initial = 2iterations = 50Bisection_method(a_initial, b_initial, iterations)`

I modified this code such that it will take inputs and it will display the graph of roots.

In the above fig, we can see our starting points and their F(x) values. the red highlighted line is what we want to achieve with these initial roots.

In the above figure, I have plotted the outputs of the last 10 points out of 50. You can see the values converging towards 0 and the final few points are almost 0. It is a sign that we got out roots. Iterations are the limit you can put to control the whole execution. the parameter could be the threshold value for the Function. So either you have to stop after completing a certain number of iterations or if you achieved a certain threshold value.

You can change the function and use this code to find roots for your own equation, or you can directly use the below link, which will land you on the bisection method online calculator.

## Bisection Method Online Calculator

### The bisection method online calculator is a simple and reliable tool for finding the real root of non-linear equations using…

www.codesansar.com

## Advantages of the Bisection method:

Convergence: dependability guarantees that the approach will come up with a solution so long as a root-containing interval is given.

Simpleness: The method is simple theoretically and simple to use.

Robustness: Compared to certain other root-finding techniques, the bisection method is less sensitive to the original guess.

Interval Refinement: Each improvement makes sure that with each iteration, the solution is more precise.

No derivative requirement: This makes it appropriate for functions for which derivatives are either unavailable or difficult to compute.

Global Convergence: This approach will finally locate a root if one is present inside the interval.

## Limitations of the Bisection method:

Slow Convergence: The method can be slow compared to other root-finding algorithms with faster convergence rates, especially for functions with steep slopes, even though it ensures convergence.

Requirement of Interval:The procedure might not be appropriate if such an interval is unknown or challenging to determine.

Only One Root Can Be Found: The bisection method is made to only uncover one root inside the supplied range [a, b]. The procedure will arrive at one of a function’s roots if it has more than one inside that range

Limited Applicability to Complex Equations: The bisection method is most suitable for equations with a single real root within the specified interval.

To overcome these limitations, we have many other methods which are on the advanced level for root finding with different mechanisms. We will cover those in the next series of blogs.

It is a proven fact that “Generosity makes you a happier person”; therefore, Give claps to the article if you liked it. If you found this article insightful, follow me on Linkedin and Medium. You can also subscribe to get notified when I publish articles. Let’s create a community! Thanks for your support!

## Understanding LangChain U+1F99C️U+1F517: PART 1

### Theoretical understanding of chains, prompts, and other important modules in Langchain

pub.towardsai.net

## A Practical Guide to Selecting CNN Architectures for Computer Vision Applications

### From LeNet to EfficientNet: Choosing the Best CNN Architecture for Your Project

levelup.gitconnected.com

medium.com

## Boost Your Data Science, ML, and CV Projects: Essential Tools for Effective Project Management

### Make your builds and projects faster with these tools

pub.towardsai.net

Signing off,

Chinmay

Join thousands of data leaders on the AI newsletter. Join over 80,000 subscribers and keep up to date with the latest developments in AI. From research to projects and ideas. If you are building an AI startup, an AI-related product, or a service, we invite you to consider becoming a sponsor.

Published via Towards AI