Encontrando Raízes#
import numpy as np
import matplotlib.pyplot as plt
Em muitos problemas numéricos, é comum precisarmos determinar o valor de uma variável que faça com que uma função se anule, ou seja, encontrar a raiz da função.
A biblioteca scipy.optimize contém vários métodos para encontrar raízes, entretanto a rotina brentq() oferece um método robusto e eficiente para encontrar raízes de uma função escalar.
Para utilizá-la, é necessário fornecer um intervalo no qual se sabe que a função muda de sinal, delimitando a região em que a raiz está localizada. O método então irá iterativamente refiná-la até atingir a solução com a precisão desejada.
Vamos considerar para ilustrar a rotina a função
\(f(x) = \frac{x e^x}{e^x - 1} - 5\)
import scipy.optimize as optimize
def f(x):
return (x*np.exp(x)/(np.exp(x) - 1.0) - 5.0)
root, r = optimize.brentq(f, 0.1, 10.0, full_output=True)
print(root)
print(r.converged)
4.965114231744287
True
x = np.linspace(0.1, 10.0, 1000)
fig, ax = plt.subplots()
ax.plot(x, f(x))
ax.scatter(np.array([root]), np.array([f(root)]))
ax.grid()