Scilab CPGE - TP 3
L’objet de ce TP est de réaliser à l’aide de Scilab, un code de résolution d’équations hyperboliques linéaires
et non linéaires. On s’intéresse dans un premier temps à l’équation de transport puis à celle de Bürgers.
unj+1 − unj ∂
Dx+ unj = (approximation d’ordre 1 de u)
△x ∂x
unj − unj−1 ∂
Dx− unj = (approximation d’ordre 1 de u)
△x ∂x
unj+1 − unj−1 ∂
Dx unj = (approximation d’ordre 2 de u)
2△t ∂x
un+1
j − unj ∂
Dt+ unj = (approximation d’ordre 1 de u)
△t ∂t
un+1
j − un−1
j ∂
Dt unj = (approximation d’ordre 1 de u)
2△t ∂t
unj+1 + unj−1 − 2unj+1 ∂2
Dx2 unj = (approximation d’ordre 2 de u)
△x2 ∂x2
1
1.1.1 Schémas décentrés
Dt+ unj + Dx+ fjn = 0 (décentré avant, ordre 1)
△x
où on a posé aj± 1 = a(xj ± ).
2 2
Dt unj + Dx fjn = 0 (Saute-Mouton, ordre 2 )
avec λ = △t/△x et g(u, v) une fonction de deux variables, appelée flux numérique.
Ainsi on a les différentes fonctions g suivante :
2
Schéma Coefficient d’amplification Cond. stabilité
décentré avant A(ξ, △t, △x) = 1 − λ(eiξ△x − 1) −1 ≤ aλ < 0
décentré arrière A(ξ, △t, △x) = 1 − λ(1 − eiξ△x ) 0 < aλ ≤ 1
centré A(ξ, △t, △x) = 1 − iaλ sin(ξ△x) instable
Lax A(ξ, △t, △x) = cos(ξ△x) − iaλ sin(ξ△x) |aλ| ≤ 1
Lax-Wendroff A(ξ, △t, △x) = 1 − iaλ sin(ξ△x) + a2 λ2 (cos(ξ△x) − 1) |aλ| ≤ 1
• des fonctions décrivant les flux numériques de chacun des schémas, par exemple : function g=g lax(u,v,x,t)
• un script principal initialisant les données, réalisant la boucle de calcul en temps et affichant le résultat
(dessin ou film)
où la fonction f est le flux. Ce flux est donné par l’équation d’état. Par exemple, pour l’équation de Bürgers
on a :
1
f (u) = u2 .
2
Dans toute la suite, on suppose que la fonction u → f ′ (u) est convexe et régulière. On note a(u) = f ′ (u)
qui est une fonction croissante puisque f est convexe. Par la suite, on se place dans le cas de l’équation de
Bürgers.
3
Méthode des caractéristiques
On montre que les courbes caractéristiques de l’équation (E) sont des droites et que la solution est constante
le long des caractéristiques. La droite caractéristique issue du point (ξ, 0) est donnée par (x(t), t) :
x(t) = a(u0 (ξ))t + ξ
Si la fonction u0 est croissante, les droites caractéristiques ne se rencontrent jamais dans le demi plan t > 0
(pour tout (x, t), t > 0, l’équation précédente admet au plus une solution ξ). On distingue un problème
emblématique : le problème de Riemann à deux états où la donnée initiale est :
u1 si x < 0
u0 (x) =
u2 si x ≥ 0
Lorque u2 ≥ u1 (donnée initiale croissante) la solution est une onde de détente :
x
u1 si t ≤ u1
x x
u(x, t) = si u1 ≤ ≤ u2
t t
u2 si x ≥ u2
t
x
Dans le secteur u1 ≤ ≤ u2 , on ne peut pas trouver de caractéristique mais il est facile de vérifier xt est bien
t
une solution de l’équation (E) qui donne naissance aux droites caractéristiques xt = α avec u1 ≤ α ≤ u2 ;
ces caractéristiques se croisant toutes en (0, 0). Notons que cette solution est continue bien que la donnée
initiale ne le soit pas.
Lorsque u1 > u2 , on constate que des droites caractéristiques se croisent dans le demi-plan t > 0. Il s’agit
de trouver une solution discontinue (propagation d’une discontinuité), c’est-à-dire une courbe Γ(γ(t), t)
démarrant au point (0, 0) et séparant le demi-plan t > 0, la solution étant donnée par u1 à gauche de cette
courbe et par u2 à droite. L’équation de cette courbe est donnée par la condition de Rankine-Hugoniot
d
[u]γ(t) γ(t) = [f (u)]γ(t)
dt
où [u]γ(t) désigne le saut de la fonction u au point (γ(t), t). Dans le cas de l’équation de Bürgers, on a
l’expression plus simple :
d 1
γ = (u+ + u− )
dt 2
où u+ (resp. u− ) désigne la valeur de u à droite (resp. à gauche).
Dans le cas du problème de Riemann à deux états (u1 > u2 ) on obtient la solution, dite onde de choc :
u1 si x < 1 (u1 + u2 )
t 2
u(x, t) = x 1
u2 si > (u1 + u2 )
t 2
4
2.2 Schémas pour l’équation de Bürgers
On utilise des schémas aux différences finies en espace et en temps avec les notation suivantes : xj = j△x,
j ∈ Z, tn = n△t, n ∈ N et unj une approximation de u(xj , tn ). Certains sont directement issus des schémas
pour l’équation de transport :
1
un+1
j − 2 u n
j+1 + u n
j−1
+ Dx fjn = 0 (Lax,-Friedrichs, ordre 1)
△t
1 △t
Dt+ unj + Dx fjn − aj+ 1 Dx+ fjn − aj− 1 Dx− fjn = 0 (Lax-Wendroff, ordre 2 )
2 △x 2 2
D’autres schémas sont spécifiques aux équations non-linéaires, par exemple le schéma de Godounov .
Schéma de Godounov
Une itération du schéma de Godounov permettant de passer de unj à un+1
j est constituée de
j∈Z j∈Z
plusieurs étapes :
• étape 1 : fabrication d’une fonction discontinue par morceaux:
h i
v n (x) = unj sur xj− 1 , xj+ 1
2 2
Le schéma de Godounov peut également se metttre sous forme conservative. On montre que le flux numérique
associé au schéma de Godounov est :
1
g(u, v) = wR (0, u, v)2
2
c’est un schéma d’ordre 1, stable sous la condition (1).
5
2.3 Programmation des schémas
Afin de pouvoir tester les schémas de Lax-Friedrichs, Lax-Wendroff et Godounov on adoptera la même
architecture que celle développée pour l’équation de transport. On ajoutera en particulier les fonctions de
flux numérique de Lax-Friedrichs, Lax-Wendroff et Godounov : function y=g lf(u,v,x,t), function
y=g lw(u,v,x,t) et function y=g god(u,v,x,t).
On écrirera un script généal permettant de réaliser la simulation de ces schémas (films et/ou solution
à différents instants) ainsi qu’un script permettant de réaliser des courbes d’erreurs (en norme L∞ ) des
différents schémas en échelle logarithmique
On validera le code sur l’exemple du problème de Riemann à trois états introduit précedemment.