In [1]: from IPython.display import display, Latex from IPython.core.display import HTML css_file = './custom.css'
HTML(open(css_file, "r").read())
In [2]: from math import *
M62_CM8 : Schémas à un pas de type Runge-Kutta
Out[1]:
Table of Contents
1 Schémas de Runge-Kutta 1.1 Matrice de Butcher 1.2 Ordre de convergence 1.3 A-stabilité
2 Exercice : schémas RK à un étage
2.1 Correction : écriture d'un schéma RK à un étage quelconque
2.2 Correction : étude de l'ordre d'un schéma RK à un étage quelconque 2.3 Correction : écriture d'un schéma RK à un étage explicite
2.4 Correction : étude de l'ordre d'un schéma RK à un étage explicite 2.5 Correction : étude de la A-stabilité
3 Exercice : schémas RK à deux étages
3.1 Correction : écriture d'un schéma RK à deux étages quelconque 3.2 Correction : écriture d'un schéma RK à deux étages semi-implicite 3.3 Correction : écriture d'un schéma RK à deux étages explicite
3.4 Correction : étude de l'ordre d'un schéma RK à deux étages explicite 3.5 Correction : étude de la A-stabilité des schémas explicites
4 Exemples à 3 étages explicites
5 Exemples à 4 étages explicites
6 Exemple à 5 étages explicite
Schémas de Runge-Kutta
Les schémas de Runge-Kutta sont des méthodes à un pas qui approchent l'intégrale par une formule de quadrature en des points donnés toujours à l'intérieur de l'intervalle :
Le problème est que, si n'est pas un point de la discrétisation, l'on ne connait pas . L'évaluation des en les points intérieurs et alors approchée par une autre formule de quadrature:
Cela donne
φ(t, y(t))dt
∫
ttnn+1[ ; t
nt
n+1]
t
n,iφ(t, y(t))dt
∫
tn+1tn
+ h avec ∈ [0; 1]
d
=
éft
nc
ic
i≈ h ∑ φ( , y( )).
i=1 s
b
it
n,it
n,it
n,iy( t
n,i) φ( t
n,i, y( t
n,i))
φ( t
n,i, y( t
n,i)) ≈ φ ( t
n,i, y
n+ h ∑ φ( , y( ))) .
j=1 s
a
ijt
n,jt
n,j≈ + h [ φ ( , + h φ( , ))]
y
n+1y
n∑
i=1
s
b
it
n,iy
n∑
j=1
s
a
ijt
n,jy
n,jUne méthode de Runge-Kutta à étages s'écrit:
Matrice de Butcher
Les coefficients sont généralement organisés en deux vecteurs , et une matrice . Le tableau
est appelée matrice de Butcher de la méthode Runge-Kutta considérée.
Si pour (i.e. la matrice est triangulaire inférieure stricte) alors la méthode est explicite car chaque peut être explicitement calculé en fonction des coefficients déjà connus;
dans les autres cas la méthode est implicite et il faut résoudre un système non linéaire de dimension pour calculer les . L’augmentation des calculs pour les schémas implicites rend leur utilisation coûteuse; un compromis acceptable est le suivant:
si pour (i.e. la matrice est triangulaire inférieure) alors la méthode est semi-implicite, i.e. chaque est solution de l’équation non linéaire
Un schéma semi-implicite implique donc la résolution de équations non linéaires indépendantes.
Remarque: la méthode est implicite non pas parce que
dépend de lui même, mais parce qu'au moins un dépend de lui même.
s ≥ 1
⎧
⎩
⎨
⎪ ⎪
⎪ ⎪
⎪ ⎪
⎪
⎪ ⎪
⎪ ⎪
⎪ ⎪
⎪
= y( ) = , u
0t
0y
0= + h u
n+1u
n∑
i=1 s
b
iK
i= φ ( + h , + h ) K
it
nc
iu
n∑
j=1 s
a
ijK
jn = 0, 1, … N − 1 i = 1, … s.
b = ( , … , b
1b
s)
Tc = ( , … , c
1c
s)
TA = (a
ij)
1≤i,j≤sc A b
T= 0
a
ijj ≥ i A K
ii − 1 K
1, … , K
i−1s K
i= 0
a
ijj > i A K
i= φ ( + h, + h + h )
K
it
nc
iu
na
iiK
i∑
j=1 i−1
a
ijK
ju s
n+1K
iOrdre de convergence
Théorème [Ordre 1]
La méthode de Runge-Kutta est consistante (i.e. d'ordre 1) ssi ,
.
Remarque En particulier, pour une méthode explicite on aura ainsi et ainsi .
Théorème [Ordre 2, 3 et 4]
La méthode de Runge-Kutta est d'ordre si, de plus,
d'ordre si, de plus, et
d'ordre si, de plus, , , et .
Théorème
L'ordre d'une méthode RK **explicite** à étapes ne peut pas être plus grand que . De plus, il n’existe pas de méthode à étapes d’ordre si .
L'ordre d'une méthode RK **implicite** à étapes ne peut pas être plus grand que .
Remarque (le cas des systèmes) Une méthode de Runge-Kutta peut être aisément étendue aux systèmes d’équations différentielles ordinaires. Néanmoins, l’ordre d’une méthode RK dans le cas scalaire ne coı̈ncide pas nécessairement avec celui de la méthode analogue dans le cas vectoriel. En particulier, pour , une méthode d’ordre dans le cas du système autonome , avec est encore d’ordre quand on l’applique à l’équation scalaire autonome
, mais la réciproque n’est pas vraie.
= 1
∑
sj=1b
i=
c
i∑
sj=1a
ij= = 0
c
1a
1,jK
1= φ( , ) t
nu
nc
2= a
21K
2= φ( + h, t
nc
2u
n+ h c
2K
1)
≥ 2 ∑
jb
jc
j=
1≥ 3 ∑
jb
jc
2j=
231∑
i,jb
ia
ijc
j=
1≥ 4 ∑
jb
jc
j3=
41∑
i,jb
ic
ia
ijc
j=
618
∑
i,jb
ia
ijc
2j=
121∑
i,j,kb
ia
ija
jkc
k=
1 24s s
s s s ≥ 5
s 2s
p ≥ 4
p y
′(t) = φ(t, y) φ: R
m→ R
np
(t) = φ(y)
y
′A-stabilité
Rappelons la définition de schéma A-stable:
Soit un nombre réel positif et considérons le problème de Cauchy
où est une valeur donnée. Sa solution est donc
Soit un pas de temps donné, pour et notons une approximation de la solution au temps . Si, sous d'éventuelles conditions sur , on a
alors on dit que le schéma est A-stable.
Une méthode de Runge-Kutta à étages pour s'écrit:
On peut monter que, contrairement aux méthodes multi-pas, la taille des régions de stabilité absolue des méthodes RK augmente quand l’ordre augmente.
β > 0
{ (t) = −βy(t), y
′y(0) = y
0pour t > 0,
≠ 0
y
0y(t) = y
0e
−βty(t) = 0.
t→+∞
lim
h > 0 t
n= nh n ∈ N u
n≈ y( ) t
ny t
nh lim = 0,
n→+∞
u
ns ≥ 1 y
′(t) = −βy(t)
⎧
⎩
⎨
⎪ ⎪
⎪ ⎪
⎪ ⎪
⎪
⎪ ⎪
⎪ ⎪
⎪ ⎪
⎪
u
0= , y
0= + h u
n+1u
n∑
i=1 s
b
iK
i= −β ( + h )
K
iu
n∑
j=1 s
a
ijK
jn = 0, 1, … N − 1
i = 1, … s.
Exercice : schémas RK à un étage
Étudier les méthodes RK avec :
1. écrire le générique schéma implicite RK à un étage 2. étudier son ordre de convergence
3. écrire le générique schéma explicite RK à un étage 4. étudier son ordre de convergence
5. étudier la A-stabilité
Correction : écriture d'un schéma RK à un étage quelconque
Ces méthodes ont matrice de Butcher
Par exemple, si on choisi on trouve le schéma implicite
Notons que ce schéma n'est rien d'autre que le schéma d'Euler implicite car , donc si on remplace le dans la définition de par on obtient
s = 1
avec { ⟹ ⟹
c
1a
11b
1= c
1a
11= 1 b
1c
1c
11
⎧
⎩ ⎨ u
0= y
0= φ ( + h , + h ) K
1t
nc
1u
nc
1K
1= + h
u
n+1u
nK
1n = 0, 1, … N − 1
= 1 c
11 1 ⟹ 1
⎧
⎩ ⎨ u
0= y
0= φ ( , + h ) K
1t
n+1u
nK
1= + h
u
n+1u
nK
1n = 0, 1, … N − 1
= + h
u
n+1u
nK
1u
n+ h K
1K
1u
n+1= φ ( , + h ) = φ ( , ) ⟹ = + h = + hφ ( , )
K
1t
n+1u
nK
1t
n+1u
n+1u
n+1u
nK
1u
nt
n+1u
n+1Correction : étude de l'ordre d'un schéma RK à un étage quelconque
Si on cherche une méthode d'ordre alors il faut que : il existe une seule méthode d'ordre 2, elle est implicite et sa matrice de Butcher est
Notons que , donc si on remplace le dans la définition de par on obtient
Correction : écriture d'un schéma RK à un étage explicite
Si le schéma est explicite alors
Il existe un seul schéma explicite RK à un étage, il s'agit du schéma d'Euler explicite.
Correction : étude de l'ordre d'un schéma RK à un étage explicite
Si le schéma est explicite alors il est d'ordre 1.
2 1 × c
1=
1 2 1⟹
2 1
2
1
⎧
⎩ ⎨
⎪
⎪
= u
0y
0= φ ( + , + ) K
1t
n h2
u
n h 2K
1= + h
u
n+1u
nK
1n = 0, 1, … N − 1
= + h
u
n+1u
nK
1u
n+
h=
2
K
1 un+( +h )un K12
K
1u
n+1= φ ( + , + ) = φ ( + , ) ⟹ = + h = + hφ ( + , )
K
1t
nh
2 u
nh
2 K
1t
nh 2
+ u
nu
n+12 u
n+1u
nK
1u
nt
nh
2
+ u
nu
n+12
0 0 ⟹ 1
⎧
⎩ ⎨ u
0= y
0= φ ( , ) K
1t
nu
n= + h
u
n+1u
nK
1n = 0, 1, … N − 1
Correction : étude de la A-stabilité
Une méthode de Runge-Kutta à 1 étage pour s'écrit:
On trouve donc ainsi
Par induction on obtient
Par conséquent, si et seulement si
Notons le produit (donc ) et la fonction (avec ).
Conclusion:
si le schéma est inconditionnellement A-stable, si le schéma est A-stable ssi . Pour nos exemples, on obtient:
si (Euler Implicite) alors le schéma est inconditionnellement A-stable et d'ordre 1, si alors le schéma est inconditionnellement A-stable et d'ordre 2,
si (Euler Explicite) alors le schéma est A-stable ssi et il est d'ordre 1.
(t) = −βy(t) y
′⎧
⎩ ⎨ u
0= , y
0= + h u
n+1u
nK
1= −β ( + h ) . K
1u
nc
1K
1n = 0, 1, … N − 1
(1 + βh ) c
1K
1= −β u
n{ u
0= y
0= (1 − ) u
n+1 (βh)1+ (βh)c1
u
nn = 0, 1, … N − 1
= .
u
n(1 − βh ) 1 + βh c
1n
u
0= 0
n→+∞
lim u
n1 − < 1.
∣ ∣
∣ βh
1 + βh c
1∣ ∣
∣ x βh > 0 x > 0 q q(x) = 1 −
1+ xxc1c
1∈ [0; 1]
|q(x)| < 1 ⟺ −1 < 1 − x < 1 ⟺ { < 2 x < 2(1 + x) ⟺ 1 + x c
1< 2
1+ xxc1
> 0
1+ xxc1
⟺
x>0
≥0
c1
x
1 + x c
1⟺
c1x≥0c
1(1 − 2 )x < 2 c
1⟺ { x <
1−2c2 1∀x
si 1 − 2 > 0 c
1sinon.
≥ c
1 1<
2c
1 12
βh <
1−2c2 1= 1 c
1= c
1 1= 0
2c
1h <
β2Exercice : schémas RK à deux étages
Étudier les méthodes RK avec :
1. écrire le générique schéma implicite RK à deux étages 2. écrire le générique schéma semi-implicite RK à deux étages 3. écrire le générique schéma explicite RK à deux étages 4. étudier l'ordre de convergences des schémas explicites 5. étudier la A-stabilité des schémas explicites
Correction : écriture d'un schéma RK à deux étages quelconque
Les méthodes avec ont matrice de Butcher
Voici un exemple, appelée méthode de Gauss:
Cette méthode est d'ordre 4 et on peut monter que c'est la seule méthode d'ordre 4 à deux étages.
s = 2
s = 2
avec ⟹
c
1c
2a
11a
21b
1a
12a
22b
2⎧
⎩ ⎨ c
1= a
11+ a
12= +
c
2a
21a
22+ = 1 b
1b
2c
1c
2a
11a
211 − b
2− c
1a
11− c
2a
21b
2⟹
⎧
⎩ ⎨
⎪ ⎪
⎪
⎪ ⎪
⎪
= u
0y
0= φ ( + h , + h( + ( − ) )) K
1t
nc
1u
na
11K
1c
1a
11K
2= φ ( + h , + h( + ( − ) )) K
2t
nc
2u
na
21K
1c
2a
21K
2= + h ((1 − ) + )
u
n+1u
nb
2K
1b
2K
2n = 0, 1, … N − 1
avec γ =
1
− γ
2 1
+ γ
2
14 1
+ γ
4 1 2
1
− γ
4 1 41 2
√ 3–
6
In [3]: from sympy import * gamma=sqrt(3)/6
c=[1/2-gamma,1/2+gamma]
b=[1/2,1/2]
A=[[1/4,1/4-gamma],[1/4+gamma,1/4]]
s=len(c)
print("Consistance") print(sum(b)==1) for i in range(s):
print(sum(A[i]).simplify()==c[i]) print("\nOrdre 2")
print(sum([b[i]*c[i] for i in range(s)]).simplify()==1/2) print("\nOrdre 3")
print(sum([b[i]*c[i]**2 for i in range(s)]).simplify()==1/3)
print(sum([b[i]*A[i][j]*c[j] for i in range(s) for j in range(s)]).simplify()==1/6) print("\nOrdre 4")
print(sum([b[i]*c[i]**3 for i in range(s)]).simplify()==1/4)
print(sum([b[i]*c[i]*A[i][j]*c[j] for i in range(s) for j in range(s)]).simplify()==1/8) print(sum([b[i]*A[i][j]*c[j]**2 for i in range(s) for j in range(s)]).simplify()==1/12)
print(sum([b[i]*A[i][j]*A[j][k]*c[k] for i in range(s) for j in range(s) for k in range(s)]).simplify()==1/24) Consistance
True True True Ordre 2 True Ordre 3 True True Ordre 4 True True True True
Correction : écriture d'un schéma RK à deux étages semi-implicite
Les méthodes semi-implicites vérifient, de plus, ainsi la matrice de Butcher est
Par exemple, si on choisi , et on trouve le schéma semi-implicite
Notons que ce schéma n'est rien d'autre que le schéma de Crank-Nicolson car , donc si on remplace le dans la définition de par on obtient
ainsi
Correction : écriture d'un schéma RK à deux étages explicite
Les méthodes avec explicites ont matrice de Butcher
= c
1a
11⟹ c
1c
2c
1a
211 − b
20
− c
2a
21b
2⎧
⎩ ⎨
⎪ ⎪
⎪
⎪ ⎪
⎪
= u
0y
0= φ ( + h , + h ) K
1t
nc
1u
nc
1K
1= φ ( + h , + h( + ( − ) )) K
2t
nc
2u
na
21K
1c
2a
21K
2= + h ((1 − ) + )
u
n+1u
nb
2K
1b
2K
2n = 0, 1, … N − 1
c
1= 0 c
1= 1 a
21= a
22= b
1= b
2=
1 2⟹ 0
1 0
12 12
0
12 12
⎧
⎩
⎨
⎪ ⎪
⎪
⎪ ⎪
⎪
= u
0y
0= φ ( , ) K
1t
nu
n= φ ( , + ( + )) K
2t
n+1u
n h2
K
1K
2= + ( + )
u
n+1u
n h2
K
1K
2n = 0, 1, … N − 1
= + ( + )
u
n+1u
n h2
K
1K
2u
n+ (
h+ )
2
K
1K
2K
2u
n+1= φ ( , + ( + )) = φ ( , ) K
2t
n+1u
nh
2 K
1K
2t
n+1u
n+1= + ( + ) = + (φ ( , ) + φ ( , )) u
n+1u
nh
2 K
1K
2u
nh
2 t
nu
nt
n+1u
n+1s = 2
0 0 0 ⎧ ⎪ ⎪ ⎪ u
0= y
0= φ ( , )
K t u
Correction : étude de l'ordre d'un schéma RK à deux étages explicite
Pour avoir l'ordre 2 il faut que .
Pour avoir l'ordre 3 il faudrait que et ce qui est impossible car . Conclusion: un schéma RK à deux étages explicite d'ordre 2 s'écrit
Voici deux cas particuliers:
: schéma de Heun
: schéma d'Euler Modifié $$ \begin{array}{c|cc}
0 & 0 & 0\\
\frac{1}{2} & \frac{1}{2} & 0\ \hline & 0 & 1
\end{array} \quad \implies
$$
= b
2c
2 12
=
b
2c
22 13b
2a
21c
1=
16
c
1= 0
⟹ 0
2α1
0
2α1
1 − α 0 0 α
⎧
⎩
⎨
⎪ ⎪
⎪
⎪ ⎪
⎪
= u
0y
0= φ ( , ) K
1t
nu
n= φ ( + α, + α ) K
2t
n h2
u
n h 2K
1= + h ((1 − α) + α )
u
n+1u
nK
1K
2n = 0, 1, … N − 1
α =
12⟹ 0
1 0 1
12
0 0
12
⎧
⎩
⎨
⎪ ⎪
⎪
⎪ ⎪
⎪
= u
0y
0= φ( , ) K
1t
nu
n= φ( , + h ) K
2t
n+1u
nK
1= + h ( + ) u
n+1u
n 12
K
1 12
K
2n = 0, 1, … N − 1 α = 1
⎧
⎩
⎨
⎪ ⎪
⎪
⎪ ⎪
⎪
u
0= y
0= φ( , ) K
1t
nu
n= φ( + h, + h ) K
2t
n 12
u
n 1 2K
1= + h
u
n+1u
nK
2n = 0, 1, … N − 1
Correction : étude de la A-stabilité des schémas explicites
Le schéma donné appliqué à cette équation devient
Par induction on obtient
Par conséquent, si et seulement si
Notons le produit (donc ) et le polynôme .
Si , le schéma se réduit au schéma d'Euler explicite.
Si , c'est une parabole convexe et le sommet est situé en .
En particulier, lorsque le schéma est d'ordre 2 on a et le schéma est A-stable ssi . Si , c'est une parabole concave et le sommet est situé en .
{ u
0= y
0= (1 − (βh) + (βh )
u
n+1c
2b
2)
2u
nn = 0, 1, … N − 1
= .
u
n(1 − (βh) + c
2b
2(βh ) )
2 nu
0= 0
n→+∞
lim u
n1 − (βh) + (βh < 1.
∣∣ c
2b
2)
2∣∣
x βh > 0 x > 0 q q(x) = 1 − x + c
2b
2x
2= 0 c
2b
2> 0
c
2b
2(
2c12b2> 0, 1 −
4c12b2)
|q(x)| < 1 ⟺ x < 1 c
2b
2= b
2c
2 12
h <
β2< 0
c
2b
2(
2c12b2< 0, 1 −
4c12b2)
|q(x)| < 1 ⟺ x < 1 − 1 − 8b √ − −−−−−
2c −
22b
2c
2Exemples à 3 étages explicites
Un schéma RK à étages explicite a pour matrice de Butcher
Voici deux exemples:
schéma de Heun à trois étages
Étant une méthode explicite à 3 étapes, elle a au mieux ordre 3. Vérifions qu'elle est effectivement d'ordre 3:
3
avec ⟹
0 c
2c
30 a
21a
31b
10 0 a
32b
20 0 0 b
3⎧
⎩ ⎨ c
2= a
21= +
c
3a
31a
32+ + = 1 b
1b
2b
3⎧
⎩
⎨
⎪ ⎪
⎪ ⎪
⎪
⎪ ⎪
⎪ ⎪
⎪
= u
0y
0= φ ( , ) K
1t
nu
n= φ ( + h , + h ) K
2t
nc
2u
nc
2K
1= φ ( + h , + h( + )) K
3t
nc
3u
na
31K
1a
32K
2= + h ( + + )
u
n+1u
nb
1K
1b
2K
2b
3K
3n = 0, 1, … N − 1
⟹ 0
13 23
0
13
0
14
0 0
23
0 0 0 0
34
⎧
⎩
⎨
⎪ ⎪
⎪ ⎪
⎪ ⎪
⎪ ⎪
⎪ ⎪
⎪ ⎪
= u
0y
0= φ ( , ) K
1t
nu
n= φ ( + , + ) K
2t
n h3
u
n h 3K
1= φ ( + h, + h ) K
3t
n 23
u
n 2 3K
2= + ( + 3 ) u
n+1u
n h4
K
1K
3n = 0, 1, … N − 1
b=[1/4,0,3/4]
A=[[0,0,0],[1/3,0,0],[0,2/3,0]]
s=len(c)
print("Consistance") print(sum(b)==1) for i in range(s):
print(sum(A[i])==c[i]) print("\nOrdre 2")
print(sum([b[i]*c[i] for i in range(s)])==1/2) print("\nOrdre 3")
print(sum([b[i]*c[i]**2 for i in range(s)])==1/3)
print(sum([b[i]*A[i][j]*c[j] for i in range(s) for j in range(s)])==1/6)
schéma
Étant une méthode explicite à 3 étapes, elle a au mieux ordre 3. On vérifie ci-dessous qu'elle est d'ordre 3:
⟹ 0
12
1 0
12
−1
16
0 0 2
23
0 0 0
16
⎧
⎩
⎨
⎪ ⎪
⎪ ⎪
⎪ ⎪
⎪ ⎪
⎪ ⎪
⎪ ⎪
= u
0y
0= φ ( , ) K
1t
nu
n= φ ( + , + ) K
2t
n h2
u
n h 2K
1= φ ( , + h(− + 2 )) K
3t
n+1u
nK
1K
2= + ( + 4 + ) u
n+1u
n h6
K
1K
2K
3n = 0, 1, … N − 1
Consistance True
True True True Ordre 2 True Ordre 3 True True
In [5]: from fractions import Fraction c=[0,Fraction(1,2),1]
b=[Fraction(1,6),Fraction(2,3),Fraction(1,6)]
A=[[0,0,0],[Fraction(1,2),0,0],[-1,2,0]]
s=len(c)
print("Consistance") print(sum(b)==1) for i in range(s):
print(sum(A[i])==c[i]) print("\nOrdre 2")
print(sum([b[i]*c[i] for i in range(s)])==Fraction(1,2)) print("\nOrdre 3")
print(sum([b[i]*c[i]**2 for i in range(s)])==Fraction(1,3))
print(sum([b[i]*A[i][j]*c[j] for i in range(s) for j in range(s)])==Fraction(1,6))
schéma
Étant une méthode explicite à 3 étapes, elle a au mieux ordre 3. On vérifie ci-dessous qu'elle n'est que d'ordre 2:
⟹ 0
12
1 0
12
−1
−
160 0 2
43
0 0 0
−
16⎧
⎩
⎨
⎪ ⎪
⎪ ⎪
⎪ ⎪
⎪ ⎪
⎪ ⎪
⎪ ⎪
= u
0y
0= φ ( , ) K
1t
nu
n= φ ( + , + ) K
2t
n h2
u
n h 2K
1= φ ( , + h(− + 2 )) K
3t
n+1u
nK
1K
2= + (− + 8 − ) u
n+1u
n h6
K
1K
2K
3n = 0, 1, … N − 1
Consistance True
True True True Ordre 2 True Ordre 3 True True
b=[-Fraction(1,6),Fraction(4,3),-Fraction(1,6)]
A=[[0,0,0],[Fraction(1,2),0,0],[-1,2,0]]
s=len(c)
print("Consistance") print(sum(b)==1) for i in range(s):
print(sum(A[i])==c[i]) print("\nOrdre 2")
print(sum([b[i]*c[i] for i in range(s)])==Fraction(1,2)) print("\nOrdre 3")
print(sum([b[i]*c[i]**2 for i in range(s)])==Fraction(1,3))
print(sum([b[i]*A[i][j]*c[j] for i in range(s) for j in range(s)])==Fraction(1,6))
Exemples à 4 étages explicites
Un schéma RK à étages explicite a pour matrice de Butcher 4
avec ⟹
0 c
2c
3c
40 a
21a
31a
41b
10 0 a
32a
42b
20 0 0 a
43b
30 0 0 0 b
4⎧
⎩ ⎨
⎪ ⎪
⎪ ⎪
c
2= a
21= +
c
3a
31a
32= + +
c
4a
41a
42a
43+ + + = 1 b
1b
2b
3b
4⎧
⎩
⎨
⎪ ⎪
⎪ ⎪
⎪ ⎪
⎪
⎪ ⎪
⎪ ⎪
⎪ ⎪
⎪
u
0= y
0= φ ( , ) K
1t
nu
n= φ ( + h , + h( )) K
2t
nc
2u
na
21K
1= φ ( + h , + h( + )) K
3t
nc
3u
na
31K
1a
32K
2= φ ( + h , + h( + + )) K
4t
nc
4u
na
41K
1a
42K
2a
43K
3= + h ( + + + )
u
n+1u
nb
1K
1b
2K
2b
3K
3b
4K
4n = 0, 1, … N − 1
Consistance True
True True True Ordre 2 True Ordre 3 False False
Voici deux exemples (le premier est le plus connus):
schéma RK4-1 ("La" méthode de Runge-Kutta)
Il est bien d'ordre 4:
⟹ 0
12 12
1 0
12
0 0
16
0 0
12
0
13
0 0 0 1
13
0 0 0 0
16
⎧
⎩
⎨
⎪ ⎪
⎪ ⎪
⎪ ⎪
⎪ ⎪
⎪
⎪ ⎪
⎪ ⎪
⎪ ⎪
⎪ ⎪
⎪
= u
0y
0= φ ( , ) K
1t
nu
n= φ ( + , + )) K
2t
n h2
u
n h 2K
1= φ ( + , + ) K
3t
n h2
u
n h 2K
2= φ ( , + h ) K
4t
n+1u
nK
3= + ( + 2 + 2 + ) u
n+1u
n h6
K
1K
2K
3K
4n = 0, 1, … N − 1
b=[Fraction(1,6),Fraction(1,3),Fraction(1,3),Fraction(1,6)]
A=[[0,0,0,0],[Fraction(1,2),0,0,0],[0,Fraction(1,2),0,0],[0,0,1,0]]
s=len(c)
print("Consistance") print(sum(b)==1) for i in range(s):
print(sum(A[i])==c[i]) print("\nOrdre 2")
print(sum([b[i]*c[i] for i in range(s)])==Fraction(1,2)) print("\nOrdre 3")
print(sum([b[i]*c[i]**2 for i in range(s)])==Fraction(1,3))
print(sum([b[i]*A[i][j]*c[j] for i in range(s) for j in range(s)])==Fraction(1,6)) print("\nOrdre 4")
print(sum([b[i]*c[i]**3 for i in range(s)])==Fraction(1,4))
print(sum([b[i]*c[i]*A[i][j]*c[j] for i in range(s) for j in range(s)])==Fraction(1,8)) print(sum([b[i]*A[i][j]*c[j]**2 for i in range(s) for j in range(s)])==Fraction(1,12))
print(sum([b[i]*A[i][j]*A[j][k]*c[k] for i in range(s) for j in range(s) for k in range(s)])==Fraction(1,24)) Consistance
True True True True True Ordre 2 True Ordre 3 True True Ordre 4 True True True True
schéma RK4-2
Il est bien d'ordre 4:
⟹ 0
14 12
1 0
14
0 1
16
0 0
12
−2 0
0 0 0 2
23
0 0 0 0
16
⎧
⎩
⎨
⎪ ⎪
⎪ ⎪
⎪ ⎪
⎪ ⎪
⎪
⎪ ⎪
⎪ ⎪
⎪ ⎪
⎪ ⎪
⎪
= u
0y
0= φ ( , ) K
1t
nu
n= φ ( + , + )) K
2t
n h4
u
n h 4K
1= φ ( + , + ) K
3t
n h2
u
n h 2K
2= φ ( , + h( − 2 + 2 )) K
4t
n+1u
nK
1K
2K
3= + ( + 4 + ) u
n+1u
n h6
K
1K
3K
4n = 0, 1, … N − 1
b=[Fraction(1,6),0,Fraction(2,3),Fraction(1,6)]
A=[[0,0,0,0],[Fraction(1,4),0,0,0],[0,Fraction(1,2),0,0],[1,-2,2,0]]
s=len(c)
print("Consistance") print(sum(b)==1) for i in range(s):
print(sum(A[i])==c[i]) print("\nOrdre 2")
print(sum([b[i]*c[i] for i in range(s)])==Fraction(1,2)) print("\nOrdre 3")
print(sum([b[i]*c[i]**2 for i in range(s)])==Fraction(1,3))
print(sum([b[i]*A[i][j]*c[j] for i in range(s) for j in range(s)])==Fraction(1,6)) print("\nOrdre 4")
print(sum([b[i]*c[i]**3 for i in range(s)])==Fraction(1,4))
print(sum([b[i]*c[i]*A[i][j]*c[j] for i in range(s) for j in range(s)])==Fraction(1,8)) print(sum([b[i]*A[i][j]*c[j]**2 for i in range(s) for j in range(s)])==Fraction(1,12))
print(sum([b[i]*A[i][j]*A[j][k]*c[k] for i in range(s) for j in range(s) for k in range(s)])==Fraction(1,24)) Consistance
True True True True True Ordre 2 True Ordre 3 True True Ordre 4 True True True True
schéma RK4-3 (règle 3/8)
Il est bien d'ordre 4:
⟹ 0
13 23
1 0
13
−
131
18
0 0 1
−1
38
0 0 0 1
38
0 0 0 0
18
⎧
⎩
⎨
⎪ ⎪
⎪ ⎪
⎪ ⎪
⎪ ⎪
⎪
⎪ ⎪
⎪ ⎪
⎪ ⎪
⎪ ⎪
⎪
= u
0y
0= φ ( , ) K
1t
nu
n= φ ( + , + )) K
2t
n h3
u
n h 3K
1= φ ( + h, + (− + 3 )) K
3t
n 23
u
n h3
K
1K
2= φ ( , + h( − + )) K
4t
n+1u
nK
1K
2K
3= + ( + 3 + 3 + ) u
n+1u
n h8
K
1K
2K
3K
4n = 0, 1, … N − 1
c=[0,Fraction(1,3),Fraction(2,3),1]
b=[Fraction(1,8),Fraction(3,8),Fraction(3,8),Fraction(1,8)]
A=[[0,0,0,0],[Fraction(1,3),0,0,0],[-Fraction(1,3),1,0,0],[1,-1,1,0]]
s=len(c)
print("Consistance") print(sum(b)==1) for i in range(s):
print(sum(A[i])==c[i]) print("\nOrdre 2")
print(sum([b[i]*c[i] for i in range(s)])==Fraction(1,2)) print("\nOrdre 3")
print(sum([b[i]*c[i]**2 for i in range(s)])==Fraction(1,3))
print(sum([b[i]*A[i][j]*c[j] for i in range(s) for j in range(s)])==Fraction(1,6)) print("\nOrdre 4")
print(sum([b[i]*c[i]**3 for i in range(s)])==Fraction(1,4))
print(sum([b[i]*c[i]*A[i][j]*c[j] for i in range(s) for j in range(s)])==Fraction(1,8)) print(sum([b[i]*A[i][j]*c[j]**2 for i in range(s) for j in range(s)])==Fraction(1,12))
print(sum([b[i]*A[i][j]*A[j][k]*c[k] for i in range(s) for j in range(s) for k in range(s)])==Fraction(1,24)) Consistance
True True True True True Ordre 2 True Ordre 3 True True Ordre 4 True True True True
Exemple à 5 étages explicite
Un schéma RK à étages explicite a pour matrice de Butcher
avec
Voici un exemple:
schéma de Merson
5
⟹ 0
c
2c
3c
4c
50 a
21a
31a
41a
51b
10 0 a
32a
42a
52b
20 0 0 a
43a
53b
30 0 0 0 a
54b
40 0 0 0 0 b
5⎧
⎩
⎨
⎪ ⎪
⎪ ⎪
⎪ ⎪
⎪ ⎪
⎪ ⎪
⎪ ⎪
⎪ ⎪
⎪ ⎪
⎪ ⎪
⎪ ⎪
= u
0y
0= φ ( , ) K
1t
nu
n= φ ( + h , + h( )) K
2t
nc
2u
na
21K
1= φ ( + h , + h( + ) K
3t
nc
3u
na
31K
1a
32K
2= φ ( + h , + h( + + )) K
4t
nc
4u
na
41K
1a
42K
2a
43K
3= φ ( + h , + h( + + + ))
K
5t
nc
5u
na
51K
1a
52K
2a
53K
3a
54K
4= + h ( + + + + )
u
n+1u
nb
1K
1b
2K
2b
3K
3b
4K
4b
5K
5n = 0, 1, … N − 1
⎧
⎩
⎨
⎪ ⎪
⎪ ⎪
⎪
⎪ ⎪
⎪ ⎪
⎪
= c
2a
21= +
c
3a
31a
32= + +
c
4a
41a
42a
43= + + +
c
5a
51a
52a
53a
54+ + + + = 1 b
1b
2b
3b
4b
5⟹ 0
13 13 12
1 0
13 16 18 12 16
0 0
16
0 0 0
0 0 0
38
−
320
0 0 0 0 2
23
0 0 0 0 0
16
⎧
⎩
⎨
⎪ ⎪
⎪ ⎪
⎪ ⎪
⎪ ⎪
⎪ ⎪
⎪ ⎪
⎪ ⎪
⎪ ⎪
⎪ ⎪
⎪ ⎪
⎪ ⎪
⎪ ⎪
u
0= y
0= φ ( , ) K
1t
nu
n= φ ( + , + ) K
2t
n h3
u
n h 3K
1= φ ( + , + ( + )) K
3t
n h3
u
n h6
K
1K
2= φ ( + , + ( + 3 )) K
4t
n h2
u
n h8
K
1K
3= φ ( + h, + ( − 3 + 4 )) K
5t
nu
n h2
K
1K
3K
4= + ( + 4 + ) u
n+1u
n h6
K
1K
4K
5n = 0, 1, … N − 1
c=[0,Fraction(1,3),Fraction(1,3),Fraction(1,2),1]
b=[Fraction(1,6),0,0,Fraction(2,3),Fraction(1,6)]
A=[[0,0,0,0,0],[Fraction(1,3),0,0,0,0],[Fraction(1,6),Fraction(1,6),0,0,0],[Fraction(1,8),0,Fraction(3,8),0,0],[Fraction(1,2),0, -Fraction(3,2),2,0]]
s=len(c)
print("Consistance") print(sum(b)==1) for i in range(s):
print(sum(A[i])==c[i]) print("\nOrdre 2")
print(sum([b[i]*c[i] for i in range(s)])==Fraction(1,2)) print("\nOrdre 3")
print(sum([b[i]*c[i]**2 for i in range(s)])==Fraction(1,3))
print(sum([b[i]*A[i][j]*c[j] for i in range(s) for j in range(s)])==Fraction(1,6)) print("\nOrdre 4")
print(sum([b[i]*c[i]**3 for i in range(s)])==Fraction(1,4))
print(sum([b[i]*c[i]*A[i][j]*c[j] for i in range(s) for j in range(s)])==Fraction(1,8)) print(sum([b[i]*A[i][j]*c[j]**2 for i in range(s) for j in range(s)])==Fraction(1,12))
print(sum([b[i]*A[i][j]*A[j][k]*c[k] for i in range(s) for j in range(s) for k in range(s)])==Fraction(1,24))
Consistance True
True True True True True Ordre 2 True Ordre 3 True True Ordre 4 True True True True