Vous êtes sur la page 1sur 9

RÉSOLUTION NUMÉRIQUE DES ÉQUATIONS DIFFÉRENTIELLES

1. Equations différentielles du premier ordre


 De nombreux problèmes conduisent à la résolution d'équations différentielles du premier ordre
du type :

dy y ' ( t )=f (t , y ( t ) )
dt
=f ( t , y ) Ecrite aussi
{
 :
¿ y (t 0)= y0
(1).

a. Méthode d’Euler

 Lorsqu'il n'est pas possible d'obtenir une solution explicite sous forme de fonctions usuelles, on
détermine une solution approchée (numérique). Il existe plusieurs méthodes permettant de
réaliser ceci. L'une d'entre elles est la méthode d'Euler qui sera étudiée ici.

 On veut déterminer une solution approchée de l’équation différentielle :

y ' ( t )=f (t , y ( t ))

Où : t → f (t , y ( t ) ) est une fonction continue sur l’intervalle [a,b].

avec une condition initiale : y(a)=y0

 On considère une subdivision régulière t = (t0, t1, …, tn) de [a,b] de pas h =(b-a)/n, on a donc :
ti =t0+ih =a+ih
Si h est suffisamment petit on a :
t k+ 1

y ( t k+1 )− y ( t k )=∫ f ( t , y ( t ) ) dt ≅ hf ( t k , y (t k ))
tk

 Les approximations sont alors calculées de proche en proche par :

y k +1= y k +h . f (t k , y k )

Voici une implémentation de la méthode Euler en python

import numpy as np
def euler(f,a,b,y0,n):
'''
integration de y'(t)=f(t,y(t)) par la méthode d'Euler sur un intervalle [a,b] avec
n points et la condition initiale y(a)=y0 (a,y0)
'''
t=np.linspace(a,b,n+1)
y=np.zeros(n+1) # tableau de n+1 éléments
y[0]=y0
h=(b-a)/n
for k in range(n):
y[k+1]=y[k]+h*f(t[k],y[k])
return(t,y)
Exemple 1 :

Résolution d’équations différentielles -1- M.GUEROIHI


Résoudre l’équation : y′=2.x.y2 sur[0, 2] (on prendra une subdivision de 100 points) avec la condition initiale
y(0)=0.2 :

import matplotlib.pyplot as plt


f=lambda x,y: 2*x*y**2 #équivalent à def f(x,y) : return 2*x*y**2
(x,y)= euler(f,0,2, 0.2,100)
print(x,y)
plt.plot(x,y)
plt.grid()
plt.show()

Exemple 2 :
Illustrons l'utilisation de la fonction Euler pour trouver une solution approchée de l'équation :
y' = - y intégrée sur [0,5] avec la condition initiale y(0)=1.

import matplotlib.pyplot as plt


f = lambda x,y: -y #équivalent à def f(x,y) : return -y
(x,y)= euler(f,0,5, 1,100)
print(x,y)
plt.plot(x,y)
plt.grid()
plt.show()

b. Fonction 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 via :

from scipy.integrate import odeint


 L'utilisation se fait sous la forme :

odeint(f, y0,t)

#utilisation fonction odeint

Exemple 1 :
Résoudre l’équation : y′=2.x.y2 sur[0, 2] (on prendra une subdivision de 100 points) avec la condition initiale
y(0)=0.2 en utilisant la fonction odeint:

from scipy.integrate import odeint


x = np.linspace(0,2,100)
f=lambda y,x: 2*x*y**2
y=odeint(f,.2,x)
plt.plot(x,y)
plt.grid()
plt.show()

Exemple 2 :

Résolution d’équations différentielles -2- M.GUEROIHI


Illustrons l'utilisation de la fonction Euler pour trouver une solution approchée de l'équation :
y' = - y intégrée sur [0,5] avec la condition initiale y(0)=1 en utilisant la fonction odeint:
from scipy.integrate import odeint
f=lambda y,x: -y
a=0
b=5
n=100
t=np.linspace(a,b,n)
y=odeint(f,1,t)
print(t,y)
plt.plot(t,y)
plt.grid()
plt.show()

Exercice 1 :
A l'aide de la fonction odeint( ) du sous-module integrate de scipy, et du module matplotlib.pyplot, donner le code
permettant de tracer la courbe représentative sur l'intervalle [0,4] (on prendra une subdivision de 100 points) de la
y ' + √ t . y=0
solution approchée de l’équation suivante : { ¿ y ( 0 )=1

Correction
import matplotlib.pyplot as plt
from scipy import integrate
phi = lambda y,t: -y * t**0.5
t = np.linspace(0,4,100)
y0 = 1
y = integrate.odeint(phi,y0,t)
plt.plot(t,y)
plt.show()

Exercice 2 : Evolution d’une température en chimie


On note y(t) la température en degrés Celsius d’une réaction chimique en fonction du temps t, t étant
exprimé en heures.
Après étude, on constate que la température est solution de l’équation différentielle :
' −0 , 25 t
y + y=e
Avec la condition initiale y(0)=20°C.
- Ecrire un programme qui donne un tableau composé des températures de la réaction chimique chaque
demi-heure pendant la première journée de la réaction.
- Tracer la courbe représentative de cette solution
Correction
import numpy as np

Résolution d’équations différentielles -3- M.GUEROIHI


from scipy.integrate import odeint
import matplotlib.pyplot as plt
t=np.arange(0,24.5,0.5)
phi = lambda y,t:(np.exp(-0.25*t))-y
s = odeint(phi,20,t)
print(s)
plt.plot(t,s)
plt.show()

2. Equations différentielles d’ordre 2


Si on cherche à intégrer l’équation différentielle d’ordre 2 : y′′= g(y, y′ , x) on la transforme en une équation

différentielle d’ordre 1 en posant z =(y, y′) donc z′ =(y′,y′′), l’équation différentielle peut alors s’écrire :

z′= f(z , x)

en posant f( (y, dy) , x) = (dy , g(y, dy ,x)).

La subdivision[x0, x1,..., xn] de l’intervalle sur lequel on intègre l’équation différentielle reste la même, par contre la

condition initiale doit être un couple (y(x0), y′(x0)) et la valeur de retour est une matrice numpy dont la première

colonne est constituée des valeurs y(xk) et la seconde des valeurs y′(xk).

Résolution d’équations différentielles -4- M.GUEROIHI


Exemple 1: résolution de : y′′+ y′+ xy =0 sur le segment [1, 2] avec la condition initiale (y(0)=1, y′(0)=0).

a. Fonction odeint

from scipy.integrate import odeint


import matplotlib.pyplot as plt
import numpy as np

def f(z,x):
(y,dy)=z
return(dy,-dy-x*y)

>>>x=np.linspace(1.,2.,4)
>>>y=odeint(f,(1,0),x)
>>>print(y)
[[ 1. 0. ]
[ 0.94502133 -0.32624253]
[ 0.78778807 -0.60463152]
[ 0.55333316 -0.78078941]]

>>>print(y[:,0]) #première colonne: valeurs prises par y


[ 1. 0.94502133 0.78778807 0.55333316]

>>>plt.plot(x,y[:,0])
>>>plt.grid() ; plt.show()

b. Méthode d’Euler
import numpy as np
def euler2 (F, a, b, z, n): # z= (y(0), y'(0))
x=np.linspace(a,b,n+1)
h =(b-a)/n
y =np.zeros(n+1)
dy=np.zeros(n+1)
y[0] = z[0]
dy[0]= z[1] #peut s'écrire (y[0],dy[0])=z
for k in range(n):
y[k+1] = y[k] +h*F(x[k],(y[k],dy[k]))[0]
dy[k+1]= dy[k]+h*F(x[k],(y[k],dy[k]))[1]
return x,y

import matplotlib.pyplot as plt


def f(x,z):
(y,dy)=z
return(dy,-dy-x*y)

(x,y)= euler2(f,1,2,(1,0),10)
print(x)
print(y)
plt.plot(x,y)
plt.grid() ; plt.show()

Résolution d’équations différentielles -5- M.GUEROIHI


Exemple 2 : résolution de l’équation y''=-y dans l’intervalle [0,2] avec y(0)=0 et y’(0)=1

def f(x,z):
(y,dy)=z
return(dy,-y)

(x,y)=euler2(f,0,2*np.pi,(0,1),100)
print(x)
print(y)
plt.plot(x,y)
plt.plot(x,np.sin(x))
plt.xlabel('t') #Etiquette sur l'axe x
plt.ylabel('y(t)') #Etiquette sur l'axe y

plt.legend(('y','sin(x)'),'upper right', shadow=True)


plt.title('Résoluton de y\'\'=-y avec y(0)=0 et y\'(0)=1')
plt.grid()
plt.show()

Résolution d’équations différentielles -6- M.GUEROIHI


Exercice 3 :
Résoudre l’équation : ÿ +2 y+ ω20 =A cos(ωt) dans l’intervalle [0,4] avec une subdivision de 100 points ;
avec : y(0)=1 ; y'(0)=0 ; A=1.5 ; ω=1 ; ¿ 0.01 ; ω 0=2
Puis tracer la solution :

#importations
from scipy.integrate import *
from numpy import *
import matplotlib.pyplot as plt

#fonction f(z,t)
def f(z,t) :
y,dy=z
return (dy, -2*lamb*dy-w0**2*y+A*cos(w*t))

#Appel
lamb,w0,A,w =0.01,1.0,1.5,2.
z=[1.,0.]
t=linspace(0,4*pi,100)
d=odeint(f,z,t)
S=d[:,0]
plt.plot(t,S)
plt.grid()
plt.show()

Résolution d’équations différentielles -7- M.GUEROIHI


Exercice 4 : Le parachute
La trajectoire suivie par un objet relié à un parachute est un axe vertical noté (O,
⃗i ).

A un instant donné, le vecteur vitesse V de l’objet est défini par


⃗ V⃗ (t )=ν(t ) ⃗i
où v est une fonction de la variable réelle positive t (temps).

Dans ces conditions de l’expérience, le vecteur


⃗R représentant la résistance
de l’air est défini par
⃗R=−k V⃗ où k est un nombre réel strictement positif. (Voir
Figure ci-après)
On admet que la position x(t) de l’objet et du parachute vérifie l’équation
différentielle suivante :
m ẍ ( t )+ kx ( t )=mg
où m est la masse totale de l’objet et du parachute et g le coefficient de l’accélération de la pesanteur.
A partir de l’équation différentielle donner un programme de résolution numérique qui nous permet
de donner comme résultat la distance x de la chute (l’objet + parachute) après 2 minutes avec un pas de 2
seconds.
On prendra :
m=8 kg, g=10 m s-2, k=25 unités SI, position initiale x(0)=0m et vitesse initiale v(0)=v0=3,2 m s-1.
#importations
from numpy import arange
from scipy.integrate import odeint
import matplotlib.pyplot as plt
#fonction
def phi(z,t):
y, dy= z
return([dy , g-((k*dy)/m)])

#Résolution

t=arange(0.,121.,2)
x0=0.
v0=3.2
m=8
g=10
k=25
s=odeint(phi,(x0,v0),t)
x=s[:,0]
print(x)
print(x[-1])
plt.plot(t,x)
plt.grid()
plt.show()

Résolution d’équations différentielles -8- M.GUEROIHI


Exercice 5 : Etude d'un circuit RC
L'équation différentielle qui régit l'évolution de la tension aux bornes du condensateur d'un circuit RC en
régime libre s'écrit sous la forme:
d U c (t) 1
+ U ( t )=0
dt RC c
1. Ecrire une fonction qui implémente la méthode d'Euler-Cauchy d'intégration d'une équation-différentielle
du premier ordre.
2. On suppose qu'initialement Uc (t = 0) = 1V ; R = 1kΩ; C = 1nF. Réaliser l'intégration de l'équation-
différentielle précédente par la méthode d'Euler-Cauchy entre t=0 et 0.1ms, avec une subdivision de 1000
segments.
3. Donner le code permettant d'effectuer le tracé de la courbe représentative de U c (t) pour t variant de 0 à
0.1ms.
Exercice 6 : Circuit RLC en série.
On considère un circuit électrique constitué d'une source de tension V, d'une
résistance R, d'une bobine L et d'une capacité C montés en série.
d2uL R d uL 1 d2 V
UL satisfait l’équation différentielle: + + u L= 2
d t 2 L dt LC dt

C’est une équation différentielle du second ordre à coefficient constant avec second
membre :
R 1 2 2 d2 V
ÿ ẏ+ y=−4❑ f sin(2 ft )= 2
L LC dt

Question : Tracer la courbe de la tension aux bornes de la bobine pour V(t) = sin(2ft) sur un intervalle de
temps de 1 seconde (on prendra 10000 points) pour f = 100Hz, R = 10, L = 870mH, C = 650mF. A l'instant
initial aux bornes de la bobine la tension est nulle ainsi que sa dérivée.

Exercice 7 : Pendule simple


Pour le pendule simple (non amorti) l’angle avec la verticale suit une équation différentielle de la forme :
θ̈=−sin ⁡( θ) [1]
Q 1 : Résoudre numériquement et représenter la solution vérifiant les conditions initiales :
θ ( 0 ) =0.2 et θ̇ ( 0 ) =0.2
Q 2 : Dans le cas des petits angles, on a sin ⁡(θ)≈ θ , et l’on retrouve l’équation différentielle d’un oscillateur harmonique
:
θ̈=−θ [2]
Résoudre numériquement et représenter la solution vérifiant les conditions initiales θ ( 0 ) =0.2 et θ̇ ( 0 ) =0.2.
Y a-t-il une différence importante entre les solutions de [1] et [2] ?
Q 3 : En prenant toujours θ ( 0 ) =0, représenter les solutions de [1] vérifiant les conditions initiales :
θ̇ ( 0 ) ={ 1,1.9,2,2.1,3 }.
Q 4 : Avec les différentes conditions initiales vues plus haut, représenter le portrait de phase c’est-à-dire l’ensemble des
points des couples (θ , θ̇) .
Q 5 : Reprendre les questions précédentes avec un pendule amorti : θ̈=−sin ( θ )−¿ kθ ¿
On pourra prendre k = 1 dans un premier temps, et éventuellement jouer sur la valeur de ce paramètre (qui modélise
l’amortissement).

Résolution d’équations différentielles -9- M.GUEROIHI

Vous aimerez peut-être aussi