In [1]:
M62_CM4 : schémas
"classiques" à un pas
Considérons le problème de Cauchy
trouver une fonction définie sur un intervalle telle que
avec une valeur donnée et supposons que l'on ait montré l'existence et l'unicité d'une solution pour .
Pour soit avec une suite de
nœuds de induisant une discrétisation de en sous- intervalles chacun de longueur (appelé le pas de discrétisation).
Pour chaque nœud , on cherche la valeur inconnue qui approche la
valeur exacte .
L'ensemble de valeurs
représente les points de la discrétisation.
L'ensemble de valeurs représente la
solution exacte.
L'ensemble de valeurs représente la
solution numérique. Cette solution approchée sera obtenue en construisant une suite récurrente.
Les schémas qu'on va construire permettent de calculer (explicitement ou implicitement) à partir de et il est donc possible de calculer successivement , ,..., en partant de par une formule de récurrence de la forme
y: I ⊂ ℝ → ℝ I = [ , T] t
0{ y
′(t) = φ(t, y(t)), y( ) = , t
0y
0∀t ∈ I = [ , T], t
0y
0y t ∈ I
h > 0 t
n≡ + nh t
0n = 0, 1, 2, … , N
h+ 1
N
hI I N
h= [ ; ]
I
nt
nt
n+1h > 0
t
nu
n≡ y( ) y
nt
n+ 1
N
h{ , = + h, … , t
0t
1t
0t
Nh= T}
+ 1
N
h{ , , … , y
0y
1y
Nh} + 1
N
h{ = , , … , u
0y
0u
1u
Nh}
u
n+1u
n, u
n−1, . . . , u
n−ku
1u
2u
0{ u
0= , y
0= Φ( , , , … , ),
u u u u u ∀n ∈ ℕ.
Out[1]:
from IPython.core.display import HTML css_file = './custom.css'
HTML(open(css_file, "r").read())
Méthodes explicites et méthodes implicites
Une méthode est dite explicite si la valeur peut être calculée directement à l'aide des valeurs précédentes , (ou d'une partie d'entre elles).
Une méthode est dite implicite si n'est défini que par une relation implicite faisant intervenir la fonction .
Méthodes à un pas et méthodes multi-pas
Une méthode numérique pour l'approximation du problème de Cauchy est dite à un pas si pour tout , ne dépend que de et
éventuellement de lui-même.
Autrement, on dit que le schéma est une méthode multi-pas (ou à pas multiples).
u
n+1u
kk ≤ n u
n+1φ
n ∈ ℕ u
n+1u
nTable of Contents
1 Construction de schémas à un pas 1.1 Schéma d'Euler explicite 1.2 Schéma d'Euler implicite 1.3 Schéma d'Euler modifié
1.4 Schéma du trapèze ou de Crank-Nicolson 1.5 Schéma de Heun
1.6 Schéma de Simpson implicite 1.7 Schéma de Simpson explicite
1.8 Schéma de Simpson explicite-variante 1.9 Remarques
Si nous intégrons l'EDO entre et nous obtenons
On peut construire différentes schémas selon la formule d'approximation utilisée pour approcher le membre de droite. Cette solution approchée sera obtenue en construisant une suite récurrente comme suit:
1 Construction de schémas à un pas
(t) = φ(t, y(t))
y
′t
nt
n+1− = φ(t, y(t))dt.
y
n+1y
n∫
tn+1
tn
= , u
0y
0= + un polynôme d'interpolation de φ(t, u)dt.
u
n+1u
n∫
tn+1
tn
Si on remplace une fonction par une constante égale à la valeur de en la borne gauche de l'intervalle (polynôme qui interpole en le point
et donc de degré ), on a
1.1 Schéma d'Euler explicite
f f
[a; b] f
(a, f (a)) 0
Cette formule est dite formule de quadrature du rectangle à gauche.
En utilisant cette formule pour approcher la fonction on a
et on obtient le schéma d'Euler progressif
Il s'agit d'un schéma à 1 pas explicite car il permet d'expliciter en fonction de .
f ̃ (x) f (x)dx
∫
b a
= f (a)
≈ ∫ (x)dx = (b − a)f (a).
b a
f ̃
t ↦ φ(t, y(t)) φ(t, y(t))dt ≈ hφ( , y( ))
∫
tn+1
tn
t
nt
n{ u
0= y( ) = , t
0y
0= + hφ( , )
u
n+1u
nt
nu
nn = 0, 1, 2, … N
h− 1 u
n+1u
nIn [2]:
Si on remplace une fonction par une constante égale à la valeur de en la borne droite de l'intervalle (polynôme qui interpole en le point
et donc de degré ), on a
Cette formule est dite formule de quadrature du rectangle à droite.
En utilisant cette formule pour approcher la fonction on a
et on obtient le schéma d'Euler rétrograde
Il s'agit d'un schéma à 1 pas implicite car il ne permet pas d'expliciter directement en fonction de lorsque la fonction n'est pas triviale.
Pour calculer il faudra utiliser un schéma pour le calcul du zéro d'une fonction quelconque.
1.2 Schéma d'Euler implicite
f f
[a; b] f
(b, f (b)) 0
(x) f ̃ f (x)dx
∫
b a
= f (a)
≈ ∫ (x)dx = (b − a)f (b).
b a
f ̃
t ↦ φ(t, y(t)) φ(t, y(t))dt ≈ hφ( , y( ))
∫
tn+1
tn
t
n+1t
n+1{ u
0= y( ) = , t
0y
0= + hφ( , )
u
n+1u
nt
n+1u
n+1n = 0, 1, 2, … N
h− 1
u
n+1u
nφ
u
n+1def euler_progressif(phi,tt):
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
In [3]:
Si on remplace une fonction par une constante égale à la valeur de au milieu de l'intervalle (polynôme qui interpole en le point
et donc de degré ), on a
Cette formule est dite formule de quadrature du rectangle ou du point milieu.
En utilisant cette formule pour approcher la fonction on a
et on obtient
où est une approximation de . Nous pouvons utiliser une prédiction d'Euler progressive sur un demi-pas pour approcher le
dans le terme par
. Nous avons construit ainsi un nouveau schéma appelé schéma d'Euler modifié qui s'écrit
Il s'agit d'un schéma à 1 pas explicite car il permet d'expliciter en fonction de .
1.3 Schéma d'Euler modifié
f f
[a; b] f
(
a+b2, f (
a+b))
2
0
(x) f ̃ f (x)dx
∫
b a
= f (
a+b2)
≈ ∫ (x)dx = (b − a)f ( ) .
b
a
f ̃
a+b2t ↦ φ(t, y(t)) φ(t, y(t))dt ≈ hφ ( + , y ( + ))
∫
tn+1
tn
t
nh
2 t
nh 2
{
= y( ) = , u
0t
0y
0= + hφ ( + , )
u
n+1u
nt
n h2
u
n+1/2n = 0, 1, 2, … N
h− 1
u
n+1/2y( + h/2) t
nu
n+1/2φ( + h/2, t
nu
n+1/2)
= + (h/2)φ( , ) ũ
n+1/2u
nt
nu
n
= y( ) = , u
0t
0y
0= + (h/2)φ( , ), ũ
n+1/2u
nt
nu
n= + hφ ( + , )
u
n+1u
nt
n h2
ũ
n+1/2n = 0, 1, 2, … N
h− 1 u
n+1u
nFile "<ipython-input-3-23235508af11>", line 1 def euler_regressif(phi,tt)
^ SyntaxError: invalid syntax def euler_regressif(phi,tt) h = tt[1]-tt[0]:
uu = [y0]
for i in range(len(tt)-1):
uu.append( fsolve(lambda x: -x+uu[i]+h*phi(tt[i+1],x), return uu
In [4]:
Si on remplace une fonction par le segment qui relie à (polynôme qui interpole en les points et et donc de degré ), on a
Cette formule est dite formule de quadrature du trapèze.
En utilisant cette formule pour approcher la fonction on a
et on obtient le schéma du trapèze ou de Crank-Nicolson
Il s'agit à nouveau d'un schéma à 1 pas implicite car il ne permet pas d'expliciter directement en fonction de lorsque la fonction n'est pas triviale. En fait, ce schéma fait la moyenne des schémas d'Euler progressif et rétrograde.
1.4 Schéma du trapèze ou de Crank-Nicolson
f (a, f (a)) (b, f (b)) f (a, f (a)) (b, f (b))
1
(x) f ̃ f (x)dx
∫
b a
=
f(b)−f(a)b−a(x − a) + f (a)
≈ ∫ (x)dx = (f (a) + f (b)) .
b
a
f ̃ b − a 2
t ↦ φ(t, y(t)) φ(t, y(t))dt ≈ (φ( , y( )) + φ( , y( )))
∫
tn+1
tn
h
2 t
nt
nt
n+1t
n+1{ u
0= y( ) = , t
0y
0= + φ( , ) + φ( , )
u
n+1u
n h2
t
nu
n h2
t
n+1u
n+1n = 0, 1, 2, … N
h− 1
u
n+1u
nφ
In [5]:
Pour éviter le calcul implicite de dans le schéma du trapèze, nous pouvons utiliser une prédiction d'Euler progressive et remplacer le
dans le terme par . Nous avons
construit ainsi un nouveau schéma appelé schéma de Heun. Plus précisément, la méthode de Heun s'écrit
1.5 Schéma de Heun
u
n+1u
n+1φ( t
n+1, u
n+1) ũ
n+1= u
n+ hφ( , ) t
nu
n def euler_modifie(phi,tt):h=tt[1]-tt[0]
uu = [y0]
for i in range(len(tt)-1):
uu.append( uu[i]+h*phi(tt[i]+h/2.,uu[i]+0.5*h*phi(tt[i]
return uu
def CN(phi,tt):
h=tt[1]-tt[0]
uu = [y0]
for i in range(len(tt)-1):
uu.append( fsolve(lambda x: -x+uu[i]+0.5*h*( phi(tt[i]
return uu
Il s'agit à nouveau d'un schéma à 1 pas explicite.
= y( ) = , u
0t
0y
0= + hφ( , ), ũ
n+1u
nt
nu
n= + φ( , ) + φ( , )
u
n+1u
n h2
t
nu
n h2
t
n+1ũ
n+1n = 0, 1, 2, … N
h− 1
In [6]:
Si on remplace une fonction par la parabole segment qui passe par , et (polynôme qui interpole en les
points , et et donc de degré ), on a
Cette formule est dite formule de Simpson.
En utilisant cette formule pour approcher la fonction on a
et on obtient
où est une approximation de . Nous pouvons utiliser une prédiction d'Euler progressive sur un demi-pas pour approcher le
dans le terme par
. Nous avons construit ainsi un nouveau schéma qu'on appellera schéma de Simpson implicite qui s'écrit
Il s'agit d'un schéma à 1 pas implicite car il ne permet pas d'expliciter en fonction de .
1.6 Schéma de Simpson implicite
(a, f (a)) (b, f (b)) (
a+b2, f ( f
a+b2)) f (a, f (a)) (b, f (b)) (
a+b2, f (
a+b))
2
2
(x) f ̃
f (x)dx
∫
b a
= f (a) (x − b) (x −
a+b2) + f ( ) (a − b) (a −
a+b2)
a+b2
(x − a)(x − b) (
a+b2− a) (
a+b2− b
≈ ∫ (x)dx = (f (a) + 4f ( ) + f (b)) .
b
a
f ̃ h
6
a+b2t ↦ φ(t, y(t))
φ(t, y(t))dt ≈ (φ( , y( )) + 4φ ( + , y ( + )) + φ
∫
tn+1
tn
h
6 t
nt
nt
nh
2 t
nh 2
{
= y( ) = , u
0t
0y
0= + (φ( , ) + 4φ ( + , ) + φ( , )) u
n+1u
n h6
t
nu
nt
n h2
u
n+1/2t
n+1u
n+1u
n+1/2y( + h/2) t
nu
n+1/2φ( + h/2, t
nu
n+1/2)
= + (h/2)φ( , ) ũ
n+1/2u
nt
nu
n
= y( ) = , u
0t
0y
0= + (h/2)φ( , ), ũ
n+1/2u
nt
nu
n= + (φ( , ) + 4φ ( + , ) + φ( , )) u
n+1u
n h6
t
nu
nt
n h2
ũ
n+1/2t
n+1u
n+1n u
n+1u
n def heun(phi,tt):h=tt[1]-tt[0]
uu = [y0]
for i in range(len(tt)-1):
k1 = phi( tt[i], uu[i] )
k2 = phi( tt[i+1], uu[i] + k1 ) uu.append( uu[i] + 0.5*h*(k1+k2) ) return uu
Pour éviter le calcul implicite de dans le schéma de Simpson implicite, nous pouvons utiliser une prédiction d'Euler progressive et remplacer le dans le terme par
. Nous avons construit ainsi un nouveau schéma qu'on appellera schéma de Simpson explicite et qui s'écrit
Il s'agit à nouveau d'un schéma à 1 pas explicite.
Notons qu'on aurait pu remplacer le dans le terme par une approximation utilisant comme par exemple une prédiction d'Euler progressive à partir de , ce qui donne
:
1.7 Schéma de Simpson explicite u
n+1u
n+1φ( t
n+1, u
n+1)
= + hφ( , ) uˇ
n+1u
nt
nu
n
= y( ) = , u
0t
0y
0= + φ( , ), ũ
n+1/2u
n h2
t
nu
n= + hφ( , ), uˇ
n+1u
nt
nu
n= + (φ( , ) + 4φ ( + , ) + φ( , )) u
n+1u
n h6
t
nu
nt
n h2
ũ
n+1/2t
n+1uˇ
n+1n 1.8 Schéma de Simpson explicite-variante
u
n+1φ( t
n+1, u
n+1) ũ
n+1/2+ h/2 t
n= + φ( + h/2, )
û
n+1ũ
n+1/2 h2
t
nũ
n+1/2
= y( ) = , u
0t
0y
0= + φ( , ), ũ
n+1/2u
n h2
t
nu
n= + φ( + h/2, ),
û
n+1ũ
n+1/2 h2
t
nũ
n+1/2= + (φ( , ) + 4φ ( + , ) + φ( , )) u
n+1u
n h6
t
nu
nt
n h2
ũ
n+1/2t
n+1û
n+1n
La méthode d'Euler explicite construit la suite
par conséquent pour tout . La méthode d'Euler explicite approche la solution constante pour tout .
La méthode d'Euler implicite construit la suite
par conséquent mais dépend de la méthode de résolution de l'équation implicite . Bien sur est une solution mais
est aussi solution. Si le schéma choisit , alors pour tout .
Notons que le problème de Cauchy avec une CI admet une et une seule solution, la fonction . Dans ce cas, les deux schémas approchent forcement la même solution.
{ u
0= y
0= 0,
= + hφ( , ) = + h ,
u
n+1u
nt
nu
nu
nu
1/2nn = 0, 1, 2, … N
h− 1
= 0
u
nn
y(t) = t ∈ ℝ
+{ u
0= y
0= 0,
= + hφ( , ) = + h ,
u
n+1u
nt
n+1u
n+1u
nu
1/2n+1n = 0, 1, 2, … N
h− 1
= 0
u
0u
1x = 0 + h x⎯⎯ √ x = 0
x = h
2u
1= h
2u
n> 0
n ∈ ℕ
∗y(0) = y
0> 0
y(t) = (t − 2
14√ ) y ⎯ ⎯ ⎯⎯
0 21. À première vue, il semble que le schéma d'Euler progressif et le schéma de Heun soient préférable au schéma d'Euler rétrograde et de Crank-Nicolson puisque ces derniers ne sont pas explicites.
Cependant, on verra que les méthodes d'Euler implicite et de Crank- Nicolson sont inconditionnellement A-stables. C'est aussi le cas de nombreuses autres méthodes implicites. Cette propriété rend les méthodes implicites attractives, bien qu'elles soient plus coûteuses que les méthodes explicites.
2. Pour la mise en application d'un schéma il faut aussi prendre en compte l'influence des erreurs d'arrondi. En effet, afin de minimiser l'erreur globale théorique, on pourrait être tenté d'appliquer une méthode avec un pas très petit, par exemple de l'ordre de , mais ce faisant, outre que le temps de calcul deviendrait irréaliste, très rapidement les erreurs d'arrondi feraient diverger la solution approchée. En pratique il faut prendre assez petit pour que la méthode converge assez rapidement, mais pas trop petit non plus pour que les erreurs d'arrondi ne donnent pas lieu à des résultats incohérent et pour que les calculs puissent être effectués en un temps raisonnable.
3. Pour vérifier nos calculs d'interpolation puis intégration, nous pouvons utiliser le package de calcul formel SymPy :
1.9 Remarques
10
−16h
In [7]:
EE:
EI:
Point Milieu :
CN:
hϕn
hϕnp1
hϕnpm
import sympy as symb symb.init_printing()
symb.var('phi_np1,phi_n,phi_npm,') symb.var('h,t,t_n')
t_np1=t_n+h t_npm=t_n+h/2
p=symb.interpolate([(t_n,phi_n)], t)
EE=(symb.integrate(p,(t,t_n,t_np1)).simplify()) print("EE:")
display(EE) print("\n")
p=symb.interpolate([(t_np1,phi_np1)], t)
EI=(symb.integrate(p,(t,t_n,t_np1)).simplify()) print("EI:")
display(EI) print("\n")
p=symb.interpolate([(t_npm,phi_npm)], t)
PM=(symb.integrate(p,(t,t_n,t_np1)).simplify()) print("Point Milieu :")
display(PM) print("\n")
p=symb.interpolate([(t_np1,phi_np1),(t_n,phi_n)], t) CN=(symb.integrate(p,(t,t_n,t_np1)).simplify()) print("CN:")
display(CN) print("\n")
p=symb.interpolate([(t_np1,phi_np1),(t_npm,phi_npm),(t_n,phi_n SI=(symb.integrate(p,(t,t_n,t_np1)).simplify())
print("Simpson:") display(SI)
print("\n")
In [ ]:
Simpson:
( + ) h
2 ϕn ϕnp1
( + + 4 ) h
6 ϕn ϕnp1 ϕnpm