Livre_silo 30 août 2013 16:32 Page 231
¨
©
¨
©
¨
©
¨
©
C o p y r i g h t E y r o l l e s
231
9 – Résolution numérique d’équations différentielles
9.3.1 Intégration des équations différentielles avec odeint
La bibliothèque scipy.integrate contient la fonction odeint, qui résout numériquement des
équations différentielles. On commence donc par la charger :
from scipy.integrate import odeint
Une utilisation basique sera de la forme : odeint(f, y0, t), pour résoudre l’équation
y
′ (t) = f (y(t), t) sur un intervalle [a, b]. L’aspect déroutant est la nature de t : il s’agit
d’un tableau de temps entre a et b : t est de la forme t=[a,t1,...,b]. La condition initiale
est alors : y(a) = y 0 . La valeur renvoyée est un tableau contenant une estimation de la
solution aux différents temps.
ATTENTION Ordre des arguments
La fonction donnée en paramètre prend « le temps » comme deuxième argument, et non
en premier comme on a l’habitude de le faire en mathématiques.
Par exemple, pour résoudre sur [0, 1] l’équation y
′ = y avec la condition initiale y(0) = 1
et un pas de 0.5, on peut exécuter :
In [8]: odeint(lambda y,t :y,1,[0,0.5,1])
Out[8]: array([[ 1. ], [ 1.64872127], [ 2.71828191]])
Il reste deux choses à apprendre :
• créer efficacement le tableau des temps en lesquels la fonction va être approchée ;
• représenter le graphe de la solution approchée.
Pour le premier point, on a trois possibilités :
1 À la main, on crée un tableau de valeurs, par exemple par compréhension :
In [9]: [k/10. for k in range(11)]
Out[9]: [0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0]
Ici, l’objet renvoyé est une liste qu’on appelle aussi tableau, mais qui n’est pas un array au
sens de numpy, même si cette dernière bibliothèque fait souvent elle-même les conversions.
2 Avec la fonction linspace à laquelle on donne des bornes et un nombre de valeurs attendues :
In [10]: numpy.linspace(0,1,11)
Out[10]: array([ 0. , 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1. ])
3 Avec la fonction arange qui est une adaptation de range pour les array. On note que la
borne supérieure de l’intervalle est exclue comme avec range.
In [11]: numpy.arange(0,1.1,0.1)
Out[11]: array([ 0. , 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1. ])
¨
©
¨
©
¨
©
¨
©
C o p y r i g h t E y r o l l e s
231
9 – Résolution numérique d’équations différentielles
9.3.1 Intégration des équations différentielles avec odeint
La bibliothèque scipy.integrate contient la fonction odeint, qui résout numériquement des
équations différentielles. On commence donc par la charger :
from scipy.integrate import odeint
Une utilisation basique sera de la forme : odeint(f, y0, t), pour résoudre l’équation
y
′ (t) = f (y(t), t) sur un intervalle [a, b]. L’aspect déroutant est la nature de t : il s’agit
d’un tableau de temps entre a et b : t est de la forme t=[a,t1,...,b]. La condition initiale
est alors : y(a) = y 0 . La valeur renvoyée est un tableau contenant une estimation de la
solution aux différents temps.
ATTENTION Ordre des arguments
La fonction donnée en paramètre prend « le temps » comme deuxième argument, et non
en premier comme on a l’habitude de le faire en mathématiques.
Par exemple, pour résoudre sur [0, 1] l’équation y
′ = y avec la condition initiale y(0) = 1
et un pas de 0.5, on peut exécuter :
In [8]: odeint(lambda y,t :y,1,[0,0.5,1])
Out[8]: array([[ 1. ], [ 1.64872127], [ 2.71828191]])
Il reste deux choses à apprendre :
• créer efficacement le tableau des temps en lesquels la fonction va être approchée ;
• représenter le graphe de la solution approchée.
Pour le premier point, on a trois possibilités :
1 À la main, on crée un tableau de valeurs, par exemple par compréhension :
In [9]: [k/10. for k in range(11)]
Out[9]: [0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0]
Ici, l’objet renvoyé est une liste qu’on appelle aussi tableau, mais qui n’est pas un array au
sens de numpy, même si cette dernière bibliothèque fait souvent elle-même les conversions.
2 Avec la fonction linspace à laquelle on donne des bornes et un nombre de valeurs attendues :
In [10]: numpy.linspace(0,1,11)
Out[10]: array([ 0. , 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1. ])
3 Avec la fonction arange qui est une adaptation de range pour les array. On note que la
borne supérieure de l’intervalle est exclue comme avec range.
In [11]: numpy.arange(0,1.1,0.1)
Out[11]: array([ 0. , 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1. ])
