Telechargé par مهووس الحاسوب - mhws alhasob

Cours3 IngNumSimul

publicité
Les équations scalaires d’ordre 1
Les équations différentielles d’ordre 2
Utilisation de la fonction odeint du module scipy.integrate
Chapitre 3
Résolution approchée d’équations différentielles
Module 2: Ingénierie numérique et simulation
MPSI1/PCSI2
Texte
Texte
Texte
[email protected]
17 juin 2015
Module 2: Ingénierie numérique et simulation
CPGE GSR 2014-2015
1/ 32
Les équations scalaires d’ordre 1
Les équations différentielles d’ordre 2
Utilisation de la fonction odeint du module scipy.integrate
Plan
1
Les équations scalaires d’ordre 1
La méthode d’Euler
La méthode de Heun, ou RK2
La méthode de Runge-Kutta (ou RK4)
2
Les équations différentielles d’ordre 2
3
Utilisation de la fonction odeint du module scipy.integrate
Module 2: Ingénierie numérique et simulation
CPGE GSR 2014-2015
2/ 32
Les équations scalaires d’ordre 1
Les équations différentielles d’ordre 2
Utilisation de la fonction odeint du module scipy.integrate
La méthode d’Euler
La méthode de Heun, ou RK2
La méthode de Runge-Kutta (ou RK4)
Principe général
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 0 (t) = F (y (t), t)
où F est une application continue sur U à valeurs dans Rn et où la
fonction inconnue y est de classe C 1 sur un certain intervalle de R
, à valeurs dans Rn .
Dans le cas où n = 1, on parle d’une équation différentielle
scalaire ; dans le cas général, on obtient un système différentiel.
Si (t0, y 0) ∈ U, résoudre le problème de Cauchy en (t0, y 0), c’est
trouver un couple (I , y ) où I est un intervalle de R et où y est une
fonction de classe C 1 de I dans Rn tels que
y (t0) = y 0 et ∀t ∈ Iy 0 (t) = F (y (t), t)
Module 2: Ingénierie numérique et simulation
CPGE GSR 2014-2015
3/ 32
Les équations scalaires d’ordre 1
Les équations différentielles d’ordre 2
Utilisation de la fonction odeint du module scipy.integrate
La méthode d’Euler
La méthode de Heun, ou RK2
La méthode de Runge-Kutta (ou RK4)
La méthode d’Euler
Principe
On cherche à résoudre sur [a, b] l’équation de la forme :
y 0 (t) = F (y (t), t) avec y (t0) = y 0
Si y (t) est de classe C 1 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 0 (ti )x(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 )xh
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)]
Module 2: Ingénierie numérique et simulation
CPGE GSR 2014-2015
4/ 32
Les équations scalaires d’ordre 1
Les équations différentielles d’ordre 2
Utilisation de la fonction odeint du module scipy.integrate
La méthode d’Euler
La méthode de Heun, ou RK2
La méthode de Runge-Kutta (ou RK4)
Interprétation géométrique
Module 2: Ingénierie numérique et simulation
CPGE GSR 2014-2015
5/ 32
Les équations scalaires d’ordre 1
Les équations différentielles d’ordre 2
Utilisation de la fonction odeint du module scipy.integrate
La méthode d’Euler
La méthode de Heun, ou RK2
La méthode de Runge-Kutta (ou RK4)
Implémentation de la méthode d’Euler en Python
Code en utilisant les listes
############Solution 1############
def Euler(f,a,b,y0,h) :
y=y0
t=a
les y =[y0]
les t =[a]
while t+h <= b :
y =y+ h * f(t,y)
t=t+h
les y.append(y)#On peut faire les y=les y+[y]
les t.append(t)
return les t, les y
Module 2: Ingénierie numérique et simulation
CPGE GSR 2014-2015
6/ 32
Les équations scalaires d’ordre 1
Les équations différentielles d’ordre 2
Utilisation de la fonction odeint du module scipy.integrate
La méthode d’Euler
La méthode de Heun, ou RK2
La méthode de Runge-Kutta (ou RK4)
Implémentation de la méthode d’Euler en Python
Code en utilisant les listes
############Solution 2############
def Euler(f,a,b,y0,h) :
y=y0
t=a
les y=[y0]
les t =[a]
n=(b-a)/h
for i in range(1,n+1) :
y =y+ h * f(t,y)
t=t+h
les y.append(y)
les t.append(t)
return les t, les y
Module 2: Ingénierie numérique et simulation
CPGE GSR 2014-2015
7/ 32
Les équations scalaires d’ordre 1
Les équations différentielles d’ordre 2
Utilisation de la fonction odeint du module scipy.integrate
La méthode d’Euler
La méthode de Heun, ou RK2
La méthode de Runge-Kutta (ou RK4)
Implémentation de la méthode d’Euler en Python
Code en utilisant le module numpy
############Solution 3############
def Euler(f,a,b,y0,n) :
y=np.array([0]*(n+1),dtype=float) #générer un vecteur de n+1 valeurs
t=np.linspace(a,b,n+1) #générer le vecteur t=[t0,t1,...,tn]
y[0]=x0
for i in range(1,n+1) :
y[i]=y[i-1]+h*f(t[i-1],y[i-1])
return y
############Solution 4############
def Euler(f,y0,t) :
”””Entrée : une fonction f, la condition initiale y0 et un vecteur t=[t0,t1,..,tn]
Sortie : y un vecteur qui contient la solution de l’équation”””
n=len(t)
y=np.array([y0]*n,dtype=’f’)
for i in range(n-1) :
y[i+1]=y[i]+(t[i+1]-t[i] )*f(y[i],t[i])
return y
Module 2: Ingénierie numérique et simulation
CPGE GSR 2014-2015
8/ 32
Les équations scalaires d’ordre 1
Les équations différentielles d’ordre 2
Utilisation de la fonction odeint du module scipy.integrate
La méthode d’Euler
La méthode de Heun, ou RK2
La méthode de Runge-Kutta (ou RK4)
Exemple 1 : d’uilisation de la méthode d’Euler
Considérons l’équation différentielle du premier ordre
(
y0 = y
y (0) = 1
import numpy as np
import matplotlib.pyplot as pl
######Définir la fonction F
def F(y,t) :
return y
t= np.linspace(0, 5, 50)
h=(5-0)/50
y0=1
#La fonction Euler proposée dans Solution 3
y= Euler(F,0,5,y0,h)
pl.plot(t,y)
pl.xlabel(’temps’)
pl.ylabel(’y(t)’)
pl.show()
Module 2: Ingénierie numérique et simulation
CPGE GSR 2014-2015
9/ 32
Les équations scalaires d’ordre 1
Les équations différentielles d’ordre 2
Utilisation de la fonction odeint du module scipy.integrate
La méthode d’Euler
La méthode de Heun, ou RK2
La méthode de Runge-Kutta (ou RK4)
Exemple 2 : d’uilisation de la méthode d’Euler
Considérons l’équation différentielle du premier ordre relative à la charge d’un
condensateur
(
DU
+ τu = Eτ
dt
U(0) = 0
import matplotlib.pyplot as pl
C=1e-6
R=1e3
tau=R*C
E=6
u0=0
######Définir l’équation
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()
Module 2: Ingénierie numérique et simulation
CPGE GSR 2014-2015
10/ 32
Les équations scalaires d’ordre 1
Les équations différentielles d’ordre 2
Utilisation de la fonction odeint du module scipy.integrate
La méthode d’Euler
La méthode de Heun, ou RK2
La méthode de Runge-Kutta (ou RK4)
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) :
pas = (b - a)/n
X = [a]
t=a
Y = [y0]
y = y0
for k in range(0, n) :
alpha = y + pas * F(t, y) / 2
y = y + pas * F(t+ pas / 2, alpha)
t = t + pas
X.append(t)
Y.append(y)
return X, Y
Module 2: Ingénierie numérique et simulation
CPGE GSR 2014-2015
11/ 32
Les équations scalaires d’ordre 1
Les équations différentielles d’ordre 2
Utilisation de la fonction odeint du module scipy.integrate
La méthode d’Euler
La méthode de Heun, ou RK2
La méthode de Runge-Kutta (ou RK4)
La méthode de Heun, ou RK2
Implémentation de la méthode RK2
#########Solution en utilisant le module numpy#########
import numpy as np
def Heun(f,y0,t) :
n = len(t)
y = np.array( [ y0 ] * n )
for i in range(n-1) :
h=t[i+1] - t[i]
k1=h * f( y[i],t[i])
k2 = h * f( y[i] + k1,t[i+1])
y[i+1] = y[i] + ( k1 + k2 ) / 2.0
return y
Module 2: Ingénierie numérique et simulation
CPGE GSR 2014-2015
12/ 32
Les équations scalaires d’ordre 1
Les équations différentielles d’ordre 2
Utilisation de la fonction odeint du module scipy.integrate
La méthode d’Euler
La méthode de Heun, ou RK2
La méthode de Runge-Kutta (ou RK4)
La méthode de Runge-Kutta (ou RK4)
Implémentation de la méthode RK4
#########Solution en utilisant les listes#########
def RK4(F, a, b, y0, n) :
pas = (b - a) / n
pasSur2 = pas / 2
X = [a]
t=a
Y = [y0]
y = y0
for k in range(0, n) :
C1 = F(t, y)
C2 = F(t + pasSur2, y + pasSur2 * C1)
C3 = F(t + pasSur2, y + pasSur2 * C2)
y = y + pas * ( C1 + 2 * C2 + 2 * C3 + F( t + pas, y + pas * C3)) / 6
t = t + pas
X.append(t)
Y.append(y)
return X, Y
Module 2: Ingénierie numérique et simulation
CPGE GSR 2014-2015
13/ 32
Les équations scalaires d’ordre 1
Les équations différentielles d’ordre 2
Utilisation de la fonction odeint du module scipy.integrate
La méthode d’Euler
La méthode de Heun, ou RK2
La méthode de Runge-Kutta (ou RK4)
La méthode de Runge-Kutta (ou RK4)
Implémentation de la méthode RK4
#########Solution en utilisant le module numpy#########
import numpy as np
def RK4(f,y0, t ) :
n = len( t )
y = np.array( [ y0 ] * n )
for i in range( n - 1 ) :
h = t[i+1] - t[i]
k1 = h * f(y[i], t[i] )
k2 = h * f( y[i] + 0.5 * k1, t[i] + 0.5 * h )
k3 = h * f( y[i] + 0.5 * k2, t[i] + 0.5 * h )
k4 = h * f( y[i] + k3, t[i+1] )
y[i+1] = y[i] + ( k1 + 2.0 * ( k2 + k3 ) + k4 ) / 6.0
return y
Module 2: Ingénierie numérique et simulation
CPGE GSR 2014-2015
14/ 32
Les équations scalaires d’ordre 1
Les équations différentielles d’ordre 2
Utilisation de la fonction odeint du module scipy.integrate
Principe de l’équation différentielle d’ordre 2
Considérons une équation différentielle du second ordre, de la
forme :
x 00 = f (x 0 (t)), x(t), t)
m
00
0
x = a(t)x + b(t)x + c(t)
où a, b et c sont des fonctions continues de I dans R
En posant le vecteur Y tel que Y (t) = [x(t), x 0 (t)],
On a Y 0 (t) = [x 0 (t), x 00 (t)]
Donc, l’équation différentielle à résoudre peut se mettre sous
la forme :
Y 0 (t) = [x 0 (t), f (x 0 (t)), x(t), t)] = F (t, Y (t)) (eq1)
Pour résoudre l’équation eq1, on pourra là encore utiliser les
programmes vus précédemment.
Module 2: Ingénierie numérique et simulation
CPGE GSR 2014-2015
15/ 32
Les équations scalaires d’ordre 1
Les équations différentielles d’ordre 2
Utilisation de la fonction odeint du module scipy.integrate
Principe de l’équation différentielle d’ordre 2
⇒Ecriture matricielle de l’équation : x 00 = a(t)x 0 + b(t)x + c(t)
Matriciellement, cette équation peut s’écrire :
„ 0 « „
« „
« „
«
x (t)
0
1
x(t)
0
=
x
+
00
0
x (t)
b(t) a(t)
x (t)
c(t)
Soit
Y 0 = AY + B
Avec
„
Y (t) =
«
„
x 0 (t)
0
, A(t) =
x 00 (t)
b(t)
«
„
«
1
0
et B(t) =
a(t)
c(t)
Pour tout t, l’application Y 7→ A(t).Y + B(t) est de classe C1 , donc le théorème de
Cauchy-Lipschitz s’applique
⇒Exemples :
équation différentielle
fonction F
y 00 + y = 0
F (t, Y ) = [y 0 , −y ]
h
i
dθ(t)
F (t, Y ) =
, −ksin(θ(t))
dt
d 2 θ(t)
dt 2
m
+ ksin(θ(t)) = 0
d 2 x(t)
dx 2
+h
dx(t)
dt
+ ω02 x(t) = 0
Module 2: Ingénierie numérique et simulation
»
F (t, Y ) =
2
ω
dx(t)
h dx(t)
,−m
, − m0
dt
dt
CPGE GSR 2014-2015
–
x(t)
16/ 32
Les équations scalaires d’ordre 1
Les équations différentielles d’ordre 2
Utilisation de la fonction odeint du module scipy.integrate
La méthode Euler d’une équation différentielle d’ordre 2
L’objectif est de résoudre l’équation différentielle du second ordre
(
Y 0 = F (Y (t), t)
Y (t0) = [x(t0), x 0 (t0)]
Implémentation de la méthode Euler avec numpy
import numpy as np
#########Définir la fonction F sachant que f est deja donnée
def F(Y,t) :
return np.array([Y[1],f(Y[1],Y[0],t)])
#######Défintion de la fonction Euler
def EulerExplicite(F,a,b,Y0,pas) :
n=(b-a)/pas
t=np.arange(a,b+pas,b)
#On génére une matrice SY de n lignes et 2 colonnes contenant les solutions
SY=np.array([[0,0] for i in range(n)],dtype=’f’)
SY[0]=Y0
for i in range(1,n) :
SY[i]=SY[i-1]+ pas*F(SY[i-1],t[i-1])
return SY
Module 2: Ingénierie numérique et simulation
CPGE GSR 2014-2015
17/ 32
Les équations scalaires d’ordre 1
Les équations différentielles d’ordre 2
Utilisation de la fonction odeint du module scipy.integrate
La méthode Euler d’une équation différentielle d’ordre 2
Exemple Considérons l’équation différentielle du second ordre
8
00
2 0
>
<x = 0.5(1 − x )x − x
0
x (0) = 0.1
>
:
x(0) = 0
Implémentation de la méthode Euler avec numpy
import numpy as np
#########Définir la fonction G sachant que F est deja donnée
def F(Y,t) :
return np.array([Y[1],0.5*(1-Y[0]*Y[0])*Y[1]-Y[0]])
#######Défintion de la fonction Euler
def EulerExplicite(F,a,b,Y0,pas) :
n=(b-a)/pas
t=np.arange(a,b+pas,b)
#On génére une matrice SY de n lignes et 2 colonnes contenant les solutions
SY=np.array([[0,0] for i in range(n)],dtype=’f’)
SY[0]=Y0
for i in range(1,n) :
SY[i]=SY[i-1]+ pas*F(SY[i-1],t[i-1])
return SY
Module 2: Ingénierie numérique et simulation
CPGE GSR 2014-2015
18/ 32
Les équations scalaires d’ordre 1
Les équations différentielles d’ordre 2
Utilisation de la fonction odeint du module scipy.integrate
La méthode Euler d’une équation différentielle d’ordre 2
Implémentation de la méthode Euler avec une liste
import numpy as np
#########Définir la fonction F sachant que f est deja donnée
def F(Y,t) :
return np.array([Y[1],f(Y[1],Y[0],t)])
#######Défintion de la fonction Euler
def euler(F, a, b, Y INI, h) :
Yi = np.array([Y INI[0],Y INI[1]]) #Yi est le tableau [x(t), x’(t)]
t=a
liste y = [Yi] # liste y est la liste des [x(t), x’(t)]
liste t = [a] # liste t est la liste des instants t
while t + h <= b :
Yi = Yi + h * F(t, Yi) # l’opération * marche car Yi est un np.array
liste y.append(list(Yi))
t =t+ h
liste t.append(t)
return liste t, np.array(liste y)
Module 2: Ingénierie numérique et simulation
CPGE GSR 2014-2015
19/ 32
Les équations scalaires d’ordre 1
Les équations différentielles d’ordre 2
Utilisation de la fonction odeint du module scipy.integrate
La fonction odeint
Défintion
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
odre et du deuxième ordre.
Syntaxe et utilisation
from scipy.integrate import odeint
Ys=odeint(f,CondInit,t)
1
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.
2
CondInit pointe sur le vecteur des conditions initiales.
y(t0)= [y1 (t0), y2 (t0), ....yn (t0)]
3
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 indiqués de I
Module 2: Ingénierie numérique et simulation
CPGE GSR 2014-2015
20/ 32
Les équations scalaires d’ordre 1
Les équations différentielles d’ordre 2
Utilisation de la fonction odeint du module scipy.integrate
Exemple 1 d’uilisation de la fonction odeint
Considérons l’équation différentielle du premier ordre
(
y0 = y
y (0) = 1
Code en python
import numpy as np
from scipy.integrate import odeint
import matplotlib.pyplot as pl
######Définir la fonction F
def F(y,t) :
return y
t= np.linspace(0, 5, 50)
y= odeint(F, 1, t)
pl.plot(t,y)
pl.show()
Module 2: Ingénierie numérique et simulation
CPGE GSR 2014-2015
21/ 32
Les équations scalaires d’ordre 1
Les équations différentielles d’ordre 2
Utilisation de la fonction odeint du module scipy.integrate
Exemple 1 d’uilisation de la fonction odeint
Considérons l’équation différentielle du premier ordre
(
y0 = y
y (0) = 1
Module 2: Ingénierie numérique et simulation
CPGE GSR 2014-2015
22/ 32
Les équations scalaires d’ordre 1
Les équations différentielles d’ordre 2
Utilisation de la fonction odeint du module scipy.integrate
Exemple 2 d’uilisation de la fonction odeint
Considérons l’équation différentielle du second ordre

00
2 0

y = 0.5(1 − y )y − y
y 0 (0) = 0.1


y (0) = 0
Code en python
import numpy as np
from scipy.integrate import odeint
import matplotlib.pyplot as pl
######Définir la fonction F
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,10000)
y=odeint(F,init,t)
pl.plot(t,y)
pl.show()
Module 2: Ingénierie numérique et simulation
CPGE GSR 2014-2015
23/ 32
Les équations scalaires d’ordre 1
Les équations différentielles d’ordre 2
Utilisation de la fonction odeint du module scipy.integrate
Exemple 2 d’uilisation de la fonction odeint
Considérons l’équation différentielle du second ordre

00
2 0

y = 0.5(1 − y )y − y
y 0 (0) = 0.1


y (0) = 0
Module 2: Ingénierie numérique et simulation
CPGE GSR 2014-2015
24/ 32
Les équations scalaires d’ordre 1
Les équations différentielles d’ordre 2
Utilisation de la fonction odeint du module scipy.integrate
Exemple 3 Mouvement d’un pendule
Un pendule de masse m soumis à un champ de pesanteur constant
se déplace dans un plan vertical ; il est situé au bout d’une tige
rigide de longueur l et de masse non nulle m tournant avec
frottement autour de son extrémité fixe.
Considérons l’équation différentielle du second ordre satisfaite par
ce pendule

k
0
Θ00 = −g

l sin(Θ(t)) − ml 2 Θ
Θ0 (0) = 0


Θ(0) = 0.1
Avec
• l=1
• k=0.2
• m=1
Module 2: Ingénierie numérique et simulation
CPGE GSR 2014-2015
25/ 32
Les équations scalaires d’ordre 1
Les équations différentielles d’ordre 2
Utilisation de la fonction odeint du module scipy.integrate
Exemple 3 Mouvement d’un pendule
Comparaison de la solution 1 et odeint
import numpy as np
from scipy.integrate import odeint
import matplotlib.pyplot as pl
######Définir la fonction f
def f(t,x,dx) :
return (-1*(g/l)*sin(x)-(k/(m*l*l))*dx)
######Définir la fonction F en uitlisant changement de variable
def F(Y,t) :
return np.array([Y[1],f(t,Y[0],Y[1])],dtype=’f’)
###Euler Sol1 :c’est la solution 1 qui utilise le pas (arange)
def Euler Sol1(F,a,b,Y0,pas) :
t=np.arange(a,b+pas,pas)
n=len(t)
SY=np.array([[0,0] for i in range(n)],dtype=float)
SY[0]=Y0
for i in range(1,n) :
SY[i]=SY[i-1]+pas*F(SY[i-1],t[i-1])
return t,SY
Module 2: Ingénierie numérique et simulation
CPGE GSR 2014-2015
26/ 32
Les équations scalaires d’ordre 1
Les équations différentielles d’ordre 2
Utilisation de la fonction odeint du module scipy.integrate
Exemple 3 Mouvement d’un pendule
Comparaison de la solution 1 et odeint
###Programme principal###
g=9.81
l=1
k=0.2
m=1
Y0=np.array([0.1,0],dtype=’f’)
n=10000
pas=30./n
t,SY=Euler Sol1(F,0,30,Y0,pas)
#Solution avec odeint
SY3=odeint(F,Y0,t)
#Pour extraire la colonne x(t)
SY I0=[SY[i][0] for i in range(len(SY))]
SY3 I0=[SY3[i][0] for i in range(len(SY3))]
pl.plot(t,SY I0)
pl.plot(t,SY3 I0)
pl.legend((’x(t) avec odeint’,’x(t) avec
solution1’))#afficher couleur
pl.show()
Module 2: Ingénierie numérique et simulation
CPGE GSR 2014-2015
27/ 32
Les équations scalaires d’ordre 1
Les équations différentielles d’ordre 2
Utilisation de la fonction odeint du module scipy.integrate
Exemple 3 Mouvement d’un pendule
Comparaison de la solution 2 et odeint
import numpy as np
from scipy.integrate import odeint
import matplotlib.pyplot as pl
######Définir la fonction f
def f(t,x,dx) :
return (-1*(g/l)*sin(x)-(k/(m*l*l))*dx)
######Définir la fonction F en uitlisant changement de variable
def F(Y,t) :
return np.array([Y[1],f(t,Y[0],Y[1])],dtype=’f’)
###Euler Sol2 :c’est la solution 2 qui utilise le nombre de subdivisions (linspace)
def Euler Sol2(F,a,b,Y0,n) :
t=np.linspace(a,b,n+1) # tableau des instants de n+1 valeurs.
pas=(b-a)/n# le pas de discretisation
SY=np.array([[0,0] for i in range(n+1)],dtype=float)
SY[0]=Y0
for i in range(1,n+1) :
SY[i]=SY[i-1]+pas*F(SY[i-1],t[i-1])
return t,SY
Module 2: Ingénierie numérique et simulation
CPGE GSR 2014-2015
28/ 32
Les équations scalaires d’ordre 1
Les équations différentielles d’ordre 2
Utilisation de la fonction odeint du module scipy.integrate
Exemple 3 Mouvement d’un pendule
Comparaison de la solution 2 et odeint
###Programme principal###
pi=3.14
g=9.81
l=1
k=0.2
m=1
Y0=np.array([0.1,0],dtype=’f’)
n=10000
t1,SY1=Euler Sol2(F,0,30,Y0,n)
#Solution avec odeint
SY3=odeint(F,Y0,t1)
SY1 I0=[SY1[i][0] for i in range(len(SY1))]
SY3 I0=[SY3[i][0] for i in range(len(SY3))]
pl.plot(t1,SY1 I0)
pl.plot(t1,SY3 I0)
pl.legend((’x(t) avec odeint’,’x(t) avec
solution2’))#afficher couleur
pl.show()
Module 2: Ingénierie numérique et simulation
CPGE GSR 2014-2015
29/ 32
Les équations scalaires d’ordre 1
Les équations différentielles d’ordre 2
Utilisation de la fonction odeint du module scipy.integrate
Exemple 3 Mouvement d’un pendule
Comparaison de la solution 3 et odeint
import numpy as np
from scipy.integrate import odeint
import matplotlib.pyplot as pl
######Définir la fonction f
def f(t,x,dx) :
return (-1*(g/l)*sin(x)-(k/(m*l*l))*dx)
######Définir la fonction F en uitlisant changement de variable
def F(Y,t) :
return np.array([Y[1],f(t,Y[0],Y[1])],dtype=’f’)
###Euler Sol2 :c’est la solution 2 qui utilise le nombre de subdivisions (linspace)
def Euler Sol3((F,y0,t) :
n=len(t)
y=np.array([y0]*n,dtype=’f’)
for i in range(n-1) :
y[i+1]=y[i]+(t[i+1]-t[i])*F(y[i],t[i])
return y
Module 2: Ingénierie numérique et simulation
CPGE GSR 2014-2015
30/ 32
Les équations scalaires d’ordre 1
Les équations différentielles d’ordre 2
Utilisation de la fonction odeint du module scipy.integrate
Exemple 3 Mouvement d’un pendule
Comparaison de la solution 3 et odeint
###Programme principal###
g=9.81
l=1
k=0.2
m=1
Y0=np.array([0.1,0],dtype=’f’)
n=10000
T=np.linspace(0,30,n+1)
#Appel de la fonction Euler Sol3
SY2=Euler Sol3(F,Y0,T)
#Solution avec odeint
SY3=odeint(F,Y0,T)
SY2 I0=[SY2[i][0] for i in range(len(SY2))]
SY3 I0=[SY3[i][0] for i in range(len(SY3))]
pl.plot(T,SY2 I0)
pl.plot(T,SY3 I0)
pl.legend((’x(t) avec odeint’,’x(t) avec
solution3’))
pl.show()
Module 2: Ingénierie numérique et simulation
CPGE GSR 2014-2015
31/ 32
Les équations scalaires d’ordre 1
Les équations différentielles d’ordre 2
Utilisation de la fonction odeint du module scipy.integrate
Exemple 3 Mouvement d’un pendule
On affiche θ(t) et dθ(t)/dt avec odeint
###Programme principal###
g=9.81
l=1
k=0.2
m=1
Y0=np.array([0.1,0],dtype=’f’)
n=10000
T=np.linspace(0,30,n+1)
SY3=odeint(F,Y0,T)
#On extrait la 1ere colonne θ(t)
SY3 C1=[SY3[i][0] for i in range(len(SY3))]
#On extrait la 2eme colonne θ0 (t)
SY3 C2=[SY3[i][1] for i in range(len(SY3))]
pl.plot(T,SY3 C1)
pl.plot(T,SY3 C2)
pl.legend((’theta(t)’,’d theta(t)/ dt’))
pl.show()
Module 2: Ingénierie numérique et simulation
CPGE GSR 2014-2015
32/ 32
Téléchargement