Upload
marwane-mesbahi
View
219
Download
3
Embed Size (px)
DESCRIPTION
Ceci est un cours a propos de la resolution des equations differentielles en informatique avec le langage python .
Citation preview
Resolution d’equations differentielle I
odeint() et methode d’Euler
MP
Equations differentielles du 1er ordreIntegration d’equations differentielle sous scipy
Equation differentielles d’ordres superieursMethode d’Euler
Equations differentielles du 1er ordre
Integration d’equations differentielle sous scipy
Equation differentielles d’ordres superieurs
Methode d’EulerMethode d’Euler scalaireMethode d’Euler vectorielleExemple : Cinetique chimiqueExemple : Oscillateur harmonique
d’Euler
Equations differentielles du 1er ordreIntegration d’equations differentielle sous scipy
Equation differentielles d’ordres superieursMethode d’Euler
Equations differentielles du 1er ordre
Soit φ une application reelle definie sur une partie de R2. Resoudre, ou integrer,une equation differentielle d’ordre 1 de la forme :
y ′ = φ(x , y) (E)
C’est determiner toutes les application y definies et derivables sur un ouvert Ide R et verifiant :
∀ x ∈ I , y ′(x) = φ(x , y(x))
● Resoudre une equation differentielle y ′ = φ(x , y) avec condition initialey0 = y(x0) qui peut s’ecrire aussi (x0, y0) (avec (x0, y0) dans le domaine D deφ) consiste a determiner une solution y a l’equation differentielle verifianty(x0) = y0. On parle aussi de Probleme de Cauchy.
Theoreme de Cauchy-Lipschitz : Si φ est de classe C 1 sur un domaine D ouvertde R2, l’equation differentielle y ′ = φ(x , y) avec la condition initiale y0 = y(x0)
(ou (x0, y0) ∈ D) admet une unique solution maximale. Toute autre solution estune restriction de la solution maximale.
Une solution est maximale, si elle ne peut pas se prolonger en une solution.
d’Euler
Equations differentielles du 1er ordreIntegration d’equations differentielle sous scipy
Equation differentielles d’ordres superieursMethode d’Euler
Integration d’equations differentielles sous scipy
● La methode odeint() du sous-module integrate de scipy permetl’integration d’equations differentielles avec condition initiale :
● Utilisation : Prenons l’exemple de l’integration sur [−1,1] de l’E.D. :
y ′ = t avec y(−1) =1
2
dont l’unique solution est y(t) =t2
2. (C’est en fait ici une recherche de
primitive.)
>>> import numpy as np
>>> t = np.linspace(-1,1,100) # tableau des temps
>>> phi = lambda y,t: t # fonction second membre
>>> from scipy import integrate
>>> y0 = 1/2 # condition initiale y[0] = y(-1) = 1/2
>>> y = integrate.odeint(phi, y0, t) # y = tableau des y(t[k])
>>> import matplotlib.pyplot as plt # trace
>>> plt.plot(t,y) ; plt.grid() ; plt.show()
d’Euler
Equations differentielles du 1er ordreIntegration d’equations differentielle sous scipy
Equation differentielles d’ordres superieursMethode d’Euler
Integration d’equations differentielles sous scipy
Voici le trace obtenu. Il correspond bien au resultat attendu : y(t) =t2
2sur
l’intervalle [−1,1].
d’Euler
Equations differentielles du 1er ordreIntegration d’equations differentielle sous scipy
Equation differentielles d’ordres superieursMethode d’Euler
Integration d’equations differentielles sous scipy
● Autre exemple :
y ′ = −y avec y(0) = 1
a pour unique solution y(t) = e−t .
>>> phi = lambda y,t: -y # fonction second membre
>>> t = np.linspace(0,4,100) # 100 echantillons entre 0 et 4
>>> y0 = 1 # valeur initiale au temps t[0] = 0
>>> y = integrate.odeint(phi,y0,t) # integration
>>> plt.plot(t,y) # trace
>>> plt.grid() ; plt.show()
d’Euler
Equations differentielles du 1er ordreIntegration d’equations differentielle sous scipy
Equation differentielles d’ordres superieursMethode d’Euler
Equa. diff. d’ordre superieur
● La fonction integrate.odeint permet aussi de resoudre des systemesd’equations differentielles (2 ou plus) :
{y ′1 = f1(y1, t)y ′2 = f2(y2, t)
avec conditions initiales y1(x0) et y2(x0)
Pour cela on passera pour arguments a odeint :integrate.odeint(F,Y0,t)
avec F et Y0 de type array :
F = np.array([f1,f2]) et Y0 = np.array([y1(x0),y2(x0)]).
● C’est cette fonctionnalite que l’on utilise pour resoudre des equationsdifferentielles d’ordre superieur :
● Exemple : y ′′ = cos(t) avec y(0) = −1 et y ′(0) = 0a pour solution evidente y(t) = − cos(t).
L’equation differentielle est equivalente au systeme (probleme de Cauchy) :
⎧⎪⎪⎪⎪⎨⎪⎪⎪⎪⎩
d
dty = y ′
d
dty ′ = cos(t)
avec : y(0) = −1 et y ′(0) = 0
d’Euler
Equations differentielles du 1er ordreIntegration d’equations differentielle sous scipy
Equation differentielles d’ordres superieursMethode d’Euler
Equa. diff. d’ordre superieur
● Le systeme :
⎧⎪⎪⎪⎪⎨⎪⎪⎪⎪⎩
d
dty = y ′
d
dty ′ = cos(t)
avec : y(0) = −1 et y ′(0) = 0
s’ecrit comme un probleme de Cauchy vectoriel :
d
dt(
yy ′
) = (y ′
cos(t)) et (
y(0)y ′(0)
) = (−1
0)
En posant Y = (yy ′
) = (Y [0]Y [1]
) :
import numpy as np
F = lambda Y, t : np.array([Y[1], np.cos(t)])
from scipy import integrate
t = np.linspace(0,6,100) # Subdivision reguliere de [0,6]
y0 = np.array([-1,0]) # array des conditions initiales
y = integrate.odeint(F,y0,t) # appel de odeint
d’Euler
Equations differentielles du 1er ordreIntegration d’equations differentielle sous scipy
Equation differentielles d’ordres superieursMethode d’Euler
Equa. diff. d’ordre superieur
Trace du graphe :
plt.plot(t,y)
plt.legend((’y’,’dy/dt’))
plt.show()
On obtient 2 courbes, celle de y(t) = − cos(t) et celle de y ′(t) = sin(t).d’Euler
Equations differentielles du 1er ordreIntegration d’equations differentielle sous scipy
Equation differentielles d’ordres superieursMethode d’Euler
Methode d’Euler scalaireMethode d’Euler vectorielleExemple : Cinetique chimiqueExemple : Oscillateur harmonique
Methode d’Euler (ou d’Euler-Cauchy)
Soit l’equation differentielle f ′(x) = φ(x , f (x)) ou φ est definie sur I ×R avec Iun intervalle ouvert non-vide de R.
Soit un segment [a,b] inclus dans I et la condition initiale (x0, y0) = (a, f (a)).La methode d’Euler-Cauchy consiste a considerer une subdivision reguliere de[a,b] en n segments, soit n + 1 points xk = a + k b−a
net a calculer de proche en
proche une valeur approchee de yk = f (xk) en ’approximant la fonction f parson DL d’ordre 1 en xk ’ (tangente).
La suite (yk)0⩽k⩽n est ce que l’on entend par une resolution approchee duprobleme de Cauchy.
●C’est a dire, une fois yk determine, on trouve yk+1 par :
yk+1 = yk + ∫xk+1
xk
f ′(x)dx = yk + ∫xk+1
xk
φ(t, f (t))dt
≃ yk + f ′(xk)(xk+1 − xk) ≃ yk + φ(xk , yk).b − a
n≃ yk+1
d’Euler
Equations differentielles du 1er ordreIntegration d’equations differentielle sous scipy
Equation differentielles d’ordres superieursMethode d’Euler
Methode d’Euler scalaireMethode d’Euler vectorielleExemple : Cinetique chimiqueExemple : Oscillateur harmonique
Methode d’Euler
import numpy as np
import matplotlib.pyplot as plt
def euler(a,b,Phi,y0,n):
"""Methode de Cauchy Euler d’integration approchee de
y’= Phi(x,f(x)) sur [a,b] avec condition initiale y0 = f(a)
avec n+1 points"""
x = np.linspace(a,b,n+1) # Subdivision reguliere de [a,b]
y = np.empty(n+1) # tableau (1D) vide de n+1 elts
y[0] = y0 # Condition initiale
pas = (b-a)/n
for k in range(n):
y[k+1] = y[k] + pas * Phi(x[k],y[k])
return (x,y)
●Attention np.empty() retournant un tableau unidimensionnel, cette ecriture de la methoded’Euler-Cauchy ne fonctionne qu’avec des equations differentielles scalaires du premier ordre (nous
verrons plus loin comment en donner une version vectorielle : remplacer par une liste que l’onremplit successivement de vecteurs).
d’Euler
Equations differentielles du 1er ordreIntegration d’equations differentielle sous scipy
Equation differentielles d’ordres superieursMethode d’Euler
Methode d’Euler scalaireMethode d’Euler vectorielleExemple : Cinetique chimiqueExemple : Oscillateur harmonique
Methode d’Euler-Cauchy
● Integration de y ′ = y 2 avec y(0) = 1 (essai sur [0,1]).
>>> Phi = lambda x,y: y**2
>>> (x,y) = euler(0,1,Phi,1,100)
>>> plt.plot(x,y)
>>> plt.show()
La solution exacte est y(x) =1
1 − x(qui n’est pas definie en x = 1...).
d’Euler
Equations differentielles du 1er ordreIntegration d’equations differentielle sous scipy
Equation differentielles d’ordres superieursMethode d’Euler
Methode d’Euler scalaireMethode d’Euler vectorielleExemple : Cinetique chimiqueExemple : Oscillateur harmonique
Methode d’Euler vectorielle
Elle prend pour parametre :
1. La fonction Φ vectorielle,
2. Les conditions initiales, sous forme d’un vecteur Y0,
3. Les bornes a,b de resolution,
4. le pas h (ou le nombre de points n + 1 avec h = b−an
, au choix).
# Euler vectoriel
def EulerVect(F,y0,a,b,h):
y = y0
t = a
T = [a]
Y = [y0]
while t+h <= b:
y = y + h * F(y,t)
Y.append(y)
t += h
T.append(t)
return T, Y
d’Euler
Equations differentielles du 1er ordreIntegration d’equations differentielle sous scipy
Equation differentielles d’ordres superieursMethode d’Euler
Methode d’Euler scalaireMethode d’Euler vectorielleExemple : Cinetique chimiqueExemple : Oscillateur harmonique
Cinetique chimique
●Prenons le cas d’une solution composee de reactifs A, B, C , ou deuxreactions chimiques AÐ→ B et B Ð→ C d’ordre 1 rentrent en jeu selon les lois.
⎧⎪⎪⎪⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎪⎪⎪⎩
d[A]
dt= −[A]
d[B]
dt= [A] − [B]
d[C]
dt= [B]
⇐⇒d
dt
⎛⎜⎝
[A]
[B]
[C]
⎞⎟⎠=⎛⎜⎝
−[A]
[A] − [B]
[B]
⎞⎟⎠
On s’interesse a l’evolution des concentrations des 3 reactifs A , B, C entre 0et 8s, en partant des concentrations initiales [A] = 1, [B] = [C] = 0.
●Resolution :
import numpy as np
Phi = lambda Y, t: np.array([-Y[0], Y[0] - Y[1], Y[1]])
Y0 = np.array([1, 0, 0])
T, Sol = EulerVect(Phi,Y0,0,8,0.1)
●Avec odeint() :T = np.arange(0,8,0.1) ; Sol = integrate.odeint(Phi,Y0,t)
d’Euler
Equations differentielles du 1er ordreIntegration d’equations differentielle sous scipy
Equation differentielles d’ordres superieursMethode d’Euler
Methode d’Euler scalaireMethode d’Euler vectorielleExemple : Cinetique chimiqueExemple : Oscillateur harmonique
Cinetique chimique
import matplotlib.pyplot as plt
plt.plot(T, Sol)
plt.title(’Evolution des concentrations de $A$, $B$, $C$’)plt.legend((’$[A]$’, ’$[B]$’, ’$[C]$’))plt.xlabel(’Temps (s)’)
plt.show()
d’Euler
Equations differentielles du 1er ordreIntegration d’equations differentielle sous scipy
Equation differentielles d’ordres superieursMethode d’Euler
Methode d’Euler scalaireMethode d’Euler vectorielleExemple : Cinetique chimiqueExemple : Oscillateur harmonique
Oscillateur harmonique : pendule sans frottement
Copie du graphique : http://fr.wikipedia.org/wiki/Pendule_simple
●Un pendule de masse m soumis a un champ de pesanteur constant se deplacedans un plan vertical ; il est situe au bout d’une tige rigide de longueur l et demasse nulle tournant sans frottement autour de son extremite fixe.
d’Euler
Equations differentielles du 1er ordreIntegration d’equations differentielle sous scipy
Equation differentielles d’ordres superieursMethode d’Euler
Methode d’Euler scalaireMethode d’Euler vectorielleExemple : Cinetique chimiqueExemple : Oscillateur harmonique
Oscillateur harmonique : pendule sans frottement
Nous allons :
1. Trouver une equation differentielle satisfaite pas son elongation angulaireθ(t).
2. Resoudre numeriquement l’equation differentielle avec une position initialeegale a θ(0) = π
2, une vitesse initiale nulle, et avec g = 9,81m.s−1 et
l = 10cm.
3. Verifier la propriete de conservation de l’energie, c’est a dire que :
1
2l2
[θ(t)]2− g l cos θ(t)
reste constant au cours du temps.
d’Euler
Equations differentielles du 1er ordreIntegration d’equations differentielle sous scipy
Equation differentielles d’ordres superieursMethode d’Euler
Methode d’Euler scalaireMethode d’Euler vectorielleExemple : Cinetique chimiqueExemple : Oscillateur harmonique
Oscillateur harmonique : pendule sans frottement
L’energie mecanique du systeme est :
Em = Ec + Ep =1
2mv 2
+mg(h + cte)
=1
2m (l θ)
2+mgl(1 − cos θ)
En l’absence de frottement l’energie mecanique du systeme est constante.
dEm
dt= ml2 θθ +mgl θ sin θ = 0
⇐⇒θ/=0
θ +g
lsin θ = 0
⇐⇒ θ = −g
lsin θ
Ô⇒d
dt(θ(t)
θ(t)) =
⎛
⎝
θ(t)
−g
lsin (θ(t))
⎞
⎠
d’Euler
Equations differentielles du 1er ordreIntegration d’equations differentielle sous scipy
Equation differentielles d’ordres superieursMethode d’Euler
Methode d’Euler scalaireMethode d’Euler vectorielleExemple : Cinetique chimiqueExemple : Oscillateur harmonique
Oscillateur harmonique : pendule sans frottement
●Resolution numerique avec θ(0) = π2
, vitesse initiale nulle et l = 10cm.
import numpy as np
import matplotlib.pyplot as plt
from scipy import integrate
g = 9.81
l = 0.1
F = lambda Y,t: np.array([Y[1] , -g * np.sin(Y[0]) / l])
y0 = np.array([np.pi/2 , 0]) # Condition intiale
t, y = EulerVect(F,y0,0,6,0.01) # Resolution
plt.plot(t,y)
plt.legend((’theta(t)’,’d theta(t)/ dt’))
plt.show()
On utilise comme fonction :
F ∶ (y0
y1) , t z→
⎛
⎝
y1
−g
lsin(y0)
⎞
⎠avec
d
dtY = F(Y , t)
d’Euler
Equations differentielles du 1er ordreIntegration d’equations differentielle sous scipy
Equation differentielles d’ordres superieursMethode d’Euler
Methode d’Euler scalaireMethode d’Euler vectorielleExemple : Cinetique chimiqueExemple : Oscillateur harmonique
Oscillateur harmonique : pendule sans frottement
Essayer la commande (LATEX) :plt.legend((’$/theta(t)$’,’$/frac{/theta(t)}{dt}$’))
pour obtenir un plus joli resultat.
d’Euler
Equations differentielles du 1er ordreIntegration d’equations differentielle sous scipy
Equation differentielles d’ordres superieursMethode d’Euler
Methode d’Euler scalaireMethode d’Euler vectorielleExemple : Cinetique chimiqueExemple : Oscillateur harmonique
Oscillateur harmonique : pendule sans frottement
Verifier la propriete de conservation de l’energie, c’est a dire que reste constantau cours du temps. :
1
2l2
[θ(t)]2− g l cos θ(t)
● On calcule l’echantillonnage de l’energie mecanique : 12m (l θ)
2−mgl cos(θ).
E = np.empty(100)
for i in range(100):
E[i] = 0.5 * l ** 2 * y[i][1] ** 2 - g * l * np.cos(y[i][0])
plt.plot(t,E) ; plt.show()
●Remarque : L’energie mecanique s’obtient aussi sans boucle for et parslicing :
E = 0.5 * l ** 2 * y[ : , 1] ** 2 - g * l * np.cos(y[ : , 0])
d’Euler
Equations differentielles du 1er ordreIntegration d’equations differentielle sous scipy
Equation differentielles d’ordres superieursMethode d’Euler
Methode d’Euler scalaireMethode d’Euler vectorielleExemple : Cinetique chimiqueExemple : Oscillateur harmonique
Oscillateur harmonique : pendule sans frottement
La fluctuation de l’energie est de l’ordre de 10−7. Elle est due aux erreursd’approximation. Pour eviter ce phenomene : plt.axis(’equal’) :
plt.axis(’equal’)
●Ou encore :
plt.axis([0, 6, -2.2, 2.2]) # Donne la fenetre a afficher.
d’Euler