Équations Différentielles : Méthodes Numériques (Euler, RK2, RK4)

Telechargé par Mohemed Najih
25/03/2019
1
Résolution approchée d’équations
différentielles
Ingénierie numérique et simulation
HICHAM HATIMI
www.hatimi.net
1
I. Les équations scalaires d’ordre 1
1. Introduction
Soit n N* et U un ouvert de RxR . Une équation différentielle
d’ordre 1 (résolue) est une équation de la forme :
y'(t) = F(y(t), t)
F est une application continue sur U à valeurs dans Rn etla
fonction inconnue y est de classe C1 sur un certain intervalle de R, à
valeurs dans Rn.
Dans le cas n = 1, on parle d’une equation différentielle
scalaire ; dans le cas general, on obtient un système différentiel.
Si (t0, y0) U, résoudre le problème de Cauchy en (t0, y0), c’est trouver
un couple (I, y) I est un intervalle de R et y est une fonction de
classe C1 de I dans Rn tels que :
y(t0) = y0 et t I y'(t) = F(y(t), t)
2
I. Les équations scalaires d’ordre 1
2. La méthode d’Euler
Principe :
On cherche à résoudre sur [a, b] l’équation de la forme:
y'( t) = f( y( t), t) avec y( t0) = y0
Si y(t) est de classe C1 alors, connaissant y(ti), on peut évaluer de
façon approché, y(ti+1) par son développement de Taylor à l’ordre
1:
y(ti+1) = y(ti) + y'(ti)*(ti+1 − ti)
Soit en posant h = ti+1 ti et avec y’(ti) = f(y(ti), ti) :
y(ti+1) = y(ti) + f(y(ti), ti)*h
Connaissant y(a), on évalue par itérations successives les valeurs
approchées de la fonction y(t) :
[y(a), y(a + h), y(a + 2h), y(a + 3h)...y(b − h), y(b)]
3
I. Les équations scalaires d’ordre 1
2. La méthode d’Euler
Interprétation géométrique :
4
I. Les équations scalaires d’ordre 1
2. La méthode d’Euler
Implémentation de la méthode d’Euler en Python :
5
############Solution 1 en utilisant les listes############
def Euler(f,a,b,y0,h) :
y=y0
t=a
yi =[y0]
ti =[a]
while t+h <= b :
y =y+ h * f(y,t)
t=t+h
yi.append(y)#On peut faire yi=yi+[y]
ti.append(t)
return ti, yi
I. Les équations scalaires d’ordre 1
2. La méthode d’Euler
import numpy as np
import matplotlib.pyplot as pl
######Definir la fonction F
def F(y,t) :
return y
h=(5-0)/50#51 point
y0=1
#La fonction Euler de Solution 1
L= Euler(F,0,5,y0,h)
pl.plot(L[0],L[1])
pl.xlabel('temps')
pl.ylabel('y(t) ')
pl.show()
6
Exemple d'utilisation 1 :
25/03/2019
2
I. Les équations scalaires d’ordre 1
2. La méthode d’Euler
#######Solution 2 en utilisant les listes ##########
def Euler(f,a,b,y0,h) :
y=y0
t=a
yi=[y0]
ti =[a]
n=int((b-a)/h)
for i in range(1,n+1) :
y =y+ h * f(y,t)
t=t+h
yi.append(y)
ti.append(t)
return ti, yi
7
I. Les équations scalaires d’ordre 1
2. La méthode d’Euler
import numpy as np
import matplotlib.pyplot as pl
######Definir la fonction F
def F(y,t) :
return y
h=(5-0)/50
y0=1
#La fonction Euler de Solution 2
L= Euler(F,0,5,y0,h)
pl.plot(L[0],L[1])
pl.xlabel('temps')
pl.ylabel('y(t) ')
pl.show()
8
Exemple d'utilisation 2 :
I. Les équations scalaires d’ordre 1
2. La méthode d’Euler
############Solution 3#### ########
def Euler(f,a,b,y0,n) :
#générer un vecteur de n+1 valeurs
y=np.array([0]*(n+1),dtype='float')
#générer le vecteur t=[t0,t1,... ,tn]
t=np.linspace(a,b,n+1)
y[0]=y0
h=(b-a)/n
for i in range(1,n+1) :
y[i]=y[i-1]+h*f(y[i-1],t[i-1])
return y
9
Code en utilisant le module numpy:
I. Les équations scalaires d’ordre 1
2. La méthode d’Euler
import numpy as np
import matplotlib.pyplot as pl
######Definir la fonction F
def F(y,t) :
return y
t= np.linspace(0, 5, 51)
y0=1
#La fonction Euler de Solution 3
y= Euler(F,0,5,y0,50)
pl.plot(t,y)
pl.xlabel('temps')
pl.ylabel('y(t) ')
pl.show()
10
Exemple d'utilisation 3 :
I. Les équations scalaires d’ordre 1
2. La méthode d’Euler
11
############Solution 4#### ########
#Entrée : une fonction f, la condition initiale y0 et un
vecteur t=[t0,t1,..,tn-1]
#Sortie : y un vecteur qui contient la solution de l’équation
def Euler(f,y0,t) :
n=len(t)
y=np.array([y0]*n,dtype='float')
for i in range(n-1) :
y[i+1]=y[i]+(t[i+1]-t[i] )*f(y[i],t[i])
return y
I. Les équations scalaires d’ordre 1
2. La méthode d’Euler
import numpy as np
import matplotlib.pyplot as pl
######Definir la fonction F
def F(y,t) :
return y
t= np.linspace(0, 5, 51)
y0=1
#La fonction Euler de Solution 3
y= Euler(F,y0,t)
pl.plot(t,y)
pl.xlabel('temps')
pl.ylabel('y(t) ')
pl.show()
12
Exemple d'utilisation 4 :
25/03/2019
3
I. Les équations scalaires d’ordre 1
2. La méthode d’Euler
Exemple d'utilisation 2 :
Considérons l’équation différentielle du premier ordre relative à la charge d’un
condensateur :
C=1e-6
R=1e3
tau=R*C
E=6
u0=0
def equation(u,t) :
y=-u/tau+E/tau
return y
t= np.linspace(0,5*tau,1000)
#La fonction Euler donnée dans sol 4
y=Euler(equation,u0,t)
pl.plot(t,y)
pl.show()
13
I. Les équations scalaires d’ordre 1
3. La méthode de Heun, ou RK2
####Solution en utilisant les listes#
def Heun(F, a, b, y0, n) :
h= (b - a)/n
X = [a]
t = a
Y = [y0]
y = y0
for k in range(0, n) :
k1= F(y, t)
k2=F(y+h*k1,t+h)
y = y + h*(k1+k2)/2
t = t + h
X.append(t)
Y.append(y)
return X, Y
14
Implémentation de la méthode RK2
I. Les équations scalaires d’ordre 1
3. La méthode de Heun, ou RK2
#########Solution en utilisa nt le module numpy#########
import numpy as np
def Heun(f,y0,t) :
n = len(t)
y = np.array( [ y0 ] * n,dtype='float' )
for i in range(n-1) :
h=t[i+1] - t[i]
k1= f( y[i],t[ i] )
k2 = f( y[i] + k1*h,t[i+1])
y[i+1] = y[i] + h*( k1 + k2 ) / 2.0
return y
15
I. Les équations scalaires d’ordre 1
4) La méthode de Runge-Kutta (ou RK4)
16
L'équation de Runge-Kutta (ou RK4) :
yn+1=yn +h* (k1+2k2+2k3+k4)/6
Sachant que :
k1=f(xn,yn)
k2=f(xn+h/2,yn+hk1/2)
k3=f(xn+h/2,yn+hk2/2)
k4=f(xn+h,yn+hk3)
I. Les équations scalaires d’ordre 1
4) La méthode de Runge-Kutta (ou RK4)
#########Solution en utilisant les listes#########
def RK4(F, a, b, y0, n) :
h= (b - a) / n
h2= h/ 2
X = [a]
t = a
Y = [y0]
y = y0
for k in range(0, n) :
K1 = F(t, y)
K2 = F(t + h2, y + h2* K1)
K3 = F(t + h2, y + h2* K2)
K4 = F(t + h, y + h* K3)
y = y + h* (K1 + 2 * K2 + 2 * K3 +K4) / 6
t = t + h
X.append(t)
Y.append(y)
return X, Y
17
I. Les équations scalaires d’ordre 1
4) La méthode de Runge-Kutta (ou RK4)
#######Solution en utilisa nt le mo dule numpy#####
import numpy as np
def RK4(f,y0, t ) :
n = len( t )
y = np.array( [ y0 ] * n,dtype='float' )
for i in range( n - 1 ) :
h = t[i+1] - t[i]
k1 = f(y[i], t[i] )
k2 = f( y[i] + h* k1/2, t[i] + 0.5 * h )
k3 = f( y[i] + h* k2/2, t[i] + 0.5 * h )
k4 = f( y[i] + h*k3, t[i+1] )
y[i+1] = y[i] + h*( k1 + 2.0 * ( k2 + k3 ) + k4 ) / 6.0
return y
18
25/03/2019
4
I. Les équations scalaires d’ordre 1
5) La fonction odeint
Le module scipy.integrate fournit la fonction odeint qui est un ”mix” de
Runge Kutta d’ordre 4 avec des méthodes à pas adaptatif. La fonction odeint
permet de résoudre les équations différentielles du premier ordre et du
deuxième ordre.
Syntaxe et utilisation
from scipy.integrate import odeint
Ys=odeint(f,CondInit,t)
f pointe sur la fonction CONNUE f dans y’(t)=f(y(t),t). Attention : le premier
argument de f est la fonction vectorielle inconnue y.
CondInit pointe sur le vecteur des conditions initiales.
y(t0)= [y1(t0), y2(t0), ....yn(t0)]
t pointe sur les points définissant le découpage de l’intervalle de résolution
I = [t0 ; t0 + T]
La solution Ys contient les valeurs des solutions approchées sur les différents
points indiques de I
19
Les équations scalaires d’ordre 1
La fonction o deint
I. Les équations scalaires d’ordre 1
5) La fonction odeint
Exemple 1 d’utilisation de la fonction odeint. Considérons l’équation
différentielle du premier ordre
import numpy as np
from scipy.integrate import odeint
import matplotlib.pyplot as pl
def F(y,t) :
return y
t= np.linspace(0, 5, 50)
y= odeint(F, 1, t)
pl.plot(t,y)
pl.show()
20
II. Les équations différentielles d’ordre 2
1. Représentation matricielle
21
II. Les équations différentielles d’ordre 2
2. La méthode d’Euler
22
L’objectif est de résoudre léquation différentielle du second ordre:
def F(Y,t) :
return np.array([Y[1],f(Y[0],Y[1],t)])
def Euler2(F,a,b,Y0,n) :
h=(b-a)/n
t=np.linspace(a,b,n+1)
SY=np.array([[0.0,0.0] for i in range(n+1)])
SY[0]=Y0
for i in range(1,n+1) :
SY[i]=SY[i-1]+ h*F(SY[i-1],t[i-1])
return SY
y’ =f(y,y’,t)
Y= [y(t) ,y’(t)]
Y’=F(Y , t) = [y’(t) , f( y, y’,t) ]=[Y[1],f(Y[0],Y[1],t)]
II. Les équations différentielles d’ordre 2
2. La méthode d’Euler
23
Exemple Considérons l’équation différentielle du second
ordre
x’ =f(x,x’,t)
X= [x(t) ,x’(t)]
X =F(X(t),t)
X(t0)= [x(t0) ,x’(t0)]
F(X , t) = [x’(t) , f( x, x’,t) ]=[X[1],0.5*(1-X[0]**2)*X[1]-X[0]]
II. Les équations différentielles d’ordre 2
2. La méthode d’Euler
24
def F(Y,t) :
return np.array([Y[1],0.5*(1-Y[0]*Y[0])*Y[1]-Y[0]])
def Euler2(F,a,b,Y0,n) :
h=(b-a)/n
t=np.linspace(a,b,n+1)
SY=np.array([[0.0,0.0] for i in range(n+1)])
SY[0]=Y0
for i in range(1,n+1) :
SY[i]=SY[i-1]+ h*F(SY[i-1],t[i-1])
return SY
t=np.linspace(0,100,1000)
Y0=[0,0.1]
y= Euler2(F,0,100,Y0,999)
pl.plot(t,y)
25/03/2019
5
II. Les équations différentielles d’ordre 2
3. Fonction odeint pour l'ordre 2
25
import numpy as np
from scipy.integrate import odeint
import matplotlib.pyplot as pl
def F(Y,t) :
return [Y[1],0.5*(1-Y[0]**2)*Y[1]-Y[0]]
init=[0,0.1]
t=np.linspace(0,100,1000)
y=odeint(F,init,t)
pl.plot(t,y[:,0])
pl.show()
1 / 5 100%