#!/usr/bin/env python # coding: utf-8 # > This is one of the 100 recipes of the [IPython Cookbook](http://ipython-books.github.io/), the definitive guide to high-performance scientific computing and data science in Python. # # # 9.1. Finding the root of a mathematical function # 1. Let's import NumPy, SciPy, scipy.optimize, and matplotlib. # In[ ]: import numpy as np import scipy as sp import scipy.optimize as opt import matplotlib.pyplot as plt get_ipython().run_line_magic('matplotlib', 'inline') # 2. We define the mathematical function $f(x)=\cos(x)-x$ in Python. We will try to find a root of this function numerically, which corresponds to a fixed point of the cosine function. # In[ ]: f = lambda x: np.cos(x) - x # 3. Let's plot this function on the interval $[-5, 5]$. # In[ ]: x = np.linspace(-5, 5, 1000) y = f(x) plt.figure(figsize=(5,3)); plt.plot(x, y); plt.axhline(0, color='k'); plt.xlim(-5,5); # 4. We see that this function has a unique root on this interval (this is because the function's sign changes on this interval). The scipy.optimize module contains a few root-finding functions that are adapted here. For example, the `bisect` function implements the **bisection method** (also called the **dichotomy method**). It takes as input the function and the interval to find the root in. # In[ ]: opt.bisect(f, -5, 5) # Let's visualize the root on the plot. # In[ ]: plt.figure(figsize=(5,3)); plt.plot(x, y); plt.axhline(0, color='k'); plt.scatter([_], [0], c='r', s=100); plt.xlim(-5,5); # 5. A faster and more powerful method is `brentq` (Brent's method). This algorithm also requires that $f$ is continuous and that $f(a)$ and $f(b)$ have different signs. # In[ ]: opt.brentq(f, -5, 5) # The `brentq` method is faster than `bisect`. If the conditions are satisfied, it is a good idea to try Brent's method first. # In[ ]: get_ipython().run_line_magic('timeit', 'opt.bisect(f, -5, 5)') get_ipython().run_line_magic('timeit', 'opt.brentq(f, -5, 5)') # > You'll find all the explanations, figures, references, and much more in the book (to be released later this summer). # # > [IPython Cookbook](http://ipython-books.github.io/), by [Cyrille Rossant](http://cyrille.rossant.net), Packt Publishing, 2014 (500 pages).