http://alexandre.boisseau.free.fr/Prive/WWW/InfoPCSI/resume18.pdf
18
Approximation de racines et d’intégrales : Numpy/Scipy et Scilab
V. Solutions approchées d’équations : fsolve
⋄ Avec SCILAB, on utilise la fonctionfsolve sous la formefsolve(x0,f)oùf est la fonc- tion dont on veut déterminer une racine etx0 est une valeur de départ pour l’algorithme de recherche. La fonctionfsolveretourne 3 va- leurs : la valeur approchée de la racine, la va- leur de la fonction en ce point (qui doit être
« assez petite » si tout s’est bien passé) et une troisième valeur qui indique comment l’algo- rithme s’est déroulé (vaut 1 si tout s’est bien passé).
deff('y=f(x)','y=x^2-2') [x,fx,info]=fsolve(1,f)
info = 1.
fx =
- 4.441D-16 x =
1.4142136
⋄ Si on a seulement besoin de la première ou des deux premières valeurs on écrit :
x=fsolve(1,f) x =
1.4142136
[x,fx]=fsolve(1,f) fx =
- 4.441D-16 x =
1.4142136
⋄ Avec NUMPY/SCIPY, on utilise la commande fsolvedu packagescipy.optimize sous la formefsolve(f,x0)(x0est une valeur de départ pour l’algorithme etfla fonc- tion dont on cherche une racine) :
from scipy.optimize import fsolve print fsolve(lambda x:x**2-2,1) [ 1.41421356]
⋄ Le résultat obtenu est un tableau à 1 di- mension (et de taille 1), pour obtenir la ra- cine on ne garde que la première compo- sante.
x=fsolve(lambda x:x**2-2,1)[0]
print x 1.41421356237
VI. Approximations d’intégrales : intg et quad
⋄ Avec SCILAB, on utilise la fonction intg sous la formeintg(a,b,f)oùfest la fonc- tion à intégrer etaetbsont les bornes de l’in- tervalle. Cette fonction retourne deux valeurs : une approximation de l’intégrale et une esti- mation de l’erreur absolue commise dans l’ap- proximation.
deff('y=f(x)','y=x^2') [I,deltaI]=intg(0,1,f)
deltaI = 3.701D-15 I =
0.3333333
⋄ Si on veut uniquement connaitre l’approxi-
mation de l’intégrale, on écrit : I=intg(0,1,f) I =
0.3333333 B Ce calcul peut échouer sur des intégrales
a priori simples (explications données en cours). Iciintg(-1,1,g)ne marche pas. On augmente alors latolérance.
deff('y=g(x)','y=x') intg(-1,1,g,1e-10)
ans = 0.
⋄ Avec NUMPY/SCIPY, on uti- lise la fonction quad du pa- ckagescipy.integratesous la formequad(f,a,b).
from scipy.integrate import quad print quad(lambda x:x**2,0,1)
(0.3333333333333333, 3.700743415417188e-15)
Remarque. Le résultat obtenu est untuple. C’est un type particulier qui se rapproche des listes à deux exceptions près : untuples’écrit avec des parenthèses (les listes s’écrivent avec des crochets) et n’est pas modifiable (par exemple on ne peut pas ajouter d’élément ou
changer la valeur d’une composante).
⋄ Ici letuple est composé de deux valeurs : la valeur approchée de l’intégrale et une es- timation de l’erreur absolue commise dans l’approximation. Si on n’a besoin de de la valeur approchée, on ne conserve que la 1re composante dutuple.
x=quad(lambda x:x**2,0,1)[0]
print x
0.333333333333
Remarque. On a donné ici une description simplifiée des fonctions de résolution d’équa- tions et de calcul d’intégrales. Pour une présentation plus détaillée, avec SCILAB:
help fsolve,help intg; avec PYTHON:
help("scipy.optimize.fsolve"),help("scipy.integrate.quad").