Вы находитесь на странице: 1из 22

Resolution dequations differentielle I

odeint() et methode dEuler


MP

Equations diff
erentielles du 1er ordre
Int
egration d
equations diff
erentielle sous scipy
Equation diff
erentielles dordres sup
erieurs
M
ethode dEuler

Equations differentielles du 1er ordre

Integration dequations differentielle sous scipy

Equation differentielles dordres superieurs

Methode dEuler
Methode dEuler scalaire
Methode dEuler vectorielle
Exemple : Cinetique chimique
Exemple : Oscillateur harmonique

Equations diff
erentielles du 1er ordre
Int
egration d
equations diff
erentielle sous scipy
Equation diff
erentielles dordres sup
erieurs
M
ethode dEuler

Equations differentielles du 1er ordre


Soit une application reelle definie sur une partie de R2 . Resoudre, ou integrer,
une equation differentielle dordre 1 de la forme :
y = (x, y )

(E )

Cest determiner toutes les application y definies et derivables sur un ouvert I


de R et verifiant :
x I , y (x) = (x, y (x))
Resoudre une equation differentielle y = (x, y ) avec condition initiale
y0 = y (x0 ) qui peut secrire aussi (x0 , y0 ) (avec (x0 , y0 ) dans le domaine D de
) consiste `
a determiner une solution y `
a lequation differentielle verifiant
y (x0 ) = y0 . On parle aussi de Probl`eme de Cauchy.
Th
eor`
eme de Cauchy-Lipschitz : Si est de classe C 1 sur un domaine D ouvert
2
de R , lequation differentielle y = (x, y ) avec la condition initiale y0 = y (x0 )
(o`
u (x0 , y0 ) D) admet une unique solution maximale. Toute autre solution est
une restriction de la solution maximale.
Une solution est maximale, si elle ne peut pas se prolonger en une solution.

Equations diff
erentielles du 1er ordre
Int
egration d
equations diff
erentielle sous scipy
Equation diff
erentielles dordres sup
erieurs
M
ethode dEuler

Integration dequations differentielles sous scipy


La methode odeint() du sous-module integrate de scipy permet
lintegration dequations differentielles avec condition initiale :
Utilisation : Prenons lexemple de lintegration sur [1, 1] de lE.D. :
y = t

dont lunique solution est y (t) =

avec y (1) =

1
2

t2
. (Cest en fait ici une recherche de
2

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
# trac
e
>>> plt.plot(t,y) ; plt.grid() ; plt.show()

Equations diff
erentielles du 1er ordre
Int
egration d
equations diff
erentielle sous scipy
Equation diff
erentielles dordres sup
erieurs
M
ethode dEuler

Integration dequations differentielles sous scipy

Voici le trace obtenu. Il correspond bien au resultat attendu : y (t) =


lintervalle [1, 1].

t2
sur
2

Equations diff
erentielles du 1er ordre
Int
egration d
equations diff
erentielle sous scipy
Equation diff
erentielles dordres sup
erieurs
M
ethode dEuler

Integration dequations differentielles sous scipy


Autre exemple :

y = y

avec y (0) = 1

a pour unique solution y (t) = e .


>>>
>>>
>>>
>>>
>>>
>>>

phi = lambda y,t: -y


# fonction second membre
t = np.linspace(0,4,100) # 100 e
chantillons entre 0 et 4
y0 = 1
# valeur initiale au temps t[0] = 0
y = integrate.odeint(phi,y0,t)
# int
egration
plt.plot(t,y)
# trac
e
plt.grid() ; plt.show()

Equations diff
erentielles du 1er ordre
Int
egration d
equations diff
erentielle sous scipy
Equation diff
erentielles dordres sup
erieurs
M
ethode dEuler

Equa. diff. dordre superieur


La fonction integrate.odeint permet aussi de resoudre des syst`emes
dequations differentielles (2 ou plus) :
{

y1 = f1 (y1 , t)
y2 = 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)]).
Cest cette fonctionnalite que lon utilise pour resoudre des equations
differentielles dordre superieur :
Exemple : y = cos(t)
avec y (0) = 1 et y (0) = 0
a pour solution evidente y (t) = cos(t).
Lequation differentielle est equivalente au syst`eme (probl`eme de Cauchy) :

d
y = y
dt
d
y = cos(t)
dt

avec : y (0) = 1 et y (0) = 0

Equations diff
erentielles du 1er ordre
Int
egration d
equations diff
erentielle sous scipy
Equation diff
erentielles dordres sup
erieurs
M
ethode dEuler

Equa. diff. dordre superieur


Le syst`eme :

dt y = y
avec : y (0) = 1 et y (0) = 0

y = cos(t)

dt
secrit comme un probl`eme de Cauchy vectoriel :
d
y
y
( )=(
)
y
cos(t)
dt
En posant Y = (

et

y (0)
1
)=(
)
y (0)
0

y
Y [0]
)=(
):
y
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 r
eguli`
ere de [0,6]
y0 = np.array([-1,0])
# array des conditions initiales
y = integrate.odeint(F,y0,t)
# appel de odeint

Equations diff
erentielles du 1er ordre
Int
egration d
equations diff
erentielle sous scipy
Equation diff
erentielles dordres sup
erieurs
M
ethode dEuler

Equa. diff. dordre 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).

Equations diff
erentielles du 1er ordre
Int
egration d
equations diff
erentielle sous scipy
Equation diff
erentielles dordres sup
erieurs
M
ethode dEuler

M
ethode dEuler scalaire
M
ethode dEuler vectorielle
Exemple : Cin
etique chimique
Exemple : Oscillateur harmonique

Methode dEuler (ou dEuler-Cauchy)


Soit lequation differentielle f (x) = (x, f (x)) o`
u est definie sur I R avec I
un 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 dEuler-Cauchy consiste `
a considerer une subdivision reguli`ere de
et `
a calculer de proche en
[a, b] en n segments, soit n + 1 points xk = a + k ba
n
proche une valeur approchee de yk = f (xk ) en approximant la fonction f par
son DL dordre 1 en xk (tangente).
La suite (yk )0kn est ce que lon entend par une resolution approchee du
probl`eme de Cauchy.
Cest `
a dire, une fois yk determine, on trouve yk+1 par :
yk+1 = yk +

xk+1
xk

f (x)dx = yk +

xk+1

(t, f (t))dt

xk

yk + f (xk )(xk+1 xk ) yk + (xk , yk ).

ba
yk+1
n

Equations diff
erentielles du 1er ordre
Int
egration d
equations diff
erentielle sous scipy
Equation diff
erentielles dordres sup
erieurs
M
ethode dEuler

M
ethode dEuler scalaire
M
ethode dEuler vectorielle
Exemple : Cin
etique chimique
Exemple : Oscillateur harmonique

Methode dEuler
import numpy as np
import matplotlib.pyplot as plt
def euler(a,b,Phi,y0,n):
"""M
ethode de Cauchy Euler dint
egration approch
ee 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 r
eguli`
ere 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 m
ethode
dEuler-Cauchy ne fonctionne quavec des
equations diff
erentielles scalaires du premier ordre (nous
verrons plus loin comment en donner une version vectorielle : remplacer par une liste que lon
remplit successivement de vecteurs).

Equations diff
erentielles du 1er ordre
Int
egration d
equations diff
erentielle sous scipy
Equation diff
erentielles dordres sup
erieurs
M
ethode dEuler

M
ethode dEuler scalaire
M
ethode dEuler vectorielle
Exemple : Cin
etique chimique
Exemple : Oscillateur harmonique

Methode dEuler-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
(qui nest pas definie en x = 1...).
1x

Equations diff
erentielles du 1er ordre
Int
egration d
equations diff
erentielle sous scipy
Equation diff
erentielles dordres sup
erieurs
M
ethode dEuler

M
ethode dEuler scalaire
M
ethode dEuler vectorielle
Exemple : Cin
etique chimique
Exemple : Oscillateur harmonique

Methode dEuler vectorielle


Elle prend pour param`etre :
1. La fonction vectorielle,
2. Les conditions initiales, sous forme dun vecteur Y0 ,
3. Les bornes a, b de resolution,
4. le pas h (ou le nombre de points n + 1 avec h = ba
, au choix).
n
# 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

Equations diff
erentielles du 1er ordre
Int
egration d
equations diff
erentielle sous scipy
Equation diff
erentielles dordres sup
erieurs
M
ethode dEuler

M
ethode dEuler scalaire
M
ethode dEuler vectorielle
Exemple : Cin
etique chimique
Exemple : Oscillateur harmonique

Cinetique chimique
Prenons le cas dune solution composee de reactifs A, B, C , o`
u deux
reactions chimiques A B et B C dordre 1 rentrent en jeu selon les lois.

d[A]

= [A]

dt

[A]
[A]

d
d[B]
[B] = [A] [B]

= [A] [B]

dt
dt

[C ]

[B]

d[C ]

=
[B]

dt
On sinteresse `
a levolution des concentrations des 3 reactifs A , B, C entre 0
et 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)

Equations diff
erentielles du 1er ordre
Int
egration d
equations diff
erentielle sous scipy
Equation diff
erentielles dordres sup
erieurs
M
ethode dEuler

M
ethode dEuler scalaire
M
ethode dEuler vectorielle
Exemple : Cin
etique chimique
Exemple : 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()

Equations diff
erentielles du 1er ordre
Int
egration d
equations diff
erentielle sous scipy
Equation diff
erentielles dordres sup
erieurs
M
ethode dEuler

M
ethode dEuler scalaire
M
ethode dEuler vectorielle
Exemple : Cin
etique chimique
Exemple : 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 deplace
dans un plan vertical ; il est situe au bout dune tige rigide de longueur l et de
masse nulle tournant sans frottement autour de son extremite fixe.

Equations diff
erentielles du 1er ordre
Int
egration d
equations diff
erentielle sous scipy
Equation diff
erentielles dordres sup
erieurs
M
ethode dEuler

M
ethode dEuler scalaire
M
ethode dEuler vectorielle
Exemple : Cin
etique chimique
Exemple : Oscillateur harmonique

Oscillateur harmonique : pendule sans frottement

Nous allons :
1. Trouver une equation differentielle satisfaite pas son elongation angulaire
(t).
2. Resoudre numeriquement lequation differentielle avec une position initiale
egale `
a (0) = 2 , une vitesse initiale nulle, et avec g = 9, 81m.s 1 et
l = 10cm.
3. Verifier la propriete de conservation de lenergie, cest `
a dire que :
1 2
l [(t)]2 g l cos (t)
2
reste constant au cours du temps.

Equations diff
erentielles du 1er ordre
Int
egration d
equations diff
erentielle sous scipy
Equation diff
erentielles dordres sup
erieurs
M
ethode dEuler

M
ethode dEuler scalaire
M
ethode dEuler vectorielle
Exemple : Cin
etique chimique
Exemple : Oscillateur harmonique

Oscillateur harmonique : pendule sans frottement


Lenergie mecanique du syst`eme est :
1
mv 2 + mg (h + cte)
2
1
2 + mgl(1 cos )
= m (l )
2

Em = Ec + Ep =

En labsence de frottement lenergie mecanique du syst`eme est constante.


dEm
= ml 2 + mgl sin = 0
dt
g
+ sin = 0
l
=
/0
g
= sin
l

(t)

(t)
d
g
(
)=
dt (t)
sin ((t))
l

Equations diff
erentielles du 1er ordre
Int
egration d
equations diff
erentielle sous scipy
Equation diff
erentielles dordres sup
erieurs
M
ethode dEuler

M
ethode dEuler scalaire
M
ethode dEuler vectorielle
Exemple : Cin
etique chimique
Exemple : 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)
# R
esolution
plt.plot(t,y)
plt.legend((theta(t),d theta(t)/ dt))
plt.show()
On utilise comme fonction :
y1

d
y0
g
F (
) , t z
avec
Y = F (Y , t)
sin(y

y1
0)
dt

Equations diff
erentielles du 1er ordre
Int
egration d
equations diff
erentielle sous scipy
Equation diff
erentielles dordres sup
erieurs
M
ethode dEuler

M
ethode dEuler scalaire
M
ethode dEuler vectorielle
Exemple : Cin
etique chimique
Exemple : Oscillateur harmonique

Oscillateur harmonique : pendule sans frottement

Essayer la commande (LATEX) :


plt.legend(($/theta(t)$,$/frac{/theta(t)}{dt}$))
pour obtenir un plus joli r
esultat.

Equations diff
erentielles du 1er ordre
Int
egration d
equations diff
erentielle sous scipy
Equation diff
erentielles dordres sup
erieurs
M
ethode dEuler

M
ethode dEuler scalaire
M
ethode dEuler vectorielle
Exemple : Cin
etique chimique
Exemple : Oscillateur harmonique

Oscillateur harmonique : pendule sans frottement


Verifier la propriete de conservation de lenergie, cest `
a dire que reste constant
au cours du temps. :
1 2
l [(t)]2 g l cos (t)
2
2 mgl cos().
On calcule lechantillonnage de lenergie mecanique : 1 m (l )
2

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 : Lenergie mecanique sobtient aussi sans boucle for et par
slicing :
E = 0.5 * l ** 2 * y[ : , 1] ** 2 - g * l * np.cos(y[ : , 0])

Equations diff
erentielles du 1er ordre
Int
egration d
equations diff
erentielle sous scipy
Equation diff
erentielles dordres sup
erieurs
M
ethode dEuler

M
ethode dEuler scalaire
M
ethode dEuler vectorielle
Exemple : Cin
etique chimique
Exemple : Oscillateur harmonique

Oscillateur harmonique : pendule sans frottement

La fluctuation de lenergie est de lordre de 107 . Elle est due aux erreurs
dapproximation. Pour eviter ce phenom`ene : plt.axis(equal) :
plt.axis(equal)
Ou encore :
plt.axis([0, 6, -2.2, 2.2])

# Donne la fen^
etre a
` afficher.

Вам также может понравиться