Telechargé par Mohemed Najih

Chapitre - Equation differentielle

publicité
25/03/2019
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)
Résolution approchée d’équations
différentielles
Ingénierie numérique et simulation
1
HICHAM HATIMI
www.hatimi.net
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
2
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 :
############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
5
où F est une application continue sur U à valeurs dans Rn et où la
fonction inconnue y est de classe C1 sur un certain intervalle de R, à
valeurs dans Rn.
Dans le cas où 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) où I est un intervalle de R et où 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)
I. Les équations scalaires d’ordre 1
2. La méthode d’Euler
 Exemple d'utilisation 1 :
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
1
25/03/2019
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
Code en utilisant le module numpy:
############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
I. Les équations scalaires d’ordre 1
2. La méthode d’Euler
############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
11
I. Les équations scalaires d’ordre 1
2. La méthode d’Euler
 Exemple d'utilisation 2 :
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
I. Les équations scalaires d’ordre 1
2. La méthode d’Euler
 Exemple d'utilisation 3 :
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
I. Les équations scalaires d’ordre 1
2. La méthode d’Euler
 Exemple d'utilisation 4 :
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
2
25/03/2019
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
 Implémentation de la méthode 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
I. Les équations scalaires d’ordre 1
3. La méthode de Heun, ou RK2
I. Les équations scalaires d’ordre 1
4) La méthode de Runge-Kutta (ou RK4)
#########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
L'équation de Runge-Kutta (ou RK4) :
15
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
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)
16
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
3
25/03/2019
Les équations scalaires d’ordre 1
La fonction o deint
I. Les équations scalaires d’ordre 1
5) La fonction odeint
I. Les équations scalaires d’ordre 1
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.
Exemple 1 d’utilisation de la fonction odeint. Considérons l’équation
différentielle du premier 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
5) La fonction odeint
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
II. Les équations différentielles d’ordre 2
2. La méthode d’Euler
L’objectif est de résoudre l’équation différentielle du second ordre:
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)]
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
21
22
II. Les équations différentielles d’ordre 2
2. La méthode d’Euler
II. Les équations différentielles d’ordre 2
2. La méthode d’Euler
Exemple Considérons l’équation différentielle du second
ordre
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)
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]]
23
24
4
25/03/2019
II. Les équations différentielles d’ordre 2
3. Fonction odeint pour l'ordre 2
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()
25
5
Téléchargement