22
esolution d’´ equations diff´ erentielle I odeint() et ethode d’Euler MP

Equa Diff 01Informatique, Les equations differentielles

Embed Size (px)

DESCRIPTION

Ceci est un cours a propos de la resolution des equations differentielles en informatique avec le langage python .

Citation preview

Page 1: Equa Diff 01Informatique, Les equations differentielles

Resolution d’equations differentielle I

odeint() et methode d’Euler

MP

Page 2: Equa Diff 01Informatique, Les equations differentielles

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

Page 3: Equa Diff 01Informatique, Les equations differentielles

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

Page 4: Equa Diff 01Informatique, Les equations differentielles

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

Page 5: Equa Diff 01Informatique, Les equations differentielles

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

Page 6: Equa Diff 01Informatique, Les equations differentielles

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

Page 7: Equa Diff 01Informatique, Les equations differentielles

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

Page 8: Equa Diff 01Informatique, Les equations differentielles

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

Page 9: Equa Diff 01Informatique, Les equations differentielles

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

Page 10: Equa Diff 01Informatique, Les equations differentielles

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

Page 11: Equa Diff 01Informatique, Les equations differentielles

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

Page 12: Equa Diff 01Informatique, Les equations differentielles

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

Page 13: Equa Diff 01Informatique, Les equations differentielles

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

Page 14: Equa Diff 01Informatique, Les equations differentielles

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

Page 15: Equa Diff 01Informatique, Les equations differentielles

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

Page 16: Equa Diff 01Informatique, Les equations differentielles

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

Page 17: Equa Diff 01Informatique, Les equations differentielles

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

Page 18: Equa Diff 01Informatique, Les equations differentielles

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

Page 19: Equa Diff 01Informatique, Les equations differentielles

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

Page 20: Equa Diff 01Informatique, Les equations differentielles

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

Page 21: Equa Diff 01Informatique, Les equations differentielles

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

Page 22: Equa Diff 01Informatique, Les equations differentielles

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