Livre_silo 30 août 2013 16:32 Page 211
¨
©
¨
©
¨
©
¨
©
C o p y r i g h t E y r o l l e s
211
8 – Résolution numérique d’équations sur les réels
8.3.2 Utiliser numpy/scipy
La plupart du temps, il est déraisonnable de coder soi-même une méthode de résolution
qui existe déjà et a probablement été plus testée et optimisée qu’une fonction « maison ».
Les bibliothèques numpy et scipy.optimize proposent les fonctions suivantes :
• La fonction numpy.roots détermine les racines d’un polynôme donné par la liste de ses
coefficients.
In [7]: numpy.roots([1, 2, -1, -2])
Out[7]: array([1., -2., -1.])
Elle fournit même les racines complexes, le nombre imaginaire i étant noté j.
In [8]: numpy.roots([1, 0, 0, 1])
Out[8]: array([-1.0 + 0.j, 0.5 + 0.8660254j, 0.5 - 0.8660254j])
In [9]: numpy.roots([1, 2, 2, 4])
Out[9]: array([-2.0e+00 + 0.j, 1.90013207e-16 + 1.41421356j, 1.90013207e-16 - 1.41421356j])
• La méthode dichotomique, qualifiée de lente mais sûre (slow but sure), est implémentée
dans scipy.optimize.bisect.
In [10]: scipy.optimize.bisect(math.sin, 3, 4)
Out[10]: 3.141592653589214
• La méthode de Newton est programmée dans scipy.optimize.newton. Il est à noter que si
on ne donne pas la dérivée, c’est en fait la méthode de la sécante qui est appliquée. Dans
le cas opposé où on lui fournit f
′ et f
′′ , c’est la méthode de Halley qui sera en fait mise
en œuvre.
In [11]: scipy.optimize.newton(math.sin, 3, math.cos)
Out[11]: 3.141592653589793
• On dispose également de scipy.optimize.brentq qui implémente la méthode de Brent
pour trouver une racine dans un intervalle donné. Le lecteur intéressé ira lire la documentation de cette fonction.
In [12]: scipy.optimize.brentq(math.sin, 3, 4)
Out[12]: 3.141592653589793
• Enfin, pour des problèmes qui ne sont pas scalaires, on peut utiliser la fonction fsolve :
In [13]: scipy.optimize.fsolve(lambda (x,y): (x + y**2, 1 - y + x**2), (0,0))
Out[13]: array([-0.33145847, 0.75398698])
Lire la documentation de ces fonctions est assez intéressant. Il y est par exemple rappelé
que rien n’ est garanti dans le résultat.
Précédent

- 224/402

Suivant