# quant-econ Solutions: SciPy

## Exercise 1

Here's a reasonable solution:

``````

In [6]:

def bisect(f, a, b, tol=10e-5):
"""
Implements the bisection root finding algorithm, assuming that f is a
real-valued function on [a, b] satisfying f(a) < 0 < f(b).
"""
lower, upper = a, b
if upper - lower < tol:
return 0.5 * (upper + lower)
else:
middle = 0.5 * (upper + lower)
print('Current mid point = {}'.format(middle))
if f(middle) > 0:   # Implies root is between lower and middle
bisect(f, lower, middle)
else:               # Implies root is between middle and upper
bisect(f, middle, upper)

``````

We can test it as follows

``````

In [8]:

import numpy as np
f = lambda x: np.sin(4 * (x - 0.25)) + x + x**20 - 1

bisect(f, 0, 1)

``````
``````

Current mid point = 0.5
Current mid point = 0.25
Current mid point = 0.375
Current mid point = 0.4375
Current mid point = 0.40625
Current mid point = 0.421875
Current mid point = 0.4140625
Current mid point = 0.41015625
Current mid point = 0.408203125
Current mid point = 0.4091796875
Current mid point = 0.40869140625
Current mid point = 0.408447265625
Current mid point = 0.408325195312
Current mid point = 0.408264160156

``````
``````

In [ ]:

``````