m62-td1 - univ-tln.frfaccanoni.univ-tln.fr/user/enseignements/20192020/full-td.pdf · on modélise...
TRANSCRIPT
M62-TD1
March 16, 2020
[1]: from IPython.core.display import HTMLcss_file = './custom.css'HTML(open(css_file, "r").read())
[1]: <IPython.core.display.HTML object>
[2]: import sys #only needed to determine Python version numberprint('Python version ' + sys.version)
Python version 3.6.9 (default, Nov 7 2019, 10:44:02)[GCC 8.3.0]
1 M62_TD1 : Exercices
1.1 Exercice : Modèle de Malthus
On modélise la croissance d’une population d’effectif y(t) ≥ 0 par l’équation différentielle
y′(t) = ay(t), a ∈ R. (1)
Dans ce modèle la variation de population est proportionnelle à la population elle-même: le coeffi-cient a est appelé paramètre de Malthus ou potentiel biologique et représente la différence entre lenombre de nouveaux nés par individu en une unité de temps et la fraction d’individus qui meurenten une unité de temps. On s’intéresse à l’unique solution de cette équation vérifiant y(t0) = y0 oùy0 et t0 sont des réels donnés. 1. Donner l’unique solution théorique à ce problème de Cauchy.Calculer limt→+∞ y(t) en fonction du paramètre a. 1. Calculer analytiquement la solution obtenueavec la méthode d’Euler explicite sur l’intervalle [0; 2] avec Nh = 5, ensuite la tracer avec Pythonet la comparer à la solution exacte. 1. Soit uNh
(2) l’approximation de y(2) obtenue avec la méth-ode d’Euler explicite et Nh nœuds. Calculer uNh
(2) avec Nh = 2i et montrer analytiquement quelimNh→+∞ uNh
(2) = y(2). 1. Tracer le graphe de max0≤n≤Nh|y(tn) − un| en fonction de Nh ainsi
que le graphe des courbes 1/Nh, 1/N2h ... avec une progression logarithmique en abscisse et en
ordonnées. On prendra par exemple Nh = 200, puis Nh = 300, 400, ... 2000.
Correction
1
L’unique solution du problème de Cauchy{y′(t) = ay(t)
y(t0) = y0 > 0pour t ≥ t0 est la fonction y(t) = y0e
at.
On a
limt→+∞
y(t) =
+∞ si a > 0,
y0 si a = 0,
0+ si a < 0,
Pour a = 1, t0 = 0 et y0 = 1, la solution exacte est y(t) = et.
On subdivise l’intervalle [t0;T ] en N intervalles [tn; tn+1] de largeur h = (T−t0)/N avec tn = t0+nhpour n = 0, . . . , N .Pour chaque nœud tn, on note yn = y(tn); l’ensemble des valeurs {y0, y1, . . . , yN} représente lasolution exacte discrète.Pour chaque nœud tn, on cherche la valeur inconnue un qui approche la valeur exacte yn.L’ensemble des valeurs {u0 = y0, u1, . . . , uN} représente la solution numérique.
Dans la méthode d’Euler explicite, cette solution approchée est obtenue en construisant une suiterécurrente comme suit {
u0 = y0,
un+1 = un + hφ(tn, un).
En utilisant ce schéma pour notre EDO on obtient{u0 = y0,
un+1 = (1 + ah)un
soit encore un = (1 + ah)nu0 =(1 + 2
5
)n.
[16]: %reset -f%matplotlib inline
from matplotlib.pylab import *
def euler_progressif(phi,tt):uu = [y0]h=tt[1]-tt[0]for i in range(len(tt)-1):
uu.append(uu[i]+h*phi(tt[i],uu[i]))return uu
phi = lambda t,y : a*y # EDOsol_exacte = lambda t : y0*math.exp(a*t) # SOLUTION EXACTE
# INITIALISATIONa = 1Nh = 5t0, y0 = 0, 1tfinal = 2
2
# CALCUL SOLUTION APPROCHEEtt1 = linspace(t0,tfinal,Nh+1)uu1 = euler_progressif(phi,tt1)
# CALCUL SOLUTION EXACTE POUR PLOTyy = [sol_exacte(t) for t in tt1]
# PLOTplot(tt1,yy,'m-',tt1,uu1,'go-')legend(['Exacte','Euler explicite'],loc='upper left')
# PRINTh1=tt1[1]-tt1[0]for n in range(Nh):
print ('y_%1d=%1.14f u_%1d=%1.14f (1+h)^%1d=%1.14f'␣↪→%(n,yy[n],n,uu1[n],n,(1.+h1)**n))
y_0=1.00000000000000 u_0=1.00000000000000 (1+h)^0=1.00000000000000y_1=1.49182469764127 u_1=1.40000000000000 (1+h)^1=1.40000000000000y_2=2.22554092849247 u_2=1.96000000000000 (1+h)^2=1.96000000000000y_3=3.32011692273655 u_3=2.74400000000000 (1+h)^3=2.74400000000000y_4=4.95303242439511 u_4=3.84160000000000 (1+h)^4=3.84160000000000
On compare les approximations de y(2) avec plusieurs valeurs de Nh:
uNh= (1 + ah)Nhu0 =
(1 +
2
Nh
)Nh
−−−−−−→Nh→+∞
e2 = y(2).
3
[17]: # MAINy_2=sol_exacte(tfinal)print ('\nSolution exacte en t=2:')print ('y(2) =',y_2)print ('\nSolution approchee en t=2 avec N points:')print ('N\t sol_approx\t\t\t |erreur|')for i in range(3,15):
N=2**itt = linspace(t0,tfinal,N+1)uu = euler_progressif(phi,tt)print (N,'\t',uu[-1], '\t',abs(uu[-1]-y_2))
Solution exacte en t=2:y(2) = 7.38905609893065
Solution approchee en t=2 avec N points:N sol_approx |erreur|8 5.96046447754 1.4285916213916 6.58325017203 0.80580592690332 6.95866675722 0.43038934171264 7.16627615279 0.222779946142128 7.27566979313 0.113386305802256 7.33185059874 0.0572055001896512 7.36032355327 0.02873254566141024 7.37465716034 0.01439893858882048 7.38184843588 0.007207663050154096 7.38545021554 0.003605883391648192 7.38725264384 0.0018034550917616384 7.38815424298 0.000901855948577
Vérifions la convergence linéaire:
[18]: error=[]H=[]N=arange(200,1000,100)for n in N:
tt=linspace(t0,tfinal,n+1)H.append(tt[1]-tt[0])yy=[sol_exacte(t) for t in tt]uu = euler_progressif(phi,tt)error_vec=[abs(uu[i]-yy[i]) for i in range(len(uu))]error.append(max(error_vec))
# ESTIMATION ORDRES DE CONVERGENCE par regressionprint ('Pente par regression lineaire', polyfit(log(H),log(error), 1)[0])
# PLOT ERREUR
4
loglog(H,error,'*-');
Pente par regression lineaire 0.9942137371
1.2 Exercice : Modèle de Verhulst (croissance logistique).
Dans le modèle logistique, on suppose que la croissance de la population d’effectif y(t) ≥ 0 estmodélisée par l’équation différentielle:
y′(t) = (a− by(t))y(t), a, b > 0. (2)
Ce modèle prend en compte une éventuelle surpopulation. En effet, le taux de croissance de lapopulation est désormais de la forme a− by(t): c’est la différence entre un taux de fertilité a et untaux de mortalité de la forme by(t) qui augmente avec l’effectif de la population. 1. Calculer lessolutions exactes de l’équation différentielle. 1. Écrire la relation entre un+1 et un obtenue obtenueen appliquant la méthode d’Euler explicite. 1. Pour a = b = 0.5 et t0 = 0, tracer avec python lessolutions exactes sur l’intervalle de temps [0; 20] pour les valeurs de y0 suivantes:
y0 = 0.01 y0 = 0.1 y0 = 0.4 y0 = 0.8 y0 = 1 y0 = 1.5 y0 = 2
Sur un autre graphique à coté, tracer les solutions correspondantes obtenues par la méthode d’Eulerexplicite avec Nh = 50.
5
Sur un autre graphique à coté, tracer les solutions correspondantes obtenues par la méthode d’Eulerexplicite avec Nh = 100.
Correction
On cherche l’unique solution du problème de Cauchy{y′(t) = (a− by(t))y(t)
y(t0) = y0 ≥ 0pour t ≥ t0.
On écrit l’EDO sous la forme y′(t) = −by(t)(y(t)− a
b
).
Si y(t) = A pour tout t > 0 est solution de l’EDO, alors on doit avoir A = (a − bA)A. Donc, soitA = 0 soit A = a
b .Ainsi la solution constante y(t) = a
b > 0 représente l’effectif d’équilibre de la population, directe-ment liée aux contraintes environnementale (densité, ressources, etc.).
De plus, les solutions sont des fonctions strictement croissantes si y(t) ∈]0, a/b[ et décroissantes siy(t) > a/b.
Calculons la solution exacte en remarquant qu’il s’agit d’une EDO à variables séparables. Poury(t) = 0 et y(t) = a
b , on remarque que
−b =y′(t)(
y(t)− ab
)y(t)
=bay
′(t)
y(t)− ab y
′(t)−
ba
y(t).
On doit alors calculer ∫1
y − ab
dy −∫
1
ydy = −a
∫1dt.
On obtientln
(1− b/a
y
)= −at+ C
et on en déduity(t) =
a/b
1−De−at.
En imposant la condition initiale y(0) = y0 on trouve la constante d’intégration D et on conclutque toutes les solutions du problème de Cauchy pour t ≥ 0 sont
y(t) =
0 si y0 = 0,
a
bsi y0 =
a
b,
1(1y0
− ba
)e−at + b
a
sinon.
Remarquons que limt→+∞ y(t) = ab : une population qui évolue à partir de y0 individus à l’instant
initiale tend à se stabiliser vers un nombre d’individus d’environ a/b, ce qui représente la capacitéde l’environnement.
La méthode d’Euler explicite (ou progressive) est une méthode d’intégration numérique d’EDO dupremier ordre de la forme y′(t) = φ(t, y(t)).On subdivise l’intervalle [t0;T ] en N intervalles [tn; tn+1] de largeur h =
T − t0N
avec tn = t0 + nh
pour n = 0, . . . , N . La longueur h est appelé le pas de discrétisation.
6
Pour chaque nœud tn, on note yn = y(tn); l’ensemble des valeurs {y0, y1, . . . , yN} représente lasolution exacte discrète.Pour chaque nœud tn, on cherche la valeur inconnue un qui approche la valeur exacte yn.L’ensemble des valeurs {u0 = y0, u1, . . . , uNh
} représente la solution numérique.
Dans la méthode d’Euler explicite, cette solution approchée est obtenue en construisant une suiterécurrente comme suit {
u0 = y0,
un+1 = un + hφ(tn, un).
En utilisant cette construction pour notre EDO on obtient{u0 = y0,
un+1 = un + h(a− bun)un
[19]: from matplotlib.pylab import *
def euler_progressif(phi,tt,y0):h=tt[1]-tt[0]uu = [y0]for i in range(len(tt)-1):
uu.append(uu[i]+h*phi(tt[i],uu[i]))return uu
phi = lambda t,y : (a-b*y)*y
def sol_exacte(t,y0):if abs(y0-0.)<=1.e-10:
return 0elif abs(y0-a/b)<=1.e-10:
return a/belse:
return 1./((1./y0-b/a)*exp(-a*t)+b/a)
# INITIALISATIONa = 0.5b = 0.5t0 = 0tfinal = 20yy_0=[0.001, 0.1,0.5,1,1.5,2]leg=[]for y0 in yy_0:
leg.append('y_0='+str(y0))
# MAINfigure(1, figsize=(15, 5))subplot(1,3,1)tt=linspace(t0,tfinal,25)
7
for i in range(len(yy_0)):uu=euler_progressif(phi,tt,yy_0[i])plot(tt,uu,'.-')
axis([t0,tfinal,0,2.])title('25 noeuds')grid()legend(leg)
subplot(1,3,2)tt=linspace(t0,tfinal,100)for i in range(len(yy_0)):
uu=euler_progressif(phi,tt,yy_0[i])plot(tt,uu,'.-')
title('100 noeuds')axis([t0,tfinal,0,2.])grid()legend(leg)
subplot(1,3,3)for i in range(len(yy_0)):
yy=[sol_exacte(t,yy_0[i]) for t in tt]plot(tt,yy,'-')
axis([t0,tfinal,0,2.])title('Exacte')grid()legend(leg);
1.3 Exercice : concentration
L’évolution de la concentration de certaines réactions chimiques au cours du temps peut être décritepar l’équation différentielle
y′(t) = − 1
1 + t2y(t).
8
Sachant qu’à l’instant t = 0 la concentration est y(0) = 5, déterminer la concentration à t = 2 àl’aide de la méthode d’Euler implicite avec un pas h = 0.5.
Correction
Dans ce cas, le schéma d’Euler implicite s’écrit
un+1 = un − h
1 + t2n+1
un+1.
Elle peut être résolue algébriquement et cela donne la suite
un+1 =un
1 + h1+t2n+1
.
Si à l’instant t = 0 la concentration est y(0) = 5, et si h = 1/2, alors tn = n/2 et
un+1 =4 + (n+ 1)2
6 + (n+ 1)2un.
On obtient doncn tn un0 0 5
1 0.5 4+12
6+125 = 5
75 = 257 ≈ 3.57
2 1.0 4+22
6+22257 = 8
10257 = 20
7 ≈ 2.86
3 1.5 4+32
6+32207 = 13
15207 = 52
21 ≈ 2.48
4 2.0 4+42
6+425221 = 20
225221 = 520
231 ≈ 2.25
La concentration à t = 2 est d’environ 2.25 qu’on peut comparer avec le calcul exact y(2) =5e− arctan(2) ≈ 1.652499838.
1.4 Exercice : A-stabilité du schéma de Crank-Nicolson
Soit le problème de Cauchy:{y′(t) + 10y(t) = 0, ∀t ∈ R,y(0) = y0 > 0.
1. Montrer qu’il existe une unique solution globale y ∈ C∞(R,R) que vous préciserezexplicitement. 2. Soit (un)n∈N la suite obtenue avec le schéma numérique de Crank-Nicolson. Montrer que (un)n∈N est une suite géométrique dont on précisera la raison.Donner l’expression de un en fonction de n. 3. Montrer que la raison r de la suite vérifie|r| < 1 pour tout h > 0. Ce schéma est-il inconditionnellement A-stable? 4. Sous quellecondition sur h > 0 le schéma génère-t-il une suite positive?
1.4.1 Correction
C’est un problème deCauchy du type{y′(t) = φ(t, y(t)), ∀t ∈ R,y(0) = y0 > 0,
9
avec φ(t, y) = g(y) = −10y.
On montre d’abord qu’il existe une et une seule solution locale (ie sur [−T ;T ]) de classeC 1([−T, T ],R).On montre ensuite que cette solution est de classe C∞([−T, T ],R).On montre enfin que la solution admet un prolongement sur R. + Comme g ∈ C 1(R,R), d’aprèsle théorème de Cauchy-Lipschitz il existe T > 0 et une unique solution y ∈ C 1([−T, T ],R). +Par récurrence, en exploitant l’EDO et la régularité de g, on grimpe en régularité sur y ainsi y ∈C∞([−T, T ],R). + La fonctionne nulle est solution de l’EDO (mais non du problème de Cauchydonné). Par l’unicité de la solution du problème de Cauchy on en déduit que soit y(t) > 0 pourtout t ∈ [−T, T ] (ie lorsque y0 > 0) soit y(t) < 0 pour tout t ∈ [−T, T ] (ie lorsque y0 > 0). De plus,y est décroissante si y0 > 0 et croissante si y0 < 0. On en déduit par le théorème des extrémitésque la solution u admet un prolongement sur R solution de l’EDO.
Pour en calculer la solution, on remarque qu’il s’agit d’une EDO à variables séparables. L’uniquesolution constante est y(t) ≡ 0, toutes les autres solutions sont du type y(t) = Ce−10t. En prenanten compte la condition initiale on conclut que l’unique solution du problème de Cauchy est
y(t) = y0e−10t
définie pour tout t ∈ R.
[3]: %matplotlib inlinefrom matplotlib.pylab import *y0=1exacte = lambda t : y0*exp(-10*t)tt=linspace(0,3,101)yy=[exacte(t) for t in tt]plot(tt,yy);
10
1.4.2 Correction
Le schéma de Crank-Nicolson construit la suite (un)n∈N selon la relation
un+1 = un − 5h(un+1 + un), ∀n ∈ N,
pour h > 0 fixé. On obtient une formule de récurrence rendue explicite par un calcul élémentaire:
un+1 = −5hun+1 − 5hun + un
d’oùun+1 =
1− 5h
1 + 5hun.
Par récurrence on obtientun =
(1− 5h
1 + 5h
)n
u0.
Il s’agit d’une suite géométrique de raison
r =1− 5h
1 + 5h.
1.4.3 Correction
Pour tout h > 0 on ar =
1− 5h
1 + 5h= 1− 10h
1 + 5h
et−1 < 1− 10h
1 + 5h< 1.
Ce schéma est donc inconditionnellement A-stable car |un+1| = |rn+1u0| ≤ |u0|.
1.4.4 Correction
Le schéma génère une suite positive ssi
1− 10h
1 + 5h> 0
c’est-à-dire ssih <
1
5.
[4]: %matplotlib inlinefrom matplotlib.pylab import *
N=6
11
tt=linspace(0,1,N+1)
y0=1exacte = lambda t : y0*exp(-10*t)yy=[exacte(t) for t in tt]
phi = lambda t,y : -y**5def schema(phi,tt):
h=tt[1]-tt[0]uu=[y0]for i in range(len(tt)-1):
uu.append((1-5*h)/(1+5*h)*uu[i])return uu
plot(tt,yy,label=("Exacte"))plot(tt,schema(phi,tt),"-.",label=("Schéma"))legend();
1.5 Exercice : A-stabilité d’un schéma
Soit le problème de Cauchy:y′(t) +
√y(t)
2= 0, ∀t ∈ R+,
y(0) = y0 > 0.
12
1. Soit le schéma numérique défini par la suite (un)n∈N suivante
un+1 − unh
+un+1
2√un
= 0, ∀n ∈ N,
pour h > 0 fixé. Expliciter l’expression de un+1 en fonction de un. 4. Montrer que lasuite (un)n∈N est une suite positive, décroissante et convergente vers 0.
1.5.1 Correction
C’est un problème de Cauchy du type{y′(t) = φ(t, y(t)), ∀t ∈ R,y(0) = y0 > 0,
avec φ(t, y) = g(y) = −√y2 .
Pour h > 0 fixé on obtient une formule de récurrence rendue explicite par un calcul élémentaire:
un+1 =un
1 + h2√un
=2(un)
3/2
2√un + h
, ∀n ∈ N.
1.5.2 Correction
On étudie la suite {u0 > 0,
un+1 =2(un)3/2
2√un+h , ∀n ∈ N,
pour h > 0 fixé.
Par récurrence on montre que si u0 > 0 alors un > 0 pour tout n ∈ N. De plus, un+1
un= 1
1+ h2√un
< 1
pour tout n ∈ N: la suite est monotone décroissante. On a alors une suite décroissante et bornéepar zéro, donc elle converge. Soit ℓ la limite de cette suite, alors ℓ ≥ 0 et ℓ = 2ℓ3/2
2√ℓ+h
donc ℓ = 0.
[5]: %matplotlib inlinefrom matplotlib.pylab import *
y0=1
phi = lambda t,y : -0.5*sqrt(y)exacte = lambda t: 0 if t>=4*sqrt(y0) else (sqrt(y0)-t/4)**2
N=10tt=linspace(0,10,N+1)
def schema(phi,tt):h=tt[1]-tt[0]uu=[y0]
13
for i in range(len(tt)-1):uu.append(2*(uu[i])**(3/2)/(h+2*sqrt(uu[i])))
return uu
yy=[exacte(t) for t in tt]plot(tt,yy,'r-',label=('Exacte'))plot(tt,schema(phi,tt),'b*',label=("Schéma"))legend();
1.6 Exercice : A-stabilité d’un schéma
Soit le problème de Cauchy:{y′(t) + y5(t) = 0, ∀t ∈ R+,
y(0) = y0 > 0.
1. Montrer qu’il existe une unique solution globale y ∈ C∞(R+,R+). 1. Soit le schémanumérique défini par la suite (un)n∈N suivante
un+1 − unh
+ un+1u4n = 0, ∀n ∈ N,
pour h > 0 fixé. Expliciter l’expression de un+1 en fonction de un. 4. Montrer que lasuite (un)n∈N est une suite décroissante et convergente vers 0 pour tout h > 0 fixé.
14
1.6.1 Correction
C’est un problème deCauchy du type{y′(t) = φ(t, y(t)), ∀t ∈ R,y(0) = y0 > 0,
avec φ(t, y) = g(y) = −y5.
On montre d’abord qu’il existe une et une seule solution locale (ie sur [0;T ]) de classe C 1([0, T ],R).On montre ensuite que cette solution est de classe C∞([0, T ],R).On montre enfin que la solution admet un prolongement sur R. + Comme g ∈ C 1(R+,R+), d’aprèsle théorème de Cauchy-Lipschitz il existe T > 0 et une unique solution y ∈ C 1([0, T ],R). + Parrécurrence, en exploitant l’EDO et la régularité de g, on grimpe en régularité sur y ainsi y ∈C∞([0, T ],R). + La fonctionne nulle est solution de l’EDO (mais non du problème de Cauchydonné). Comme y0 > 0, par l’unicité de la solution du problème de Cauchy on a y(t) > 0 pourtout t ∈ [0, T ] (car deux trajectoires ne peuvent pas se croiser). De plus, y est décroissante, ainsila solution est bornée (y(t) ∈ ]0, y0[). On en déduit par le théorème des extrémités que la solutiony admet un prolongement sur R+ solution de l’EDO.
Pour en calculer la solution, on remarque qu’il s’agit d’une EDO à variables séparables. L’uniquesolution du problème de Cauchy est
y(t) = y0(4ty40 + 1)−1/4
[6]: y0=1exacte = lambda t : y0*(4*t*y0**4+1)**(-0.25)tt=linspace(0,10,101)yy=[exacte(t) for t in tt]plot(tt,yy);
15
1.6.2 Correction
Pour h > 0 fixé on obtient une formule de récurrence rendue explicite par un calcul élémentaire:
un+1 =un
1 + u4nh, ∀n ∈ N.
1.6.3 Correction
On étudie la suite {u0 = y0 > 0,
un+1 =un
1+u4nh
, ∀n ∈ N,
pour h > 0 fixé.
Par récurrence on montre que si u0 > 0 alors un > 0 pour tout n ∈ N. De plus, un+1
un= 1
1+u4nh
< 1
pour tout n ∈ N: la suite est monotone décroissante. On a alors une suite décroissante et bornéepar zéro, donc elle converge. Soit ℓ la limite de cette suite, alors ℓ ≥ 0 et ℓ = ℓ
1+ℓ4hdonc ℓ = 0. Ce
schéma est donc inconditionnellement A-stable.
[7]: N=50tt=linspace(0,10,N+1)
y0=1exacte = lambda t : y0*(4*t*y0**4+1)**(-0.25)yy=[exacte(t) for t in tt]
phi = lambda t,y : -y**5def schema(phi,tt):
h=tt[1]-tt[0]uu=[y0]for i in range(len(tt)-1):
uu.append(uu[i]/(1+h*uu[i]**4))return uu
plot(tt,yy,label=("Exacte"),lw=2)plot(tt,schema(phi,tt),'o',label=("Schéma"))legend();
16
1.7 Exercice : schéma d’Euler explicite et stabilité
Soit le problème de Cauchy:{y′(t) + sin(y(t)) = 0, ∀t ∈ R,y(0) = y0 > 0.
>1. Montrer qu’il existe une unique solution globale y ∈ C∞(R,R). 1. Écrire le schémale schéma d’Euler explicite pour ce problème. 4. Montrer que la suite (un)n∈N construitepar ce schéma vérifie
|un+1| ≤ |un|+ h, ∀n ∈ N,
où h > 0 est le pas de la suite. 1. En déduire que
|un| ≤ |u0|+ nh, ∀n ∈ N.
1.7.1 Correction
C’est un problème deCauchy du type{y′(t) = φ(t, y(t)), ∀t ∈ R,y(0) = y0 > 0,
avec φ(t, y) = g(y) = − sin(y).
17
On montre d’abord qu’il existe une et une seule solution locale (ie sur [0;T ]) de classe C 1([0, T ],R).On montre ensuite que cette solution est de classe C∞([0, T ],R).On montre enfin que la solution admet un prolongement sur R. + Comme g ∈ C 1(R,R), d’aprèsle théorème de Cauchy-Lipschitz il existe T > 0 et une unique solution y ∈ C 1([−T, T ],R). +Par récurrence, en exploitant l’EDO et la régularité de g, on grimpe en régularité sur y ainsi y ∈C∞([−T, T ],R). + Toutes les fonctions constante y(t) = kπ pour k ∈ Z sont solutions de l’équationdifférentielle car g(kπ) = 0. Pour y0 donné, soit k ∈ Z tel que y0 ∈ [kπ; (k + 1)π]; par l’unicitéde la solution du problème de Cauchy on a y(t) ∈ [kπ; (k + 1)π] pour tout t ∈ [−T, T ] (car deuxtrajectoires ne peuvent pas se croiser), i.e. la solution est bornée. On en déduit par le théorèmedes extrémités que la solution y admet un prolongement sur R solution de l’EDO.
1.7.2 Correction
Soit h > 0 fixé et tn = nh pour tout n ∈ Z. Le schéma d’Euler explicite pour l’EDO donnéeconstruit la suite
un+1 = un − h sin(un), ∀n ∈ N.
1.7.3 Correction
Comme |a+ b| ≤ |a|+ |b| et comme | − sin(x)| ≤ 1 pour tout x ∈ R, on conclut que
|un+1| = |un − h sin(un)| ≤ |un|+ |h sin(un)| ≤ |un|+ h
pour h > 0 fixé.
1.7.4 Correction
Par récurrence: |un+1| ≤ |un|+ h ≤ |un−1|+ 2h ≤ · · · ≤ |u0|+ (n+ 1)h.
[8]: N=100tt=linspace(0,10,N+1)
phi = lambda t,y : -sin(y)def schema(phi,tt):
h=tt[1]-tt[0]uu=[y0]for i in range(len(tt)-1):
uu.append(uu[i]-h*sin(uu[i]))return uu
plot(tt,schema(phi,tt),'o',label=("Schéma"))legend();
18
1.8 Exercice : A-stabilité d’un schéma
Un modèle pour la diffusion d’une épidémie se base sur l’hypothèse que sa vitesse depropagation est proportionnelle au nombre d’individus infectés et au nombre d’individussains.
Si on note I(t) ≥ 0 le nombre d’individus infectés à l’instant t ≥ 0 et A > 0 le nombred’individus total, il existe une constante k ∈ R+ telle que I ′(t) = kI(t)(A− I(t)).
1. Montrer qu’il existe T > 0 et une unique solution I ∈ C∞([0, T ]) au problème deCauchy: {
I ′(t) = kI(t)(A− I(t)),
I(0) = I0 > 0.
Montrer que si 0 < I0 < A alors 0 < I(t) < A pour tout t > 0.Montrer que si 0 < I0 < A alors I(t) est croissante sur R+.
2. Soit 0 < I0 < A. On considère le schéma semi-implicite
In+1 − Inh
= kIn(A− In+1).
Montrer que In → A lorsque n → +∞ indépendamment du pas h > 0 fixé.3. Calculer la solution exacte
19
1.8.1 Correction
C’est un problème deCauchy du type{I ′(t) = φ(t, I(t)), ∀t ∈ R+,
I(0) = I0 > 0,
avec φ(t, I(t)) = g(I(t)) = kI(t)(A− I(t)).
• Comme g ∈ C 1(R,R), d’après le théorème de Cauchy-Lipschitz il existe T > 0 et une uniquesolution I ∈ C 1([0, T ],R).
• Par récurrence, en exploitant l’EDO et la régularité de g, on grimpe en régularité sur I ainsiI ∈ C∞([0, T ],R).
• Puisque la fonction nulle et la fonction constante I(t) = A sont solutions de l’équation dif-férentielle, si 0 < I0 < A alors 0 < I(t) < A pour tout t ∈ [0, T ] (car, par l’unicité de lasolution du problème de Cauchy, deux trajectoires ne peuvent pas se croiser).
• Puisque I ′(t) = kI(t)(A− I(t)), si 0 < I0 < A alors I est croissante pour tout t ∈ [0, T ]. Onen déduit par le théorème des extrémités que la solution I admet un prolongement sur R+
solution de l’EDO et que I est croissante pour tout t ∈ R+.
1.8.2 Correction
Soit 0 < I0 < A. On considère le schéma semi-impliciteIn+1 − In
h= kIn(A− In+1)
pour h > 0 fixé. On obtient une formule de récurrence rendue explicite par un calcul élémentaire:
In+1 =1 + kAh
1 + kInhIn.
Si 0 < I0 < A alors + In > 0 quelque soit n; + In est majorée par A car
In+1 ≤ A ⇐⇒ (1 + kAh)In ≤ (1 + kInh)A ⇐⇒ In ≤ A
donc par récurrence In+1 ≤ A quelque soit n; + si In → ℓ alors ℓ = 1+kAh1+kℓh ℓ donc ℓ = 0 ou ℓ = A; + In
est une suite monotone croissante (encore par récurrence on montre que |In+1| ≥ |In| ≥ · · · ≥ |I0|);
donc In → A lorsque n → +∞ indépendamment du pas h > 0 choisi.
1.8.3 Correction
On a déjà observé qu’il y a deux solutions constantes de l’EDO: la fonction I(t) ≡ 0 et la fonctionI(t) ≡ A.
Pour chercher toutes les solutions non constantes on remarque qu’il s’agit d’une EDO à variablesséparables donc on a
I(t) =A
De−Akt + 1
20
La valeur numérique de la constante d’intégration D est obtenue grâce à la CI:
D =A− I0I0
Exemple avec A = 5000, I0 = 160, k = ln(363/38)35000 et h = 1:
[9]: A=5000I0=160k=log(363/38)/35000
D=(A-I0)/I0
exacte = lambda t : A/(D*exp(-A*k*t)+1)h=1tt=arange(0,30,h)yy=[exacte(t) for t in tt]
phi = lambda t,I : k*I*(A-I)def schema(phi,tt):
uu=[I0]for i in range(len(tt)-1):
uu.append((1+k*A*h)/(1+k*uu[-1]*h)*uu[-1])return uu
plot(tt,yy,label=("Exacte"))plot(tt,schema(phi,tt),label=("Schéma"))legend();
21
1.9 Exercice : A-stabilité du schéma d’Euler expicite dans le cas d’un système
Soit le problème de Cauchy:y′′(t) + 1001y′(t) + 1000y(t) = 0, ∀t ∈ R,y(0) = 1,
y′(0) = 0.
1. Écrire le problème comme un système de 2 EDO d’ordre 1 et en calculer la solution.1. Écrire le schéma le schéma d’Euler explicite pour ce problème. 4. Pour quellesvaleurs de h le schéma est A-stable?
1.9.1 Correction
Soit z(t) = (y(t), y′(t))T alors y′′(t) + 1001y′(t) + 1000y(t) = 0 se réécrit
z′(t) = −(
0 −11000 1001
)z(t)
Cette matrice a pour valeurs propres λ1 = 1 et λ2 = 1000 et pour vecteurs propres associésv1 = (−1, 1)T et v2 = (0, 1000)T (ci dessous le calcul formel des valeurs et vecteurs propes). Ainsi
z(t) = c1v1e−λ1t + c2v2e
−λ2t
ety(t) = −c1e
−t − c2e−1001t.
Il s’agit d’un problème stiff!
[10]: %reset -fimport sympy as symbsymb.init_printing()
symb.var('t')M = symb.Matrix(((0,-1), (1000,1001)))M
[10]: [0 −1
1000 1001
][11]: p=M.charpoly(t)
symb.factor(p)
[11]:
(t− 1000) (t− 1)
22
[12]: P, D = M.diagonalize()P,D
[12]: ([−1 −11 1000
],
[1 00 1000
])
[13]: symb.simplify(P*D*P**-1)
[13]: [0 −1
1000 1001
]
1.9.2 Correction
Soit h > 0 fixé et tn = nh pour tout n ∈ Z. Le schéma d'Euler explicite pour lesystème donné construit la suite
un+1 = un − h
(0 −1
1000 1001
)un
=
(1 h
−1000h 1− 1001h
)un
=
(1 h
−1000h 1− 1001h
)n+1
u0,
=
(−1 −11000 1
)(1− 1000h 0
0 1− h
)n+1( −1 −11000 1
)−1
u0
=
(−1 −11000 1
)((1− 1000h)n+1 0
0 (1− h)n+1
)(−1 −11000 1
)−1
u0, ∀n ∈ N.
[14]: symb.var('h')M = symb.Matrix(((1,h), (-1000*h,1-1001*h)))M
[14]: [1 h
−1000h −1001h+ 1
]
[15]: P, D = M.diagonalize()P , D
[15]: ([−1 −11000 1
],
[−1000h+ 1 0
0 −h+ 1
])
23
1.9.3 Correction
Le schéma est A-stable si limn→+∞ un+1 = 0. Il faut donc que{|1− 1000h| < 1
|1− h| < 1
d'où la condition h < 21000.
1.10 Exercice : A-stabilité du ϑ-schéma
Pour calculer la solution approchée du problème de Cauchy{y(t0) = y0,
y′(t) = φ(t, y(t)).
considérons la ϑ-méthode suivante:{u0 = y0,
un+1 = un + h (ϑφ(tn+1, un+1) + (1− ϑ)φ(tn, un)) .
avec ϑ ∈ [0; 1].
Soit φ(t, y(t)) = −βy(t) avec β > 0. Donner une condition sur h pour quela ϑ-méthode soit A-stable. Pour quelles valeurs de ϑ la méthode estinconditionnellement A-stable?
Remarque: pour ϑ = 0 on retrouve la méthode d'Euler explicite, pour ϑ = 1 laméthode d'Euler implicite, pour ϑ = 1
2 la méthode de Crank-Nicholson.
1.10.1 Correction
un+1 = un − βh(ϑun+1 + (1− ϑ)un) ⇐⇒ un+1 =1− βh(1− ϑ)
1 + βhϑun =
(1 + βhϑ)− βh
1 + βhϑun
Par inductionun =
(1− βh
1 + βhϑ
)n
y0
Il s'agit d'une suite géométrique de raison q = 1− βh1+βhϑ.
La suite tends à zéro ssi |q| < 1 (la convergence est monotone ssi 0 ≤ q < 1):
−1 < 1− βh
1 + βhϑ< 1 ⇐⇒ 0 <
βh
1 + βhϑ< 2 ⇐⇒ (1− 2ϑ)βh < 2
Pour ϑ ≥ 12 la méthode est inconditionnellement A-stable,
pour ϑ < 12 la méthode est A-stable ssi h < 2
(1−2ϑ)β.
24
1.11 Exercice : Déduction d’un schéma Predictor-Corrector
Écrire le schéma predictor-corrector basé sur AM-3 AB-2. Attention à bieninitialiser la suite récurrente.
Correction
• AB-1 un+1 = un + hφ(tn, un)• AB-2 un+1 = un + h
2 (3φ(tn, un)− φ(tn−1, un−1))
• AB-3 un+1 = un + h12 (23φ(tn, un)− 16φ(tn−1, un−1) + 5φ(tn−2, un−2))
• AM-3 un+1 = un + h24 (9φ(tn+1, un+1) + 19φ(tn, un)− 5φ(tn−1, un−1) + φ(tn−2, un−2) donc
u0 = y0,
u1 = u0 + hφ(t0, u0)
u2 = u1 +h2 (3φ(t1, u1)− φ(t0, u0))
u = un + h12 (23φ(tn, un)− 16φ(tn−1, un−1) + 5φ(tn−2, un−2))
un+1 = un + h24 (9φ(tn+1, u) + 19φ(tn, un)− 5φ(tn−1, un−1) + φ(tn−2, un−2)
1.12 Exercice : Ordre d’un schéma
Une méthode numérique à un pas a été utilisée pour résoudre une équationdifférentielle avec condition initiale. Les résultats obtenus par cette méthodeen prenant des pas de temps h = 0.1, h = 0.05 et h = 0.025 sont donnés dans letableau suivant (remarque: une valeur sur deux est affichée pour h = 0.05 et unevaleur sur quatre est affichée pour h = 0.025)
ti yi pour h = 0.1 yi pour h = 0.05 yi pour h = 0.025
1.0 0.500000 0.500000 0.5000001.1 0.512084 0.512242 0.5122801.2 0.511698 0.512101 0.5121961.3 0.500927 0.501559 0.5017041.4 0.482686 0.483447 0.4836191.5 0.459861 0.460633 0.460804
En calculant le rapport des erreurs et sachant que y(1.5) = 0.460857, déterminerl'ordre de la méthode numérique utilisée.
Correction La méthode utilisée est d'ordre 2, en effet, pour t = 1.5 nous avons
E(h = 0.05)
E(h = 0.025)=
|0.460633− 0.460857||0.460804− 0.460857|
= 4.226 ≃ 22.
Si on a accès à polyfit on peut tracer la courbe d'erreur en echèlle logaritmiqueet estimer la pente:
[ ]: %reset -f%matplotlib inline%autosave 300
25
from matplotlib.pylab import *
H=[0.1,0.05,0.025]err=[]y=0.460857err.append(abs(y-0.459861))err.append(abs(y-0.460633))err.append(abs(y-0.460804))
print ('Ordre\t %1.2f' %(polyfit(log(H),log(err), 1)[0]))
subplot(1,2,1)loglog(H,err, 'r-o');grid()subplot(1,2,2)plot(log(H),log(err), 'r-o');
1.13 Exercice : Interpolation, Quadrature et EDO
• Soit f une fonction de classe C1([−1, 1]). Écrire le polynôme p ∈ R2[τ ] quiinterpole f aux points −1, 0 et 1.
• Construire une méthode de quadrature comme suit:∫ 1
0f(τ)dτ ≈
∫ 1
0p(τ)dτ.
NB: on intègre sur [0, 1] mais on interpole en −1, 0 et 1.
• À l'aide d'un changement de variable affine entre l'intervalle [0, 1] etl'intervalle [a, b], en déduire une formule de quadrature pour l'intégrale∫ b
af(x)dx
lorsque f est une fonction de classe C1([2a− b, b]).Remarque: [2a− b, b] = [a− (b− a), a+ (b− a)]
• Considérons le problème de Cauchy: trouver y : [t0, T ] ⊂ R → R tel que{y′(t) = φ(t, y(t)), ∀t ∈ [t0, T ],
y(t0) = y0,
dont on suppose l'existence d'une unique solution y.
On subdivise l'intervalle [t0;T ] en N intervalles [tn; tn+1] de largeur
h =T − t0N
avec tn = t0 + nh pour n = 0, . . . , N. Utiliser la formule obtenueau point 3 pour approcher l'intégrale∫ tn+1
tn
φ(t, y(t))dt.
26
En déduire un schéma à deux pas implicite pour l'approximation de lasolution du problème de Cauchy.
Correction
On cherche les coefficients α, β et γ du polynôme p(τ) = α+ βτ + γτ2 tels quep(−1) = f(−1),
p(0) = f(0),
p(1) = f(1),
c'est à dire
α− β + γ = f(−1),
α = f(0),
α+ β + γ = f(1).
Donc α = f(0), β = f(1)−f(−1)2 et γ = f(1)−2f(0)+f(−1)
2 .
[ ]: import sympy as symbsymb.init_printing()
symb.var('f_0,f_1,f_m1,')
p=symb.interpolate([(1,f_1),(0,f_0),(-1,f_m1)], t).factor(t)p
On en déduit la méthode de quadrature∫ 1
0f(τ)dτ ≈
∫ 1
0p(τ)dτ = α+
β
2+
γ
3=
−f(−1) + 8f(0) + 5f(1)
12.
[ ]: q=(symb.integrate(p,(t,0,1)).simplify())q
Soit x = mτ + q, alors∫ b
af(x)dx = m
∫ 1
0f(mτ + q)dτ avec
{a = q,
b = m+ q,i.e.
{m = b− a,
q = a,
d'où le changement de variable x = (b − a)τ + a. On en déduit la formule dequadrature∫ b
af(x)dx = (b− a)
∫ 1
0f ((b− a)τ + a)dτ ≈ (b− a)
−f(2a− b) + 8f(a) + 5f(b)
12.
On pose a = tn et b = tn+1 d'où la formule de quadrature∫ tn+1
tn
f(t)dt ≈ (tn+1 − tn)−f(2tn − tn+1) + 8f(tn) + 5f(tn+1)
12= h
−f(tn−1) + 8f(tn) + 5f(tn+1)
12.
En utilisant la formule de quadrature pour l'intégration de l'EDO y′(t) = φ(t, y(t))entre tn et tn+1 on obtient
y(tn+1) = y(tn) +
∫ tn+1
tn
φ(t, y(t))dt ≈ h−φ(tn−1, y(tn−1)) + 8φ(tn, y(tn)) + 5φ(tn+1, y(tn+1))
12.
27
Si on note un une approximation de la solution y au temps tn, on obtient leschéma à deux pas implicite suivant:
u0 = y(t0) = y0,
u1 à définir,
un+1 = un + h−φ(tn−1, un−1) + 8φ(tn, un) + 5φ(tn+1, un+1)
12n = 1, 2, . . . N − 1
On peut utiliser une pédiction d'Euler explicite pour initialiser u1:u0 = y(t0) = y0,
u1 = u0 + hφ(t0, u0),
un+1 = un + h−φ(tn−1, un−1) + 8φ(tn, un) + 5φ(tn+1, un+1)
12n = 1, 2, . . . N − 1
1.14 Exercice : Interpolation, Quadrature et EDO
1. Soit h > 0 et f : [a−h, a+h] → R une fonction de classe C 1([a−h, a+h]). Écrirele polynôme p ∈ R1[x] qui interpole f aux points a−h et a, i.e. l'équation dela droite p ∈ R1[x] qui passe par les deux points (a− h, f(a− h)) et (a, f(a)).
2. Construire une méthode de quadrature comme suit:∫ a+h
af(x)dx ≈
∫ a+h
ap(x)dx.
NB: on intègre sur [a, a+ h] mais on interpole en a− h et a.3. Considérons le problème de Cauchy: trouver y : [t0, T ] ⊂ R → R tel que{
y′(t) = φ(t, y(t)), ∀t ∈ [t0, T ],
y(t0) = y0,
dont on suppose l'existence d'une unique solution y.On subdivise l'intervalle [t0;T ] en N intervalles [tn; tn+1] de largeur
h =T − t0N
avec tn = t0 + nh pour n = 0, . . . , N.Utiliser la formule obtenue au point 2 pour approcher l'intégrale∫ tn+1
tn
φ(t, y(t))dt.
En déduire un schéma à deux pas explicite pour l'approximation de lasolution du problème de Cauchy.
Correction p(x) =f(a)− f(a− h)
a− (a− h)(x− a) + f(a) =
f(a)− f(a− h)
h(x− a) + f(a).
[ ]: import sympy as symbsymb.init_printing()
symb.var('a,h,f_a,f_amh')
28
p=symb.interpolate([(a,f_a),(a-h,f_amh)], t).factor(t)p
On en déduit la méthode de quadrature
∫ a+h
af(x)dx ≈
∫ a+h
ap(x)dx
=f(a)− f(a− h)
h
[(x− a)2
2
]a+h
a
+ f(a) [x]a+ha
=f(a)− f(a− h)
2h
((a+ h− a)2 − (a− a)2
)+ f(a)(a+ h− a)
=f(a)− f(a− h)
2hh2 + hf(a)
= h3f(a)− f(a− h)
2.
[ ]: q=(symb.integrate(p,(t,a,a+h)).simplify())q
On pose a = tn et a+ h = tn+1 d'où la formule de quadrature∫ tn+1
tn
f(t)dt ≈ (tn+1 − tn)3f(tn)− f(2tn − tn+1)
2= h
3f(tn)− f(tn−1)
2.
En utilisant la formule de quadrature pour l'intégration de l'EDO y′(t) = φ(t, y(t))entre tn et tn+1 on obtient
y(tn+1) = y(tn) +
∫ tn+1
tn
φ(t, y(t))dt ≈ h3φ(tn, y(tn))− φ(tn−1, y(tn−1))
2.
Si on note un une approximation de la solution y au temps tn, on obtient leschéma à deux pas implicite suivant:
u0 = y(t0) = y0,
u1 à définir,
un+1 = un + h3φ(tn, un)− φ(tn−1, un−1)
2n = 1, 2, . . . N − 1
On peut utiliser une prédiction d'Euler explicite pour initialiser u1:u0 = y(t0) = y0,
u1 = u0 + hφ(t0, u0),
un+1 = un + h3φ(tn, un)− φ(tn−1, un−1)
2n = 1, 2, . . . N − 1
29
1.15 Exercice : Construction d’un schéma
Considérons le problème de Cauchy>trouver une fonction y : I ⊂ R → R définie sur un intervalle I = [t0, T ] telle que{
y′(t) = φ(t, y(t)), ∀t ∈ I = [t0, T ],
y(t0) = y0,
avec y0 une valeur donnée et supposons que l'on ait montré l'existence etl'unicité d'une solution y pour t ∈ I.
On subdivise l'intervalle I = [t0;T ], avec T < +∞, en N intervalles [tn; tn+1] delargeur h = (T − t0)/N avec tn = t0 + nh pour n = 0, . . . , N.Pour chaque nœud tn, on note yn = y(tn) et on cherche la valeur inconnue un quiapproche la valeur exacte yn
Si nous intégrons l'EDO y′(t) = φ(t, y(t)) entre tn−2 et tn+1 nous obtenons
yn+1 − yn−2 =
∫ tn+1
tn−2
φ(t, y(t))dt.
Écrire le schéma obtenu en approchant l'intégrale∫ tn+1
tn−2φ(t, y(t))dt par l'intégrale∫ tn+1
tn−2p(t)dt où p est le polynôme interpolant φ en tn et tn−1 (attention à bien
initialiser la suite définie par récurrence pour qu'on puisse effectivementcalculer tous les termes). Le schéma obtenu est-il explicite?
Correction Le polynôme interpolant φ en tn et tn−1 a équation
p(t) =φ(tn, yn)− φ(tn−1, yn−1)
tn − tn−1(t− tn) + φ(tn, yn).
On intègre ce polynôme entre tn−2 et tn+1:
∫ tn+1
tn−2
p(t)dt = φ(tn, yn)− φ(tn−1, yn−1)
h
[(t− tn)
2
2
]tn+1
tn−2
+ φ(tn, yn) [t]tn+1
tn−2
=φ(tn, yn)− φ(tn−1, yn−1)
2h
[(tn+1 − tn)
2 − (tn−2 − tn)2]+ φ(tn, yn) [tn+1 − tn−2]
=3
2h (φ(tn, yn) + φ(tn−1, yn−1)) .
On obtient le schéma expliciteu0 = y0,
u1 = u0 + hφ(t0, u0),
un+1 = un−2 +32h (φ(tn, un) + φ(tn−1, un−1)) .
30
M62-TD2
March 16, 2020
[19]: from IPython.display import display, Latexfrom IPython.core.display import HTMLcss_file = './custom.css'HTML(open(css_file, "r").read())
[19]: <IPython.core.display.HTML object>
[20]: import sys #only needed to determine Python version numberprint('Python version ' + sys.version)
Python version 3.6.9 (default, Nov 7 2019, 10:44:02)[GCC 8.3.0]
1 M62_TD2 : Exercices
Considérons une méthode numérique à q = p+ 1 étapes (=pas) linéaire. Elle s’écrit sous la formegénérale
un+1 =
p∑j=0
ajun−j + h
p∑j=0
bjφ(tn−j , un−j) + hb−1φ(tn+1, un+1), n = p, p+ 1, . . . , N − 1
où les {ak} et {bk} sont des coefficients donnés et p ≥ 0 un entier.
1. La méthode est consistante ssi
p∑j=0
aj = 1,
−p∑
j=0
jaj +
p∑j=−1
bj = 1
2. La méthode est zéro-stable ssi{|rj | ≤ 1 pour tout j = 0, . . . , p
ϱ′(rj) = 0 si |rj | = 1.
où ϱ est le premier polynôme caractéristique défini par
ϱ(r) = rp+1 −p∑
j=0
ajrp−j
1
3. Consistance + zéro-stabilité = convergence
4. Une méthode convergente est d’ordre ω ≥ 1 si, de plus,p∑
j=0
(−j)iaj + i
p∑j=−1
(−j)i−1bj = 1 i = 2, . . . , ω.
5. Soit β > 0 un nombre réel positif et considérons le problème de Cauchy{y′(t) = −βy(t), pour t > 0,
y(0) = 1
Sa solution est y(t) = e−βt −−−−→t→+∞
0. Si, sous d’éventuelles conditions sur h, on a |un| −−−−−→n→+∞
0
alors on dit que le schéma est A-stable.
1.1 Exercice : consistance
On notera φkdéf= φ(tk, uk). La méthode multipas suivante est-elle consistante?
un+1 = un−1 +h
4(3φn − φn−1)
1.1.1 Correction
C’est une méthode à 2 pas explicite : - p = 1 - b−1 = 0 - a0 = 0 et a1 = 1 - b0 = 34 et b1 = −1
4
La méthode n’est pas consistante car
p∑j=0
aj = 1,
−p∑
j=0
jaj +
p∑j=−1
bj = 1 +3
4− 1
4= 1
1.2 Exercice : convergence
On notera φkdéf= φ(tk, uk). La méthode multipas suivante est-elle convergente?
un+1 = −4un + 5un−1 + h(4φn+1 + 2φn)
1.2.1 Correction
C’est une méthode à 2 pas implicite : - p = 1 - b−1 = 4 - a0 = −4 et a1 = 5 - b0 = 2 et b1 = 0
2
La méthode est consistante car
p∑j=0
aj = −4 + 5 = 1,
−p∑
j=0
jaj +
p∑j=−1
bj = −(0× a0 + 1× a1
)+(b−1 + b0 + b1
)= −5 + 4 + 2 + 0 = 1.
Le premier polynôme caractéristique est
ϱ(r) = rp+1 −p∑
j=0
ajrn−j = r2 −
(a0r
1 + a1r0)= r2 − (−4r + 5) = r2 + 4r − 5 = (r − 1)(r + 5)
dont les racines sont r0 = 1 et r1 = 5. La méthode n’est pas zéro-stable car |r1| > 1, donc laméthode ne converge pas.
1.3 Exercice : convergence
On notera φkdéf= φ(tk, uk). La méthode multipas suivante est-elle convergente?
un+1 = −un + un−1 + un−2 + 4hφn
1.3.1 Correction
C’est une méthode à 3 pas explicite : - p = 2 - b−1 = 0 - a0 = −1, a1 = 1 et a2 = 1 - b0 = 4, b1 = 0et b2 = 0
La méthode est consistante car
p∑j=0
aj = −1 + 1 + 1 = 1,
−p∑
j=0
jaj +
p∑j=−1
bj = −(0× (−1) + 1× 1 + 2× 1) + (0 + 4 + 0 + 0) = −3 + 4 = 1.
Le premier polynôme caractéristique est
ϱ(r) = rp+1 −p∑
j=0
ajrn−j = r3 −
(− r2 + r+1
)= r3 + r2 − r− 1 = (r− 1)(r2 − 1) = (r− 1)2(r+1)
dont les racines sont r0 = 1 de multiplicité 2 et r1 = −1. La méthode n’est pas zéro-stable carϱ′(r0) = 0, donc la méthode ne converge pas.
1.4 Exercice : schéma à deux pas d’ordre 4
La première barrière de Dahlquist affirme qu’un schéma implicite à q = 2 étapes consistante etzéro-stable peut être d’ordre ω = q + 2 = 4.
Construire un schéma implicite à q = 2 étapes consistante et zéro-stable d’ordre ω = q + 2 = 4.
3
1.4.1 Correction
Un schéma implicite à q = 2 étapes s’écrit
un+1 = a0un + a1un−1 + h(b−1φn+1 + b0φn + b1φn−1
)La méthode est d’ordre 4 ssi
p∑j=0
aj = 1,
p∑j=0
(−j)aj +
p∑j=−1
bj = 1
p∑j=0
(−j)2aj + 2
p∑j=−1
(−j)1bj = 1
p∑j=0
(−j)3aj + 3
p∑j=−1
(−j)2bj = 1
p∑j=0
(−j)4aj + 4
p∑j=−1
(−j)3bj = 1
ssi
a0 + a1 = 1,
−(0a0 + 1a1
)+(b−1 + b0 + b1
)= 1(
02a0 + 12a1)− 2
(− 1b−1 + 0b0 + 1b1
)= 1
−(03a0 + 13a1
)+ 3
((−1)2b−1 + 02b0 + 12b1
)= 1(
04a0 + 14a1)− 4
((−1)3b−1 + 03b0 + 13b1
)= 1
ssi 1 1 0 0 00 −1 1 1 10 1 2 0 −20 −1 3 0 30 1 4 0 −4
a0a1b−1
b0b1
=
11111
[3]: import sympy as sym
sym.init_printing()
sym.var('a_0,a_1,b_m1,b_0,b_1')
eq1 = sym.Eq(a_0 + a_1, 1)eq2 = sym.Eq(-a_1 + b_m1 + b_0 + b_1, 1)eq3 = sym.Eq(a_1 + 2 * b_m1 - 2 * b_1, 1)eq4 = sym.Eq(-a_1 + 3 * b_m1 + 3 * b_1, 1)eq5 = sym.Eq(a_1 + 4 * b_m1 - 4 * b_1, 1)sym.solve([eq1, eq2, eq3, eq4, eq5])
[3]:
4
{a0 : 0, a1 : 1, b0 :
4
3, b1 :
1
3, bm1 :
1
3
}On reconnait la méthode MS2.
Le premier polynôme caractéristique est
ϱ(r) = rp+1 −p∑
j=0
ajrp−j = r2 − a0r − a1 = (r − 1)(r + 1)
dont les racines sont r0 = 1 et r1 = −1. La méthode est zéro-stable car{|rj | ≤ 1 pour tout j = 0, . . . , p
ϱ′(rj) = 0 si |rj | = 1,
1.5 Exercice : convergence
On notera φkdéf= φ(tk, uk). Soit la méthode multipas
un+1 = (1− b)un + bun−1 +h
4((b+ 3)φn+1 + (3b+ 1)φn−1).
1. Pour quelles valeurs de b est-elle consistante? 1. Pour quelles valeurs de best-elle zéro-stable? 1. Pour quelles valeurs de b est-elle convergente? 1. Pourquelles valeurs de b est-elle convergente d'ordre 2? et d'ordre 3? 1. Pour b = 1
2vérifier empiriquement la convergence sur le problème de Cauchy{
y′(t) = −4y(t) + t2, ∀t ∈ I = [0, 1],
y(0) = 1
1.5.1 Correction
C'est une méthode à 2 pas implicite : - p = 1 - b−1 = b+34 - a0 = 1 − b et a1 = b -
b0 = 0 et b1 =3b+14
1. La méthode est consistante pour tout b car
p∑j=0
aj = 1− b+ b = 1 pour tout b,
−p∑
j=0
jaj +
p∑j=−1
bj = −(0× (1− b) + 1× b
)+(b+ 3
4+ 0 +
3b+ 1
4
)= 1 pour tout b
2. Le premier polynôme caractéristique est
ϱ(r) = rp+1 −p∑
j=0
ajrp−j = r2 − (1− b)r − b = (r − 1)(r + b)
5
dont les racines sont r0 = 1 et r1 = −b. La méthode est zéro-stable ssi{|rj | ≤ 1 pour tout j = 0, . . . , p
ϱ′(rj) = 0 si |rj | = 1,
donc ssi −1 ≤ −b ≤ 1 et −b = 1, i.e. ssi −1 < b ≤ 1.
3. La méthode est convergente ssi elle est consistante et zéro-stable donc ssi−1 < b ≤ 1.
4. La méthode est d'ordre au moins 2 pour tout b carp∑
j=0
(−j)2aj+2
p∑j=−1
(−j)1bj =(02a0+12a1
)−2
(−1b−1+0b0+1b1
)= b−2
(−b+ 3
4+3b+ 1
4
)= 1
Pour que la méthode soit d'ordre 3 il faut que
1 =
p∑j=0
(−j)3aj+3
p∑j=−1
(−j)2bj = −(03a0+13a1
)+3
((−1)2b−1+02b0+12b1
)= −b+3
(b+ 3
4+3b+ 1
4
)= 2b+3
donc ssi b = −1. Cependant cette valeur n'appartient pas au domain dezéro-stabilité.On conclut que la méthode est convergente d'ordre 2 pour −1 < b ≤ 1 et nonconvergente sinon.
5. On définit la solution exacte (calculée en utilisant le module sympy) pourestimer les erreurs:
[4]: %reset -f%matplotlib inline
from matplotlib.pylab import *
# variables globalest0 = 0tfinal = 1y0 = 1
phi = lambda t,y : -4*y+t**2
b=1/2
[5]: import sympy as symsym.init_printing()
t = sym.Symbol('t')y = sym.Function('y')edo= sym.Eq( sym.diff(y(t),t) , phi(t,y(t)) )display(edo)solgen = sym.dsolve(edo)
6
display(solgen)
consts = sym.solve( sym.Eq( y0, solgen.rhs.subs(t,t0)) , dict=True)[0]display(consts)solpar=solgen.subs(consts).simplify()display(solpar)
sol_exacte = sym.lambdify(t,solpar.rhs,'numpy')
d
dty(t) = t2 − 4y(t)
y(t) =
(C1 +
e4t
32
(8t2 − 4t+ 1
))e−4t
{C1 :
31
32
}
y(t) =t2
4− t
8+
1
32+
31
32e−4t
On calcule la solution approchée pour différentes valeurs de N:
[6]: from scipy.optimize import fsolve
def multipas(phi, tt):h = tt[1] - tt[0]uu = [y0]uu.append(sol_exacte(tt[1]))for i in range(1,len(tt) - 1):
temp = fsolve(lambda x: -x + (1-b)*uu[i]+b*uu[i-1] + h/4 * (␣↪→(b+3)*phi(tt[i+1],x)+(3*b+1)*phi(tt[i-1],uu[i-1]) ), uu[i])
uu.append(temp)return uu
H = []err_mp = []N = 10for k in range(7):
N+=20tt = linspace(t0, tfinal, N + 1)h = tt[1] - tt[0]yy = [sol_exacte(t) for t in tt]uu_mp = multipas(phi, tt)H.append(h)err_mp.append(max([abs(uu_mp[i] - yy[i]) for i in range(len(yy))]))
7
print ('Multipas %1.2f' %(polyfit(log(H),log(err_mp), 1)[0]))
figure(figsize=(8,5))plot(log(H), log(err_mp), 'r-o', label='Multipas')xlabel('$\ln(h)$')ylabel('$\ln(e)$')legend(bbox_to_anchor=(1.04, 1), loc='upper left')grid(True)show()
Multipas 1.97
1.6 Exercice : convergence
On notera φkdéf= φ(tk, uk). Soit la méthode multipas
un+1 =
(1
3b2 +
1
2b
)un+
(2
3b2 +
1
2b− 1
)un−1+h
((−1
6b2 − 1
4b+ 2
)φn +
(−1
6b2 − 1
4b
)φn−1
).
1. Pour quelles valeurs de b est-elle consistante? 1. Est-elle convergente pources valeurs? 1. Quel ordre de convergente a-t-elle? 1. Pour les valeurs de bqui donnent la convergence, vérifier empiriquement l'ordre de convergence sur leproblème de Cauchy {
y′(t) = −10(y(t)− 1
)2, ∀t ∈ I = [0, 1],
y(0) = 2.
8
1.6.1 Correction
C'est une méthode à q = 2 pas explicite : - p = 1 - b−1 = 0 - a0 = 13b
2 + 12b et a1 =
23b
2 + 12b− 1 - b0 = −1
6b2 − 1
4b+ 2 et b1 = −16b
2 − 14b
1. La méthode est consistante ssi
p∑j=0
aj = b2 + b− 1 = 1,
−p∑
j=0
jaj +
p∑j=−1
bj = −(0a0 + 1a1
)+(b−1 + b0 + b1
)= b2 + b− 1 = 1
donc ssi b = −2 ou b = 1.
2. Le premier polynôme caractéristique est
ϱ(r) = rp+1 −p∑
j=0
ajrp−j = r2 − a0r − a1 =
{r2 − 1
3r −23 si b = −2,
r2 − 56r −
16 si b = 1,
dont les racines sont {r0 = 1, r1 = −2
3 si b = −2,
r0 = 1, r1 = −16 si b = 1,
La méthode est zéro-stable ssi{|rj | ≤ 1 pour tout j = 0, . . . , p
ϱ′(rj) = 0 si |rj | = 1,
donc elle est vérifiée pour les deux cas.
La méthode est convergente ssi elle est consistante et zéro-stable donc ssib = −2 ou b = 1.
1. La méthode est d'ordre au moins 2 carp∑
j=0
(−j)2aj + 2
p∑j=−1
(−j)1bj =
{23 + 21
6 = 1 si b = −2,16 + 2 5
12 = 1 si b = 1,
La méthode n'est pas d'ordre 3 car
p∑j=0
(−j)3aj + 3
p∑j=−1
(−j)2bj ==
{−2
3 + 3−16 = 1 si b = −2,
−16 + 3−5
12 = 1 si b = 1,
2. On définit la solution exacte (calculée en utilisant le module sympy) pourestimer les erreurs:
[7]: %reset -f%matplotlib inline
from matplotlib.pylab import *
9
# variables globalest0 = 0tfinal = 1y0 = 2
phi = lambda t,y : -10*(y-1)**2
[8]: import sympy as symsym.init_printing()
t = sym.Symbol('t')y = sym.Function('y')edo= sym.Eq( sym.diff(y(t),t) , phi(t,y(t)) )display(edo)solgen = sym.dsolve(edo)display(solgen)
consts = sym.solve( sym.Eq( y0, solgen.rhs.subs(t,t0)) , dict=True)[0]display(consts)solpar=solgen.subs(consts).simplify()display(solpar.apart())
sol_exacte = sym.lambdify(t,solpar.rhs,'numpy')
d
dty(t) = −10 (y(t)− 1)2
y(t) =C1 − t− 1
10
C1 − t
{C1 : −
1
10
}
y(t) = 1 +1
10t+ 1
On calcule la solution approchée pour différentes valeurs de N:
[9]: from scipy.optimize import fsolve
def multipas(b, phi, tt):h = tt[1] - tt[0]uu = [y0]uu.append(sol_exacte(tt[1]))for i in range(1,len(tt) - 1):
10
uu.append( (b**2/3+b/2)*uu[i]+(2*b**2/3+b/2-1)*uu[i-1]+h*(-b**2/6-b/↪→4+2)*phi(tt[i],uu[i])+h*(-b**2/6-b/4)*phi(tt[i-1],uu[i-1]) )
return uu
H = []err_mp1 = []err_mp2 = []N = 10for k in range(7):
N+=20tt = linspace(t0, tfinal, N + 1)h = tt[1] - tt[0]yy = [sol_exacte(t) for t in tt]uu_mp1 = multipas( 1,phi, tt)uu_mp2 = multipas(-2,phi, tt)H.append(h)err_mp1.append(max([abs(uu_mp1[i] - yy[i]) for i in range(len(yy))]))err_mp2.append(max([abs(uu_mp2[i] - yy[i]) for i in range(len(yy))]))
print ('Multipas b= 1 ordre=%1.2f' %(polyfit(log(H),log(err_mp1), 1)[0]))print ('Multipas b=-2 ordre=%1.2f' %(polyfit(log(H),log(err_mp2), 1)[0]))
figure(figsize=(8,5))plot(log(H), log(err_mp1), 'r-o', label='Multipas b=1')plot(log(H), log(err_mp2), 'b-d', label='Multipas b=-2')xlabel('$\ln(h)$')ylabel('$\ln(e)$')legend(bbox_to_anchor=(1.04, 1), loc='upper left')grid(True)show()
Multipas b= 1 ordre=2.01Multipas b=-2 ordre=2.22
11
1.7 Exercice : convergence
On notera φkdéf= φ(tk, uk). Soit la méthode multipas
un+1 =
(b2 − 9
2b+
11
2
)un +
(b2 − 7
2b+
3
2
)un−1 + h
(b
2(b− 2)φn +
b
2
(b− 10
3
)φn−1
).
- Pour quelles valeurs de b est-elle consistante? - Est-elle convergente pources valeurs? - Quel ordre de convergente a-t-elle? - Pour les valeurs de b quidonnent la convergence, vérifier empiriquement l'ordre de convergence sur leproblème de Cauchy {
y′(t) = y(t)(1− y(t)), ∀t ∈ I = [0, 1],
y(0) = 2.
1.7.1 Correction
C'est une méthode à q = 2 pas explicite : - p = 1 - b−1 = 0 - a0 = b2 − 92b +
112 et
a1 = b2 − 72b+
32 - b0 =
b2(b− 2) et b1 =
b2
(b− 10
3
)• La méthode est consistante ssi
p∑j=0
aj = 2b2 − 8b+ 7 = 1,
−p∑
j=0
jaj +
p∑j=−1
bj = −(0a0 + 1a1
)+(b−1 + b0 + b1
)=
5
6b− 19
6= 1
donc ssi b = 3. Vérifions ces calculs ci-dessous:
12
[10]: import sympy as symsym.init_printing()
sym.var('b')p=1bm1=0a0=b**2-sym.Rational(9,2)*b+sym.Rational(11,2)a1=b**2-sym.Rational(7,2)*b+sym.Rational(3,2)b0=sym.Rational(1,2)*b*(b-2)b1=sym.Rational(1,2)*b*(b-sym.Rational(10,3))
cond1=a0+a1cond2=-(0*a0+1*a1)+(bm1+b0+b1)display(cond1)display(cond2.factor())display(sym.solve([sym.Eq(cond1,1),sym.Eq(cond2,1)],b))
2b2 − 8b+ 7
1
6(5b− 9)
[(3)]
Dans la suite on considerera b = 3.
[11]: from IPython.display import display, Mathdisplay(Math('a_0='+sym.latex(a0.subs(b,3))))display(Math('a_1='+sym.latex(a1.subs(b,3))))display(Math('b_0='+sym.latex(b0.subs(b,3))))display(Math('b_1='+sym.latex(b1.subs(b,3))))
a0 = 1
a1 = 0
b0 =3
2
b1 = −1
2
• Le premier polynôme caractéristique est
ϱ(r) = rp+1 −p∑
j=0
ajrp−j = r2 − a0r − a1
b=3= r2 − r
dont les racines sontr0 = 1, r1 = 0
13
La méthode est zéro-stable ssi{|rj | ≤ 1 pour tout j = 0, . . . , p
ϱ′(rj) = 0 si |rj | = 1,
ce qui est bien vérifié.
La méthode est convergente ssi elle est consistante et zéro-stable donc ssi b = 3.
• La méthode est d'ordre au moins 2 carp∑
j=0
(−j)2aj + 2
p∑j=−1
(−j)1bj =(02a0 + 12a1
)+ 2
(− (−1)b−1 + 0b0 + 1b1
) b=3= 1
La méthode n'est pas d'ordre 3 car
p∑j=0
(−j)3aj + 3
p∑j=−1
(−j)2bj = −a1 + 3(b−1 + b1
) b=3= 1
• On définit la solution exacte (calculée en utilisant le module sympy) pourestimer les erreurs:
[12]: %reset -f%matplotlib inline
from matplotlib.pylab import *
# variables globalest0 = 0tfinal = 1y0 = 2
phi = lambda t,y : y*(1-y)
[13]: import sympy as symsym.init_printing()
t = sym.Symbol('t')y = sym.Function('y')edo= sym.Eq( sym.diff(y(t),t) , phi(t,y(t)) )display(edo)solgen = sym.dsolve(edo)display(solgen)
consts = sym.solve( sym.Eq( y0, solgen.rhs.subs(t,t0)) , dict=True)[0]display(consts)solpar=solgen.subs(consts).simplify()display(solpar.apart())
sol_exacte = sym.lambdify(t,solpar.rhs,'numpy')
14
d
dty(t) = (−y(t) + 1) y(t)
y(t) = − 1
C1e−t − 1
{C1 :
1
2
}
y(t) = 1 +1
2et − 1
On calcule la solution approchée pour différentes valeurs de N:
[14]: from scipy.optimize import fsolve
def multipas(phi, tt):h = tt[1] - tt[0]uu = [y0]uu.append(sol_exacte(tt[1]))for i in range(1,len(tt) - 1):
uu.append( uu[i]+h*3/2*phi(tt[i],uu[i])-h/2*phi(tt[i-1],uu[i-1]) )return uu
H = []err_mp = []N = 10for k in range(7):
N+=20tt = linspace(t0, tfinal, N + 1)h = tt[1] - tt[0]yy = [sol_exacte(t) for t in tt]uu_mp = multipas(phi, tt)H.append(h)err_mp.append(max([abs(uu_mp[i] - yy[i]) for i in range(len(yy))]))
print ('Multipas b= 3 ordre=%1.2f' %(polyfit(log(H),log(err_mp), 1)[0]))
figure(figsize=(8,5))plot(log(H), log(err_mp), 'r-o', label='Multipas b=3')xlabel('$\ln(h)$')ylabel('$\ln(e)$')legend(bbox_to_anchor=(1.04, 1), loc='upper left')grid(True)show()
15
Multipas b= 3 ordre=1.98
1.8 Exercice : convergence predictor-corrector
On notera φkdéf= φ(tk, uk). Soit les méthodes multipas
un+1 = un +h
2(23φn − 16φn−1 + 5φn−2) [P]
un+1 = un +h
24(9φn+1 + 19φn − 5φn−1 + φn−2) [C]
• Étudier consistance, ordre et zéro-stabilité de la méthode P• Étudier consistance, ordre et zéro-stabilité de la méthode C• Soit la méthode PC suivante:{
u = un + h12 (23φn − 16φn−1 + 5φn−2)
un+1 = un + h24 (9φ(tn+1, u) + 19φn − 5φn−1 + φn−2)
Calculer empiriquement l'ordre de convergence de la méthode PC sur leproblème de Cauchy {
y′(t) = 11+t2
− 2y2(t), ∀t ∈ I = [0, 1],
y(0) = 0,
dont la solution exacte est y(t) = t1+t2
.
16
1.8.1 Correction schéma P
P est une méthode à q = 3 pas explicite : - p = 2 - b−1 = 0 - a0 = 1 et a1 = a2 = 0 -b0 =
2312, b1 =
−1612 et b2 =
512 - La méthode est consistante d'ordre 3 car
p∑j=0
aj = 1,
p∑j=0
−jaj +
p∑j=−1
bj = −a1 − 2a2 +(b−1 + b0 + b1 + b2
)= 1
p∑j=0
(−j)2aj + 2
p∑j=−1
(−j)1bj = a1 + 4a2 − 2(− b−1 + b1 + 2b2
)= 1
p∑j=0
(−j)3aj + 3
p∑j=−1
(−j)2bj = −a1 − 8a2 + 3(b−1 + b1 + 4b2
)= 1
p∑j=0
(−j)4aj + 4
p∑j=−1
(−j)3bj = a1 + 16a2 − 4(− b−1 + b1 + 8b2
)= 1
Vérifions ces calculs ci-dessous:
[15]: import sympy as symsym.init_printing()
sym.var('b')p=1bm1=0a0=1a1=0a2=0b0=sym.Rational(23,12)b1=sym.Rational(-16,12)b2=sym.Rational(5,12)
cond11=a0+a1+a2cond12=-a1+2*a2+(bm1+b0+b1+b2)cond2=a1+4*a2-2*(-bm1+b1+2*b2)cond3=-a1-8*a2+3*(bm1+b1+4*b2)cond4=a1+16*a2-4*(-bm1+b1+8*b2)display(cond11)display(cond12)display(cond2)display(cond3)display(cond4)
1
1
17
1
1
−8
• Le premier polynôme caractéristique est
ϱ(r) = rp+1 −p∑
j=0
ajrp−j = r3 − a0r
2 − a1r − a2 = r3 − r2 = r2(r − 1)
dont les racines sontr0 = 1, r1 = r2 = 0
La méthode est zéro-stable ssi{|rj | ≤ 1 pour tout j = 0, . . . , p
ϱ′(rj) = 0 si |rj | = 1,
ce qui est bien vérifié.
La méthode est convergente car consistante et zéro-stable.
1.8.2 Correction schéma C
C est une méthode à q = 3 pas implicite : - p = 2 - b−1 = 924 - a0 = 1 et a1 = a2 = 0
- b0 =1924, b1 =
−524 et b2 =
124 - La méthode est consistante d'ordre 4 car
p∑j=0
aj = 1,
p∑j=0
−jaj +
p∑j=−1
bj = −a1 − 2a2 +(b−1 + b0 + b1 + b2
)= 1
p∑j=0
(−j)2aj + 2
p∑j=−1
(−j)1bj = a1 + 4a2 − 2(− b−1 + b1 + 2b2
)= 1
p∑j=0
(−j)3aj + 3
p∑j=−1
(−j)2bj = −a1 − 8a2 + 3(b−1 + b1 + 4b2
)= 1
p∑j=0
(−j)4aj + 4
p∑j=−1
(−j)3bj = a1 + 16a2 − 4(− b−1 + b1 + 8b2
)= 1
p∑j=0
(−j)5aj + 5
p∑j=−1
(−j)4bj = −a1 + 32a2 + 5(b−1 + b1 + 16b2
)= 1
Vérifions ces calculs ci-dessous:
18
[16]: import sympy as symsym.init_printing()
sym.var('b')p=1bm1=sym.Rational(9,24)a0=1a1=0a2=0b0=sym.Rational(19,24)b1=sym.Rational(-5,24)b2=sym.Rational(1,24)
cond11=a0+a1+a2cond12=-a1+2*a2+(bm1+b0+b1+b2)cond2=a1+4*a2-2*(-bm1+b1+2*b2)cond3=-a1-8*a2+3*(bm1+b1+4*b2)cond4=a1+16*a2-4*(-bm1+b1+8*b2)cond5=-a1+32*a2+5*(bm1+b1+16*b2)display(cond11)display(cond12)display(cond2)display(cond3)display(cond4)display(cond5)
1
1
1
1
1
25
6
• Le premier polynôme caractéristique est
ϱ(r) = rp+1 −p∑
j=0
ajrp−j = r3 − a0r
2 − a1r − a2 = r3 − r2 = r2(r − 1)
19
dont les racines sontr0 = 1, r1 = r2 = 0
La méthode est zéro-stable ssi{|rj | ≤ 1 pour tout j = 0, . . . , p
ϱ′(rj) = 0 si |rj | = 1,
ce qui est bien vérifié.
La méthode est convergente car consistante et zéro-stable.
1.8.3 Correction schéma PC
Il est d'ordre 4 car le prédictor est d'ordre 3 et le corrector d'ordre 4.
On définit la solution exacte pour estimer les erreurs:
[17]: %reset -f%matplotlib inline
from matplotlib.pylab import *
# variables globalest0 = 0tfinal = 1y0 = 0
phi = lambda t,y : 1/(1+t**2)-2*y**2
sol_exacte = lambda t : t/(1+t**2)
On calcule la solution approchée pour différentes valeurs de N pour les troisschémas:
[18]: from scipy.optimize import fsolve
def multipas_P(phi, tt):h = tt[1] - tt[0]uu = [y0]uu.append(sol_exacte(tt[1]))uu.append(sol_exacte(tt[2]))for i in range(2,len(tt) - 1):
uu.append( uu[i]+h/12* (␣↪→23*phi(tt[i],uu[i])-16*phi(tt[i-1],uu[i-1])+5*phi(tt[i-2],uu[i-2]) ) )
return uu
def multipas_C(phi, tt):h = tt[1] - tt[0]
20
uu = [y0]uu.append(sol_exacte(tt[1]))uu.append(sol_exacte(tt[2]))for i in range(2,len(tt) - 1):
temp = fsolve ( lambda x : -x+uu[i]+h/24* ( 9*phi(tt[i+1],x) +␣↪→19*phi(tt[i],uu[i])-5*phi(tt[i-1],uu[i-1])+phi(tt[i-2],uu[i-2]) ), uu[i])
uu.append(temp)return uu
def multipas_PC(phi, tt):h = tt[1] - tt[0]uu = [y0]uu.append(sol_exacte(tt[1]))uu.append(sol_exacte(tt[2]))for i in range(2,len(tt) - 1):
u_tilde = uu[i]+h/12* (␣↪→23*phi(tt[i],uu[i])-16*phi(tt[i-1],uu[i-1])+5*phi(tt[i-2],uu[i-2]) )
uu.append( uu[i]+h/24* ( 9*phi(tt[i+1],u_tilde) +␣↪→19*phi(tt[i],uu[i])-5*phi(tt[i-1],uu[i-1])+phi(tt[i-2],uu[i-2]) ) )
return uu
H = []err_p = []err_c = []err_pc = []N = 10for k in range(7):
N+=20tt = linspace(t0, tfinal, N + 1)h = tt[1] - tt[0]yy = [sol_exacte(t) for t in tt]uu_p = multipas_P(phi, tt)uu_c = multipas_C(phi, tt)uu_pc = multipas_PC(phi, tt)H.append(h)err_p.append(max([abs(uu_p[i] - yy[i]) for i in range(len(yy))]))err_c.append(max([abs(uu_c[i] - yy[i]) for i in range(len(yy))]))err_pc.append(max([abs(uu_pc[i] - yy[i]) for i in range(len(yy))]))
print ('Multipas P ordre=%1.2f' %(polyfit(log(H),log(err_p), 1)[0]))print ('Multipas C ordre=%1.2f' %(polyfit(log(H),log(err_c), 1)[0]))print ('Multipas PC ordre=%1.2f' %(polyfit(log(H),log(err_pc), 1)[0]))
figure(figsize=(8,5))plot(log(H), log(err_p), 'r-o', label='Multipas P')plot(log(H), log(err_c), 'b-o', label='Multipas C')
21
plot(log(H), log(err_pc), 'c-o', label='Multipas PC')xlabel('$\ln(h)$')ylabel('$\ln(e)$')legend(bbox_to_anchor=(1.04, 1), loc='upper left')grid(True)show()
Multipas P ordre=2.99Multipas C ordre=3.86Multipas PC ordre=4.00
22
M62-TD3
March 16, 2020
[1]: from IPython.display import display, Latexfrom IPython.core.display import HTMLcss_file = './custom.css'HTML(open(css_file, "r").read())
[1]: <IPython.core.display.HTML object>
[2]: import sys #only needed to determine Python version numberprint('Python version ' + sys.version)
Python version 3.6.9 (default, Nov 7 2019, 10:44:02)[GCC 8.3.0]
1 M62_TD3 : Révisions
1.1 Exercice : construction d’un schéma
Considérons le problème de Cauchy:>trouver y : [t0, T ] ⊂ R → R tel que{
y′(t) = φ(t, y(t)), ∀t ∈ [t0, T ],
y(t0) = y0.
Supposons que l’on ait montré l’existence d’une unique solution y.
On subdivise l’intervalle [t0, T ] en N intervalles de longueur h = (T − t0)/N = tn+1 − tn. Pourchaque nœud tn = t0 + nh (1 ≤ n ≤ N) on cherche la valeur inconnue un qui approche y(tn).L’ensemble de N + 1 valeurs {u0 = y0, u1, . . . , uN} représente la solution numérique.
Dans cette exercice on va construire des nouveaux schémas numériques basés sur l’intégration del’EDO y′(t) = φ(t, y(t)) entre tn et tn+2:
y(tn+2) = y(tn) +
∫ tn+2
tn
φ(t, y(t))dt.
1. En utilisant la formule de quadrature du point milieu pour approcher le membre de droite écrireun schéma numérique explicite permettant de calculer un+2 à partir de un+1 et un. Notons quece schéma a besoin de deux valeurs initiales; on posera alors u0 = y0 et u1 sera approché par une
1
prédiction d’Euler progressive. 2. En utilisant la formule de quadrature de Cavalieri-Simpson pourapprocher le membre de droite écrire un schéma numérique implicite permettant de calculer un+2
à partir de un+1 et un. Notons que ce schéma a besoin de deux valeurs initiales; on posera alorsu0 = y0 et u1 sera approché par une prédiction d’Euler progressive. 3. Proposer une modificationdu schéma au point précédent pour qu’il devient explicite.
Rappels: une formule de quadrature interpolatoire approche l’intégrake d’une fonction f parl’intègrale dun polynôme qui interpole f en des points donnés:
∫ ba f(t)dt ≈
∫ ba p(t)dt + la formule
de quadrature du point milieu considère comme points d’interpolation le point a+b2 ainsi∫ b
af(t)dt ≈
∫ b
af
(a+ b
2
)dt = (b− a)f
(a+ b
2
)+ la formule de Simpson considère comme points d’interpolation les points
{a, a+b
2 , b}
ainsi∫ b
af(t)dt ≈ b− a
6
[f(a) + 4f
(a+ b
2
)+ f(b)
]
1.1.1 Correction
Si on utilise la formule de quadrature du point milieu sur l’intervalle [tn; tn+2], ie∫ tn+2
tn
φ(t, y(t))dt ≈ 2hφ (tn+1, y(tn+1))
on obtient u0 = y(t0) = y0,
u1 ≈ y(t1)
un+2 = un + 2hφ(tn+1, un+1) n = 0, 1, . . . N − 2
où u1 est une approximation de y(t1). Nous pouvons utiliser une prédiction d’Euler progressivepour approcher u1. Nous avons construit ainsi un nouveau schéma explicite à 2 pas:
u0 = y(t0) = y0,
u1 = u0 + hφ(t0, u0),
un+2 = un + 2hφ(tn+1, un+1) n = 0, 1, . . . N − 2
1.1.2 Correction
Si on utilise la formule de quadrature de Cavalieri-Simpson sur l’intervalle [tn; tn+2], ie∫ tn+2
tn
φ(t, y(t))dt ≈ h
3(φ(tn, y(tn)) + 4φ(tn+1, y(tn+1)) + φ(tn+2, y(tn+2))) ,
et avec une prédiction d’Euler explicite pour approcher u1, nous obtenons un nouveau schémaimplicite à 3 pas:
u0 = y(t0) = y0,
u1 = u0 + hφ(t0, u0),
un+2 = un + h3 (φ(tn, un) + 4φ(tn+1, un+1) + φ(tn+2, un+2)) n = 0, 1, . . . N − 2
2
1.1.3 Correction
Pour éviter le calcul implicite de un+2, nous pouvons utiliser une technique de type predictor-corrector et remplacer le un+2 dans le terme φ(tn+2, un+2) par exemple par un+2 = un+1 +hφ(tn+1, un+1). Nous avons construit ainsi un nouveau schéma explicite à 3 pas:u0 = y(t0) = y0,
u1 = u0 + hφ(t0, u0),
un+2 = un + h3 (φ(tn, un) + 4φ(tn+1, un+1) + φ(tn+2, un+1 + hφ(tn+1, un+1)) n = 0, 1, . . . N − 2
1.2 Exercice : EDO d’ordre 2
Considérons le problème de Cauchyy′′(t) = ty(t), t ∈ [0; 4.5]
y(0) = 0.355028053887817,
y′(0) = −0.258819403792807.
Transformer l’EDO d’ordre 2 en un système de deux EDO d’ordre 1.Calculer la valeur approchée de y en t = 4.5 obtenue avec le schéma RK4 avec un pas de discréti-sation h = 0.001.
1.2.1 Correction
On appelle x(t) = y(t) et z(t) = y′(t), alors on a x′(t) = y′(t) = z(t) et z′(t) = y′′(t) = ty(t) = tx(t)donc
x′(t) = z(t)
z′(t) = tx(t)
x(0) = 0.355028053887817,
z(0) = −0.258819403792807.
[3]: def RK4(phi1,phi2,tt):uu1 = [y0]uu2 = [yp0]for i in range(len(tt)-1):
k1_1 = phi1( tt[i] , uu1[i] , uu2[i] )k1_2 = phi2( tt[i] , uu1[i] , uu2[i] )k2_1 = phi1( tt[i]+h/2 , uu1[i]+h*k1_1/2, uu2[i]+h*k1_2/2 )k2_2 = phi2( tt[i]+h/2 , uu1[i]+h*k1_1/2, uu2[i]+h*k1_2/2 )k3_1 = phi1( tt[i]+h/2 , uu1[i]+h*k2_1/2, uu2[i]+h*k2_2/2 )k3_2 = phi2( tt[i]+h/2 , uu1[i]+h*k2_1/2, uu2[i]+h*k2_2/2 )k4_1 = phi1( tt[i+1] , uu1[i]+h*k3_1 , uu2[i]+h*k3_2 )k4_2 = phi2( tt[i+1] , uu1[i]+h*k3_1 , uu2[i]+h*k3_2 )uu1.append( uu1[i] + (k1_1+2.0*k2_1+2.0*k3_1+k4_1)*h/6 )
3
uu2.append( uu2[i] + (k1_2+2.0*k2_2+2.0*k3_2+k4_2)*h/6 )return [uu1,uu2]
phi1 = lambda t,y1,y2 : y2phi2 = lambda t,y1,y2 : t*y1
t0=0.0y0=0.355028053887817yp0=-0.258819403792807h=0.001
tt=[t0+i*h for i in range(4501)][uu1,uu2]=RK4(phi1,phi2,tt)print("u(%1.2f)=%1.16f"%(tt[-1],uu1[-1]))
u(4.50)=0.0003302503231810
1.3 Exercice : Étude d’un problème numériquement mal posé
Considérons le problème de Cauchy{y′(t) = 3y(t)− 4e−t, t ∈ [0; 1],
y(0) = 1 + ε.
1. Calculer la solution exacte. 2. Utiliser la méthode RK4 pour calculer la solution approchée avecun pas h = 1
10 et comparer à la solution exacte pour trois valeurs des ε, à savoir ε = 1, ε = 110 et
ε = 0. 3. Même exercice avec la méthode d’Euler explicite. 3. Commenter les résultats.
1.3.1 Correction : solution exacte (avec SymPy)
La solution exacte est y(t) = εe3t + e−t.
Si ε = 0, la solution exacte devient donc y(t) = e−t mais le problème est mal conditionné cartoute (petite) erreur de calcul a le même effet qu’une perturbation de la condition initiale: on”réveil” le terme dormant e3t.
[4]: %reset -f
import sympy as symsym.init_printing(pretty_print=True)
sym.var('t,epsilon')y=sym.Function('y')
edo=sym.Eq( sym.diff(y(t),t), 3*y(t)-4*sym.exp(-t) )
print("EDO")
4
display(edo)
print("\nSolution generale")soln=sym.dsolve(edo,y(t))display(soln.expand())
print("\nEn prenant en compte la CI on trouve")t0 = 0y0 = 1+epsilonconstants = sym.solve([soln.rhs.subs(t,t0) - y0])display(constants)
print("\nSolution particuliere")sym.var('C1')solp = soln.subs(constants)display(solp.expand())
EDO
d
dty(t) = 3y(t)− 4e−t
Solution generale
y(t) = C1e3t + e−t
En prenant en compte la CI on trouve
{C1 : ϵ}
Solution particuliere
y(t) = ϵe3t + e−t
[5]: %matplotlib inlinefrom matplotlib.pylab import *
func = sym.lambdify((t,epsilon),solp.rhs,'numpy')
tt=linspace(0,1,101)figure(figsize=(18,5))EPSILON=[1,1.e-1,0]for i,epsi in enumerate(EPSILON):
subplot(1,3,i+1)
5
plot(tt,func(tt,epsi))title("$\epsilon=$"+str(epsi));
1.3.2 Correction : solution approchée (avec RK41 et EE)
[6]: %reset -f%matplotlib inline
from matplotlib.pylab import *
phi = lambda t,y : 3*y-4*exp(-t)sol_exacte = lambda t,y0 : (y0-1)*exp(3*t)+exp(-t)
def EE(phi,tt):uu = [y0]for i in range(N):
uu.append( uu[i] + h*phi(tt[i],uu[i]) )return uu
def RK4(phi,tt):uu = [y0]for i in range(N):
k1 = phi( tt[i], uu[i] )k2 = phi( tt[i]+h/2 , uu[i]+h*k1/2 )k3 = phi( tt[i]+h/2 , uu[i]+h*k2/2 )k4 = phi( tt[i+1] , uu[i]+h*k3 )uu.append( uu[i] + (k1+2*k2+2*k3+k4)*h/6 )
return uu
# INITIALISATIONt0 = 0tfinal = 1
6
# DISCRETISATIONN = 10h = (tfinal-t0)/Ntt = [ t0+i*h for i in range(N+1) ]
EPSILON=[1,1.e-1,0]
figure(figsize=(18,5))
for i,epsilon in enumerate(EPSILON):y0 = 1+epsilonyy = [sol_exacte(t,y0) for t in tt]uu_RK4 = RK4(phi,tt)uu_EE = EE(phi,tt)subplot(1,3,i+1)plot(tt,yy,'b-',tt,uu_RK4,'y:D',tt,uu_EE,'m:o')legend(['Exacte','RK4','EE']);title("$\epsilon=$"+str(epsilon))
1.4 Exercice : Étude théorique et numérique du mouvement d’un pendule
Considérons le problème du mouvement d’un pendule de masse m suspendu au point O par un filnon pesant de longueur ℓ.On se propose d’étudier l’évolution au cours du temps t ≥ 0 de l’angle ϑ(t) autour du point 0.L’angle ϑ(t) est mesuré par rapport à une verticale passante par 0.Considérons pour simplifier seulement la force de gravité g.
La fonction ϑ est alors solution de l’EDO d’ordre 2
ϑ′′(t) = −g
ℓsin(ϑ(t)).
Si on introduit le paramètre ω tel que ω2 =g
ℓ, l’équation devient
ϑ′′(t) + ω2 sin(ϑ(t)) = 0.
7
Pour simplicité on pose ω = 1 et on note q = ϑ et p = ϑ′. On peut alors transformer l’EDO d’ordre2 en un système de deux EDO d’ordre 1:{
q′(t) = p(t),
p′(t) = − sin(q(t)).
Considérons l’énergie totale du système:
E(q, p) = − cos(q)︸ ︷︷ ︸Énergie potentielle
+1
2p2︸︷︷︸
Énergie cinétique
.
1. Étude théorique
• Montre analytiquement que l’énergie totale reste constante au cours du temps, i.e. queddtE(q(t), p(t)) = 0.
• Tracer avec Python les courbes de niveau de la fonction (q, p) 7→ E(q, p), i.e. les ensem-bles
Nκ = {(q, p) | E(q, p) = κ} = {(q, p) | p2 = 2(κ+ cos(q))}.
pour (q, p) ∈ [−π;π]× R.• Lorsque ϑ est petit on peut considérer l’approximation sin(ϑ) ≃ ϑ. Calculer la solution
exacte de cette équation approchée.
2. Étude numériqueDans une simulation numérique on aimerait que la propriété de conservation de l’énergie soitpréservée aussi bien que possible. Nous allons regarder ce qui se passe avec certaines méthodesvues en cours.
On notera xn ≈ q(tn) = ϑ(tn) et yn ≈ p(tn) = ϑ′(tn).À chaque instant tn, on calculera les valeurs approchées de l’énergie cinétique Ec(tn) =
12y
2n,
de l’énergie potentielle Ep(tn) = − cos(xn) et de l’énergie totale E(tn) = Ec(tn) + Ep(tn).Choisissons h = tn+1 − tn = 0.1 et (x0, y0) = (π/4, 0).
1. Dans un premier temps on se propose d’appliquer la méthode d’Euler explicite à larésolution du système.
• Tracer (tn, xn) et (tn, yn) sur un même graphique;• sur un autre graphique représenter les trois énergies simultanément en fonction du
temps;• tracer enfin (xn, yn) sur un autre graphique et vérifier que la solution numérique
tourne vers l’extérieur (i.e. l’énergie augmente au cours du temps).2. Considérons le schéma obtenu en écrivant le schéma d’Euler explicite pour la première
équation et le schéma d’Euler implicite pour la seconde.• Montrer que ce schéma peut s’écrire sous forme parfaitement explicite;• tracer (tn, xn) et (tn, yn) sur un même graphique;• sur un autre graphique représenter les trois énergies simultanément en fonction du
temps;• tracer enfin (xn, yn) sur un autre graphique. Que peut-on constater? Commenter
les résultats.3. On se propose d’appliquer les méthodes d’Euler modifiée, de Heun, AB2, AB3 et
RK4 à la résolution du système. Pour chaque méthode:
8
• Tracer (tn, xn) et (tn, yn) sur un même graphique;• sur un autre graphique représenter les trois énergies simultanément en fonction du
temps;• tracer enfin (xn, yn) sur un autre graphique. Que peut-on constater? Commenter
les résultats.
1.4.1 Correction étude théorique
Il s’agit d’un système de deux EDO scalaires d’ordre 1 du type{q′(t) = φ1(t, q(t), p(t)),
p′(t) = φ2(t, q(t), p(t)),avec
{φ1(t, q(t), p(t)) = p(t),
φ2(t, q(t), p(t)) = − sin(q(t)).
• L’énergie totale reste constante au cours du temps:
ddtE(q(t), p(t)) = sin(q(t))q′(t) + p(t)p′(t) = sin(q(t))p(t) + p(t)p′(t)
= p(t)(sin(q(t)) + p′(t)
)= p(t) (sin(q(t))− sin(q(t))) = 0.
• Courbes de niveau de la fonction (q, p) 7→ E(q, p):
[7]: from matplotlib.pylab import *
Etot = lambda q,p : -cos(q)+p**2/2
q,p = meshgrid(linspace(-8*pi,8*pi,201),linspace(-3,3,201))E = Etot(q,p)
figure(1,figsize=(20,5))graphe=contour(q,p,E,20)clabel(graphe,inline=1);
• ϑ′′(t) + ω2ϑ(t) = 0 est une EDO d’ordre 2 homogène à coefficients constants dont la solutionest ϑ(t) = ϑ(0) cos(ωt) + ϑ′(0)
ω sin(ωt).
9
1.4.2 Correction étude numérique
[8]: t0 = 0tfinal = 8*piy0 = [pi/4,0]
N = 100tt = linspace(t0,tfinal,N+1)h = tt[1]-tt[0]
phi1 = lambda t,q,p : pphi2 = lambda t,q,p : -sin(q)
Méthode d’Euler explicite x0 = q(0),
y0 = p(0),
xn+1 = xn + hφ1(tn, xn, yn),
yn+1 = yn + hφ2(tn, xn, yn).
[9]: def euler_progressif(phi1,phi2,tt):q = [y0[0]]p = [y0[1]]for i in range(len(tt)-1):
q.append(q[i]+h*phi1(tt[i],q[i],p[i]))p.append(p[i]+h*phi2(tt[i],q[i],p[i]))
return [q,p][q_ep, p_ep] = euler_progressif(phi1,phi2,tt)Ec_ep = [p**2/2 for p in p_ep]Ep_ep = [-math.cos(q) for q in q_ep]Et_ep = [Ec_ep[i]+Ep_ep[i] for i in range(len(Ec_ep))]print ('Euler explicite : |energie totale (t=Tfinal) - Energie totale (t=0)|=',␣↪→abs(Et_ep[-1]-Et_ep[0]))
figure(figsize=(18,5))subplot(131)plot(tt,q_ep,tt,p_ep)xlabel('t')legend(['x(t)','y(t)'])title('Euler progressif - x(t) et y(t)')subplot(132)plot(q_ep,p_ep)xlabel('x(t)')ylabel('y(t)')title('Euler progressif')
10
subplot(133)plot(tt,Ec_ep,tt,Ep_ep,tt,Et_ep)xlabel('t')legend(['Cinetique','Potentielle','Totale'])title('Euler progressif - Energies');
Euler explicite : |energie totale (t=Tfinal) - Energie totale (t=0)|=3.17649436243
Méthode d’Euler explicite/implicite Schéma obtenu en écrivant le schéma d’Euler explicitepour la première équation et le schéma d’Euler implicite pour la seconde:
x0 = q(0),
y0 = p(0),
xn+1 = xn + hφ1(tn, xn, yn),
yn+1 = yn + hφ2(tn+1, xn+1, yn+1).
Dans notre cas φ2(tn+1, xn+1, yn+1) = − sin(xn+1) donc le schéma est parfaitement explicite:
[10]: def euler_symplectique(phi1,phi2,tt):q = [y0[0]]p = [y0[1]]for i in range(len(tt)-1):
q.append(q[i]+h*phi1(tt[i],q[i],p[i]))p.append(p[i]+h*phi2(tt[i+1],q[i+1],p[i])) # il faudrait p[i+1]␣
↪→(schema implicite) mais comme dans notre cas phi2 ne depend pas de "p", le␣↪→schema est explicite
return [q,p][q_es, p_es] = euler_symplectique(phi1,phi2,tt)Ec_es = [p**2/2 for p in p_es]Ep_es = [-math.cos(q) for q in q_es]Et_es = [Ec_es[i]+Ep_es[i] for i in range(len(Ec_es))]
11
print ('Euler symplectique : |energie totale (t=Tfinal)-Energie totale␣↪→(t=0)|=', abs(Et_es[-1]-Et_es[0]))
figure(figsize=(18,5))subplot(131)plot(tt,q_es,tt,p_es)xlabel('t')legend(['x(t)','y(t)'])title('Euler symplectique - x(t) et y(t)')subplot(132)plot(q_es,p_es)xlabel('x(t)')ylabel('y(t)')title('Euler symplectique - y(x)')subplot(133)plot(tt,Ec_es,tt,Ep_es,tt,Et_es)xlabel('t')legend(['Cinetique','Potentielle','Totale'])title('Euler symplectique - Energies');
Euler symplectique : |energie totale (t=Tfinal)-Energie totale (t=0)|=0.0300488430246
Méthodes d’Euler modifiée
x0 = q(0),
y0 = p(0),
xn = xn + h2φ1(tn, xn, yn),
yn = yn + h2φ2(tn, xn, yn),
xn+1 = xn + hφ1(tn, xn, yn),
yn+1 = yn + hφ2(tn, xn, yn).
12
[11]: def euler_modifie(phi1,phi2,tt):q = [y0[0]]p = [y0[1]]for i in range(len(tt)-1):
qtilde = phi1( tt[i], q[i], p[i] )ptilde = phi2( tt[i], q[i], p[i] )q.append( q[i]+h*phi1(tt[i]+h/2.,q[i]+qtilde*h/2.,p[i]+ptilde*h/
↪→2.) )p.append( p[i]+h*phi2(tt[i]+h/2.,q[i]+qtilde*h/2.,p[i]+ptilde*h/
↪→2.) )return [q,p]
[q_em, p_em] = euler_modifie(phi1,phi2,tt)Ec_em = [p**2/2 for p in p_em]Ep_em = [-math.cos(q) for q in q_em]Et_em = [Ec_em[i]+Ep_em[i] for i in range(len(Ec_em))]print ('Euler modifie : |energie totale (t=Tfinal)-Energie totale (t=0)|=',␣↪→abs(Et_em[-1]-Et_em[0]))
figure(figsize=(18,5))subplot(131)plot(tt,q_em,tt,p_em)xlabel('t')legend(['x(t)','y(t)'])title('Euler modifie - x(t) et y(t)')subplot(132)plot(q_em,p_em)xlabel('x(t)')ylabel('y(t)')title('Euler modifie - y(x)')subplot(133)plot(tt,Ec_em,tt,Ep_em,tt,Et_em)xlabel('t')legend(['Cinetique','Potentielle','Totale'])title('Euler modifie - Energies');
Euler modifie : |energie totale (t=Tfinal)-Energie totale (t=0)|=0.0245760973519
13
Méthodes de Heun
x0 = q(0),
y0 = p(0),
xn = xn + hφ1(tn, xn, yn),
yn = yn + hφ2(tn, xn, yn),
xn+1 = xn + h2 (φ1(tn, xn, yn) + φ1(tn+1, xn, yn)) ,
yn+1 = yn + h2 (φ2(tn, xn, yn) + φ2(tn+1, xn, yn)) .
[12]: def heun(phi1,phi2,tt):q = [y0[0]]p = [y0[1]]for i in range(len(tt)-1):
qtilde = phi1( tt[i], q[i], p[i] )ptilde = phi2( tt[i], q[i], p[i] )q.append( q[i]+h*0.5*( phi1(tt[i],q[i],p[i]) +␣
↪→phi1(tt[i+1],q[i]+h*qtilde,p[i]+h*ptilde) ) )p.append( p[i]+h*0.5*( phi2(tt[i],q[i],p[i]) +␣
↪→phi2(tt[i+1],q[i]+h*qtilde,p[i]+h*ptilde) ) )return [q,p]
[q_heun, p_heun] = heun(phi1,phi2,tt)Ec_heun = [p**2/2 for p in p_heun]Ep_heun = [-math.cos(q) for q in q_heun]Et_heun = [Ec_heun[i]+Ep_heun[i] for i in range(len(Ec_heun))]print ('Heun : |energie totale (t=Tfinal)-Energie totale (t=0)|=',␣↪→abs(Et_heun[-1]-Et_heun[0]))
figure(figsize=(18,5))subplot(131)plot(tt,q_heun,tt,p_heun)xlabel('t')
14
legend(['x(t)','y(t)'])title('Heun - x(t) et y(t)')subplot(132)plot(q_heun,p_heun)xlabel('x(t)')ylabel('y(t)')title('Heun - y(x)')subplot(133)plot(tt,Ec_heun,tt,Ep_heun,tt,Et_heun)xlabel('t')legend(['Cinetique','Potentielle','Totale'])title('Heun - Energies');
Heun : |energie totale (t=Tfinal)-Energie totale (t=0)|= 0.0254327512565
Méthode AB2
x0 = q(0),
y0 = p(0),
x1 = x0 + hφ1(t0, x0, y0),
y1 = y0 + hφ2(t0, x0, y0),
xn+1 = xn + h2 (3φ1(tn, xn, yn)− φ1(tn−1, xn−1, yn−1)) ,
yn+1 = yn + h2 (3φ2(tn, xn, yn)− φ2(tn−1, xn−1, yn−1)) .
[13]: def AB2(phi1,phi2,tt):q = [y0[0]]p = [y0[1]]q.append(q[0]+h*phi1(tt[0],q[0],p[0]))p.append(p[0]+h*phi2(tt[0],q[0],p[0]))for i in range(1,len(tt)-1):
qtilde1 = phi1( tt[i],q[i],p[i] )qtilde2 = phi1( tt[i-1],q[i-1],p[i-1] )
15
ptilde1 = phi2( tt[i],q[i],p[i] )ptilde2 = phi2( tt[i-1],q[i-1],p[i-1] )q.append( q[i] + (3*qtilde1-qtilde2)*h/2 )p.append( p[i] + (3*ptilde1-ptilde2)*h/2 )
return [q,p][q_AB2, p_AB2] = AB2(phi1,phi2,tt)Ec_AB2 = [p**2/2. for p in p_AB2]Ep_AB2 = [-math.cos(q) for q in q_AB2]Et_AB2 = [Ec_AB2[i]+Ep_AB2[i] for i in range(len(Ec_AB2))]print ('AB2 : |energie totale (t=Tfinal)-Energie totale (t=0)|=',␣↪→abs(Et_AB2[-1]-Et_AB2[0]))
figure(figsize=(18,5))subplot(131)plot(tt,q_AB2,tt,p_AB2)xlabel('t')legend(['x(t)','y(t)'])title('AB2 - x(t) et y(t)')subplot(132)plot(q_AB2,p_AB2)xlabel('x(t)')ylabel('y(t)')title('AB2 - y(x)')subplot(133)plot(tt,Ec_AB2,tt,Ep_AB2,tt,Et_AB2)xlabel('t')legend(['Cinetique','Potentielle','Totale'])title('AB2 - Energies');
AB2 : |energie totale (t=Tfinal)-Energie totale (t=0)|= 0.0796092468199
16
Méthode AB3
x0 = q(0),
y0 = p(0),
x1 = x0 + hφ1(t0, x0, y0),
y1 = y0 + hφ2(t0, x0, y0),
x2 = x1 +h2 (3φ1(t1, x1, y1)− φ1(t0, x0, y0)) ,
y2 = y1 +h2 (3φ2(t1, x1, y1)− φ2(t0, x0, y0)) ,
xn+1 = xn + h12 (23φ1(tn, xn, yn)− 16φ1(tn−1, xn−1, yn−1) + 5φ1(tn−2, xn−2, yn−2)) ,
yn+1 = yn + h12 (23φ2(tn, xn, yn)− 16φ2(tn−1, xn−1, yn−1) + 5φ2(tn−2, xn−2, yn−2)) .
[14]: def AB3(phi1,phi2,tt):q = [y0[0]]p = [y0[1]]q.append(q[0]+h*phi1(tt[0],q[0],p[0]))p.append(p[0]+h*phi2(tt[0],q[0],p[0]))q.append(q[1]+h*(3*phi1(tt[1],q[1],p[1])-phi1(tt[0],q[0],p[0]))/2. )p.append(p[1]+h*(3*phi2(tt[1],q[1],p[1])-phi2(tt[0],q[0],p[0]))/2.)for i in range(2,len(tt)-1):
qtilde1 = phi1( tt[i],q[i],p[i] )qtilde2 = phi1( tt[i-1],q[i-1],p[i-1] )qtilde3 = phi1( tt[i-2],q[i-2],p[i-2] )ptilde1 = phi2( tt[i],q[i],p[i] )ptilde2 = phi2( tt[i-1],q[i-1],p[i-1] )ptilde3 = phi2( tt[i-2],q[i-2],p[i-2] )q.append( q[i] + (23*qtilde1-16*qtilde2+5*qtilde3)*h/12 )p.append( p[i] + (23*ptilde1-16*ptilde2+5*ptilde3)*h/12 )
return [q,p][q_AB3, p_AB3] = AB3(phi1,phi2,tt)Ec_AB3 = [p**2/2. for p in p_AB3]Ep_AB3 = [-math.cos(q) for q in q_AB3]Et_AB3 = [Ec_AB3[i]+Ep_AB3[i] for i in range(len(Ec_AB3))]print( 'AB3 : |energie totale (t=Tfinal)-Energie totale (t=0)|=',␣↪→abs(Et_AB3[-1]-Et_AB3[0]))
figure(figsize=(18,5))subplot(131)plot(tt,q_AB3,tt,p_AB3)xlabel('t')legend(['x(t)','y(t)'])title('AB3 - x(t) et y(t)')subplot(132)plot(q_AB3,p_AB3)xlabel('x(t)')ylabel('y(t)')
17
title('AB3 - y(x)')subplot(133)plot(tt,Ec_AB3,tt,Ep_AB3,tt,Et_AB3)xlabel('t')legend(['Cinetique','Potentielle','Totale'])title('AB3 - Energies');
AB3 : |energie totale (t=Tfinal)-Energie totale (t=0)|= 0.0511199201408
Méthode RK4
x0 = q(0),
y0 = p(0),
xn = xn + h2φ1(tn, xn, yn),
yn = yn + h2φ2(tn, xn, yn),
xn = xn + h2φ1(tn + h/2, xn, yn),
yn = yn + h2φ2(tn + h/2, xn, yn),
xn = xn + hφ1(tn+1, xn, yn),
yn = yn + hφ2(tn+1, xn, yn),
xn+1 = xn + h6 (φ1(tn, xn, yn) + 2φ1(tn + h/2, xn, yn) + 2φ1(tn + h/2, xn, yn) + φ1(tn+1, xn, yn)) ,
yn+1 = yn + h6 (φ2(tn, xn, yn) + 2φ2(tn + h/2, xn, yn) + 2φ2(tn + h/2, xn, yn) + φ2(tn+1, xn, yn)) .
[15]: def RK4(phi1,phi2,tt):q = [y0[0]]p = [y0[1]]for i in range(len(tt)-1):
qtilde = q[i] + 0.5*h * phi1( tt[i], q[i], p[i] )ptilde = p[i] + 0.5*h * phi2( tt[i], q[i], p[i] )qv = q[i] + 0.5*h * phi1( tt[i]+h*0.5, qtilde, ptilde )pv = p[i] + 0.5*h * phi2( tt[i]+h*0.5, qtilde, ptilde )
18
qhat = q[i] + h * phi1( tt[i+1], qv, pv )phat = p[i] + h * phi2( tt[i+1], qv, pv )q.append( q[i]+h/6*( phi1(tt[i],q[i],p[i]) + 2*phi1(tt[i]+0.
↪→5*h,qtilde,ptilde)+ 2*phi1(tt[i]+0.5*h,qv,pv)+ phi1(tt[i+1],qhat,phat) ) )p.append( p[i]+h/6*( phi2(tt[i],q[i],p[i]) + 2*phi2(tt[i]+0.
↪→5*h,qtilde,ptilde)+ 2*phi2(tt[i]+0.5*h,qv,pv)+ phi2(tt[i+1],qhat,phat) ) )return [q,p]
[q_RK4, p_RK4] = RK4(phi1,phi2,tt)Ec_RK4 = [p**2/2. for p in p_RK4]Ep_RK4 = [-math.cos(q) for q in q_RK4]Et_RK4 = [Ec_RK4[i]+Ep_RK4[i] for i in range(len(Ec_RK4))]print ('RK4 : |energie totale (t=Tfinal)-Energie totale (t=0)|=',␣↪→abs(Et_RK4[-1]-Et_RK4[0]))
figure(figsize=(18,5))subplot(131)plot(tt,q_RK4,tt,p_RK4)xlabel('t')legend(['x(t)','y(t)'])title('RK4 - x(t) et y(t)')subplot(132)plot(q_RK4,p_RK4)xlabel('x(t)')ylabel('y(t)')title('RK4 - y(x)')subplot(133)plot(tt,Ec_RK4,tt,Ep_RK4,tt,Et_RK4)xlabel('t')legend(['Cinetique','Potentielle','Totale'])title('RK4 - Energies');
RK4 : |energie totale (t=Tfinal)-Energie totale (t=0)|= 8.32124615898e-05
[ ]:
19