m62-td1 - univ-tln.frfaccanoni.univ-tln.fr/user/enseignements/20192020/full-td.pdf · on modélise...

71
M62-TD1 March 16, 2020 [1]: from IPython.core.display import HTML css_file = './custom.css' HTML(open(css_file, "r").read()) [1]: <IPython.core.display.HTML object> [2]: import sys #only needed to determine Python version number print('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 le nombre de nouveaux nés par individu en une unité de temps et la fraction d’individus qui meurent en une unité de temps. On s’intéresse à l’unique solution de cette équation vérifiant y(t 0 )= y 0 y 0 et t 0 sont des réels donnés. 1. Donner l’unique solution théorique à ce problème de Cauchy. Calculer lim t+y(t) en fonction du paramètre a. 1. Calculer analytiquement la solution obtenue avec la méthode d’Euler explicite sur l’intervalle [0; 2] avec N h =5, ensuite la tracer avec Python et la comparer à la solution exacte. 1. Soit u N h (2) l’approximation de y(2) obtenue avec la méth- ode d’Euler explicite et N h nœuds. Calculer u N h (2) avec N h =2 i et montrer analytiquement que lim N h +u N h (2) = y(2). 1. Tracer le graphe de max 0nN h |y(t n ) - u n | en fonction de N h ainsi que le graphe des courbes 1/N h , 1/N 2 h ... avec une progression logarithmique en abscisse et en ordonnées. On prendra par exemple N h = 200, puis N h = 300, 400, ... 2000. Correction 1

Upload: others

Post on 28-Jul-2020

1 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: M62-TD1 - univ-tln.frfaccanoni.univ-tln.fr/user/enseignements/20192020/Full-TD.pdf · On modélise la croissance d’une population d’effectify(t) 0 par l’équation différentielle

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

Page 2: M62-TD1 - univ-tln.frfaccanoni.univ-tln.fr/user/enseignements/20192020/Full-TD.pdf · On modélise la croissance d’une population d’effectify(t) 0 par l’équation différentielle

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

Page 3: M62-TD1 - univ-tln.frfaccanoni.univ-tln.fr/user/enseignements/20192020/Full-TD.pdf · On modélise la croissance d’une population d’effectify(t) 0 par l’équation différentielle

# 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

Page 4: M62-TD1 - univ-tln.frfaccanoni.univ-tln.fr/user/enseignements/20192020/Full-TD.pdf · On modélise la croissance d’une population d’effectify(t) 0 par l’équation différentielle

[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

Page 5: M62-TD1 - univ-tln.frfaccanoni.univ-tln.fr/user/enseignements/20192020/Full-TD.pdf · On modélise la croissance d’une population d’effectify(t) 0 par l’équation différentielle

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

Page 6: M62-TD1 - univ-tln.frfaccanoni.univ-tln.fr/user/enseignements/20192020/Full-TD.pdf · On modélise la croissance d’une population d’effectify(t) 0 par l’équation différentielle

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

Page 7: M62-TD1 - univ-tln.frfaccanoni.univ-tln.fr/user/enseignements/20192020/Full-TD.pdf · On modélise la croissance d’une population d’effectify(t) 0 par l’équation différentielle

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

Page 8: M62-TD1 - univ-tln.frfaccanoni.univ-tln.fr/user/enseignements/20192020/Full-TD.pdf · On modélise la croissance d’une population d’effectify(t) 0 par l’équation différentielle

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

Page 9: M62-TD1 - univ-tln.frfaccanoni.univ-tln.fr/user/enseignements/20192020/Full-TD.pdf · On modélise la croissance d’une population d’effectify(t) 0 par l’équation différentielle

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

Page 10: M62-TD1 - univ-tln.frfaccanoni.univ-tln.fr/user/enseignements/20192020/Full-TD.pdf · On modélise la croissance d’une population d’effectify(t) 0 par l’équation différentielle

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

Page 11: M62-TD1 - univ-tln.frfaccanoni.univ-tln.fr/user/enseignements/20192020/Full-TD.pdf · On modélise la croissance d’une population d’effectify(t) 0 par l’équation différentielle

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

Page 12: M62-TD1 - univ-tln.frfaccanoni.univ-tln.fr/user/enseignements/20192020/Full-TD.pdf · On modélise la croissance d’une population d’effectify(t) 0 par l’équation différentielle

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

Page 13: M62-TD1 - univ-tln.frfaccanoni.univ-tln.fr/user/enseignements/20192020/Full-TD.pdf · On modélise la croissance d’une population d’effectify(t) 0 par l’équation différentielle

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

Page 14: M62-TD1 - univ-tln.frfaccanoni.univ-tln.fr/user/enseignements/20192020/Full-TD.pdf · On modélise la croissance d’une population d’effectify(t) 0 par l’équation différentielle

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

Page 15: M62-TD1 - univ-tln.frfaccanoni.univ-tln.fr/user/enseignements/20192020/Full-TD.pdf · On modélise la croissance d’une population d’effectify(t) 0 par l’équation différentielle

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

Page 16: M62-TD1 - univ-tln.frfaccanoni.univ-tln.fr/user/enseignements/20192020/Full-TD.pdf · On modélise la croissance d’une population d’effectify(t) 0 par l’équation différentielle

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

Page 17: M62-TD1 - univ-tln.frfaccanoni.univ-tln.fr/user/enseignements/20192020/Full-TD.pdf · On modélise la croissance d’une population d’effectify(t) 0 par l’équation différentielle

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

Page 18: M62-TD1 - univ-tln.frfaccanoni.univ-tln.fr/user/enseignements/20192020/Full-TD.pdf · On modélise la croissance d’une population d’effectify(t) 0 par l’équation différentielle

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

Page 19: M62-TD1 - univ-tln.frfaccanoni.univ-tln.fr/user/enseignements/20192020/Full-TD.pdf · On modélise la croissance d’une population d’effectify(t) 0 par l’équation différentielle

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

Page 20: M62-TD1 - univ-tln.frfaccanoni.univ-tln.fr/user/enseignements/20192020/Full-TD.pdf · On modélise la croissance d’une population d’effectify(t) 0 par l’équation différentielle

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

Page 21: M62-TD1 - univ-tln.frfaccanoni.univ-tln.fr/user/enseignements/20192020/Full-TD.pdf · On modélise la croissance d’une population d’effectify(t) 0 par l’équation différentielle

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

Page 22: M62-TD1 - univ-tln.frfaccanoni.univ-tln.fr/user/enseignements/20192020/Full-TD.pdf · On modélise la croissance d’une population d’effectify(t) 0 par l’équation différentielle

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

Page 23: M62-TD1 - univ-tln.frfaccanoni.univ-tln.fr/user/enseignements/20192020/Full-TD.pdf · On modélise la croissance d’une population d’effectify(t) 0 par l’équation différentielle

[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

Page 24: M62-TD1 - univ-tln.frfaccanoni.univ-tln.fr/user/enseignements/20192020/Full-TD.pdf · On modélise la croissance d’une population d’effectify(t) 0 par l’équation différentielle

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

Page 25: M62-TD1 - univ-tln.frfaccanoni.univ-tln.fr/user/enseignements/20192020/Full-TD.pdf · On modélise la croissance d’une population d’effectify(t) 0 par l’équation différentielle

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

Page 26: M62-TD1 - univ-tln.frfaccanoni.univ-tln.fr/user/enseignements/20192020/Full-TD.pdf · On modélise la croissance d’une population d’effectify(t) 0 par l’équation différentielle

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

Page 27: M62-TD1 - univ-tln.frfaccanoni.univ-tln.fr/user/enseignements/20192020/Full-TD.pdf · On modélise la croissance d’une population d’effectify(t) 0 par l’équation différentielle

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

Page 28: M62-TD1 - univ-tln.frfaccanoni.univ-tln.fr/user/enseignements/20192020/Full-TD.pdf · On modélise la croissance d’une population d’effectify(t) 0 par l’équation différentielle

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

Page 29: M62-TD1 - univ-tln.frfaccanoni.univ-tln.fr/user/enseignements/20192020/Full-TD.pdf · On modélise la croissance d’une population d’effectify(t) 0 par l’équation différentielle

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

Page 30: M62-TD1 - univ-tln.frfaccanoni.univ-tln.fr/user/enseignements/20192020/Full-TD.pdf · On modélise la croissance d’une population d’effectify(t) 0 par l’équation différentielle

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

Page 31: M62-TD1 - univ-tln.frfaccanoni.univ-tln.fr/user/enseignements/20192020/Full-TD.pdf · On modélise la croissance d’une population d’effectify(t) 0 par l’équation différentielle

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

Page 32: M62-TD1 - univ-tln.frfaccanoni.univ-tln.fr/user/enseignements/20192020/Full-TD.pdf · On modélise la croissance d’une population d’effectify(t) 0 par l’équation différentielle

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

Page 33: M62-TD1 - univ-tln.frfaccanoni.univ-tln.fr/user/enseignements/20192020/Full-TD.pdf · On modélise la croissance d’une population d’effectify(t) 0 par l’équation différentielle

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

Page 34: M62-TD1 - univ-tln.frfaccanoni.univ-tln.fr/user/enseignements/20192020/Full-TD.pdf · On modélise la croissance d’une population d’effectify(t) 0 par l’équation différentielle

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

Page 35: M62-TD1 - univ-tln.frfaccanoni.univ-tln.fr/user/enseignements/20192020/Full-TD.pdf · On modélise la croissance d’une population d’effectify(t) 0 par l’équation différentielle

{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

Page 36: M62-TD1 - univ-tln.frfaccanoni.univ-tln.fr/user/enseignements/20192020/Full-TD.pdf · On modélise la croissance d’une population d’effectify(t) 0 par l’équation différentielle

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

Page 37: M62-TD1 - univ-tln.frfaccanoni.univ-tln.fr/user/enseignements/20192020/Full-TD.pdf · On modélise la croissance d’une population d’effectify(t) 0 par l’équation différentielle

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

Page 38: M62-TD1 - univ-tln.frfaccanoni.univ-tln.fr/user/enseignements/20192020/Full-TD.pdf · On modélise la croissance d’une population d’effectify(t) 0 par l’équation différentielle

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

Page 39: M62-TD1 - univ-tln.frfaccanoni.univ-tln.fr/user/enseignements/20192020/Full-TD.pdf · On modélise la croissance d’une population d’effectify(t) 0 par l’équation différentielle

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

Page 40: M62-TD1 - univ-tln.frfaccanoni.univ-tln.fr/user/enseignements/20192020/Full-TD.pdf · On modélise la croissance d’une population d’effectify(t) 0 par l’équation différentielle

# 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

Page 41: M62-TD1 - univ-tln.frfaccanoni.univ-tln.fr/user/enseignements/20192020/Full-TD.pdf · On modélise la croissance d’une population d’effectify(t) 0 par l’équation différentielle

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

Page 42: M62-TD1 - univ-tln.frfaccanoni.univ-tln.fr/user/enseignements/20192020/Full-TD.pdf · On modélise la croissance d’une population d’effectify(t) 0 par l’équation différentielle

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

Page 43: M62-TD1 - univ-tln.frfaccanoni.univ-tln.fr/user/enseignements/20192020/Full-TD.pdf · On modélise la croissance d’une population d’effectify(t) 0 par l’équation différentielle

[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

Page 44: M62-TD1 - univ-tln.frfaccanoni.univ-tln.fr/user/enseignements/20192020/Full-TD.pdf · On modélise la croissance d’une population d’effectify(t) 0 par l’équation différentielle

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

Page 45: M62-TD1 - univ-tln.frfaccanoni.univ-tln.fr/user/enseignements/20192020/Full-TD.pdf · On modélise la croissance d’une population d’effectify(t) 0 par l’équation différentielle

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

Page 46: M62-TD1 - univ-tln.frfaccanoni.univ-tln.fr/user/enseignements/20192020/Full-TD.pdf · On modélise la croissance d’une population d’effectify(t) 0 par l’équation différentielle

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

Page 47: M62-TD1 - univ-tln.frfaccanoni.univ-tln.fr/user/enseignements/20192020/Full-TD.pdf · On modélise la croissance d’une population d’effectify(t) 0 par l’équation différentielle

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

Page 48: M62-TD1 - univ-tln.frfaccanoni.univ-tln.fr/user/enseignements/20192020/Full-TD.pdf · On modélise la croissance d’une population d’effectify(t) 0 par l’équation différentielle

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

Page 49: M62-TD1 - univ-tln.frfaccanoni.univ-tln.fr/user/enseignements/20192020/Full-TD.pdf · On modélise la croissance d’une population d’effectify(t) 0 par l’équation différentielle

[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

Page 50: M62-TD1 - univ-tln.frfaccanoni.univ-tln.fr/user/enseignements/20192020/Full-TD.pdf · On modélise la croissance d’une population d’effectify(t) 0 par l’équation différentielle

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

Page 51: M62-TD1 - univ-tln.frfaccanoni.univ-tln.fr/user/enseignements/20192020/Full-TD.pdf · On modélise la croissance d’une population d’effectify(t) 0 par l’équation différentielle

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

Page 52: M62-TD1 - univ-tln.frfaccanoni.univ-tln.fr/user/enseignements/20192020/Full-TD.pdf · On modélise la croissance d’une population d’effectify(t) 0 par l’équation différentielle

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

Page 53: M62-TD1 - univ-tln.frfaccanoni.univ-tln.fr/user/enseignements/20192020/Full-TD.pdf · On modélise la croissance d’une population d’effectify(t) 0 par l’équation différentielle

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

Page 54: M62-TD1 - univ-tln.frfaccanoni.univ-tln.fr/user/enseignements/20192020/Full-TD.pdf · On modélise la croissance d’une population d’effectify(t) 0 par l’équation différentielle

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

Page 55: M62-TD1 - univ-tln.frfaccanoni.univ-tln.fr/user/enseignements/20192020/Full-TD.pdf · On modélise la croissance d’une population d’effectify(t) 0 par l’équation différentielle

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

Page 56: M62-TD1 - univ-tln.frfaccanoni.univ-tln.fr/user/enseignements/20192020/Full-TD.pdf · On modélise la croissance d’une population d’effectify(t) 0 par l’équation différentielle

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

Page 57: M62-TD1 - univ-tln.frfaccanoni.univ-tln.fr/user/enseignements/20192020/Full-TD.pdf · On modélise la croissance d’une population d’effectify(t) 0 par l’équation différentielle

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

Page 58: M62-TD1 - univ-tln.frfaccanoni.univ-tln.fr/user/enseignements/20192020/Full-TD.pdf · On modélise la croissance d’une population d’effectify(t) 0 par l’équation différentielle

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

Page 59: M62-TD1 - univ-tln.frfaccanoni.univ-tln.fr/user/enseignements/20192020/Full-TD.pdf · On modélise la croissance d’une population d’effectify(t) 0 par l’équation différentielle

# 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

Page 60: M62-TD1 - univ-tln.frfaccanoni.univ-tln.fr/user/enseignements/20192020/Full-TD.pdf · On modélise la croissance d’une population d’effectify(t) 0 par l’équation différentielle

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

Page 61: M62-TD1 - univ-tln.frfaccanoni.univ-tln.fr/user/enseignements/20192020/Full-TD.pdf · On modélise la croissance d’une population d’effectify(t) 0 par l’équation différentielle

• 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

Page 62: M62-TD1 - univ-tln.frfaccanoni.univ-tln.fr/user/enseignements/20192020/Full-TD.pdf · On modélise la croissance d’une population d’effectify(t) 0 par l’équation différentielle

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

Page 63: M62-TD1 - univ-tln.frfaccanoni.univ-tln.fr/user/enseignements/20192020/Full-TD.pdf · On modélise la croissance d’une population d’effectify(t) 0 par l’équation différentielle

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

Page 64: M62-TD1 - univ-tln.frfaccanoni.univ-tln.fr/user/enseignements/20192020/Full-TD.pdf · On modélise la croissance d’une population d’effectify(t) 0 par l’équation différentielle

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

Page 65: M62-TD1 - univ-tln.frfaccanoni.univ-tln.fr/user/enseignements/20192020/Full-TD.pdf · On modélise la croissance d’une population d’effectify(t) 0 par l’équation différentielle

[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

Page 66: M62-TD1 - univ-tln.frfaccanoni.univ-tln.fr/user/enseignements/20192020/Full-TD.pdf · On modélise la croissance d’une population d’effectify(t) 0 par l’équation différentielle

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

Page 67: M62-TD1 - univ-tln.frfaccanoni.univ-tln.fr/user/enseignements/20192020/Full-TD.pdf · On modélise la croissance d’une population d’effectify(t) 0 par l’équation différentielle

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

Page 68: M62-TD1 - univ-tln.frfaccanoni.univ-tln.fr/user/enseignements/20192020/Full-TD.pdf · On modélise la croissance d’une population d’effectify(t) 0 par l’équation différentielle

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

Page 69: M62-TD1 - univ-tln.frfaccanoni.univ-tln.fr/user/enseignements/20192020/Full-TD.pdf · On modélise la croissance d’une population d’effectify(t) 0 par l’équation différentielle

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

Page 70: M62-TD1 - univ-tln.frfaccanoni.univ-tln.fr/user/enseignements/20192020/Full-TD.pdf · On modélise la croissance d’une population d’effectify(t) 0 par l’équation différentielle

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

Page 71: M62-TD1 - univ-tln.frfaccanoni.univ-tln.fr/user/enseignements/20192020/Full-TD.pdf · On modélise la croissance d’une population d’effectify(t) 0 par l’équation différentielle

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