Vous êtes sur la page 1sur 49

Chapitre 4 : Méthode des diérences nies

Babacar LEYE
17 mai 2023

Table des matières


1 Introduction 1
2 Approximation des dérivées 2
2.1 Approximation de la dérivée première . . . . . . . . . . . . . . . 3
2.2 Approximation de la dérivée seconde . . . . . . . . . . . . . . . . 4

3 Problèmes linéaires 6
4 Problèmes non linéaires 11
5 Equation de diusion 16
5.1 La méthode d'Euler explicite . . . . . . . . . . . . . . . . . . . . 16
5.2 La méthode d'Euler implicite . . . . . . . . . . . . . . . . . . . . 24
5.3 La méthode de Crank-Nicolson . . . . . . . . . . . . . . . . . . . 28

6 Equation des ondes 34


6.1 La méthode d'Euler explicite centrée . . . . . . . . . . . . . . . . 34

7 Equation d'advection 38
8 Travaux dirigés 42
8.1 Problèmes linéaires . . . . . . . . . . . . . . . . . . . . . . . . . . 42
8.2 Problèmes non linéaires . . . . . . . . . . . . . . . . . . . . . . . 43
8.3 Conditions aux bords mixtes . . . . . . . . . . . . . . . . . . . . 44
8.4 Equation de diusion . . . . . . . . . . . . . . . . . . . . . . . . . 46
8.5 Equation des ondes . . . . . . . . . . . . . . . . . . . . . . . . . . 47

1 Introduction
La méthode des diérences nies est une méthode de résolution des pro-
blèmes aux limites. Elle est basée sur la subdivision du domaine en plusieurs
sous-intervalles. Ensuite, on remplace les dérivées par des diérences nies. On

1
génére ensuite un système linéaire dont l'inconnue est le vecteur solution sur les
noeuds du maillage.
Exemple 1 (Problèmes aux limites du second ordre). On considère l'équation
diérentielle du second ordre dans sa forme générale,
′′ ′
y = f (x, y, y ), a < x < b, (1)
soumise à deux conditions aux bords, dénies sur la frontière a et b. Comme
les conditions aux bords peuvent être imposées sur y ou y , diérentes formes ′

peuvent être rencontrées.


Exemple 2 (Conditions aux bords). Les conditions aux bords les plus courantes
sont dénies comme suit.
 Conditions de Dirichlet : les valeurs de y sur la frontière sont données :
y(a) = ya , y(b) = yb . (2)
 Conditions de Neumann : les valeurs de y sur la frontière sont données :

′ ′ ′ ′
y (a) = ya , y (b) = yb . (3)
 Conditions mixtes : elles sont une combinaison entre les conditions de
Dirichlet et de Neuman :
′ ′
c1 y (a) + c2 y(a) = ba , c3 y (b) + c4 y(b) = bb . (4)

Exemple 3 (Problèmes aux limites d'ordre élevés). Les problèmes aux limites
peuvent être basés sur les équations diérentielles d'ordre supérieur à deux. Par
exemple, dans l'analyse des vibrations transversales libres d'une poutre uniforme
de longueur L, xée aux deux extrémités, on rencontre l'équation du 4-ième ordre
d4 X
− γ 4 X = 0, γ > 0, (5)
dx4
soumis aux conditions aux limites
′′ ′′
X(0) = 0, X(L) = 0, X (0) = 0, X (L) = 0. (6)

2 Approximation des dérivées


L'intervalle [a, b] sur lequel le problème doit être résolu est subdivisé en N
sous-intervalles de longueur h = (b − a)/N . Ainsi, N + 1 n÷uds sont générés,
incluant x1 = a et xN +1 = b qui sont les points frontières gauche et droite.
Les N − 1 points, x2 , ..., xN sont les n÷uds internes.
A l'intérieur du domaine [a, b], les dérivées sont remplacées par des
diérences nies. A cause de leur précision, les formules de diérences centrées
sont souvent utilisées dans la méthode des diérences nies. Spécialement, pour
la première et la seconde dérivée de y par rapport à x,

2
y(x)

x1 = a x2 x3 xN +1 = b x

dy(xi ) y(xi+1 ) − y(xi−1 ) d2 y(xi ) y(xi−1 ) − 2y(xi ) + y(xi+1 )


≃ , ≃ . (7)
dx 2h dx2 h2
Les diérences nies sont obtenues à partir des formules de Taylor.

2.1 Approximation de la dérivée première


Approximation centrée Si la solution y est de classe C 2 , alors on a les
formules de Taylor suivantes

′ h2 ′′
y(ti−1 ) = y(ti ) − hy (ti ) + y (ηi ), ηi ∈ [ti−1 , ti ], (8)
2

h2 ′′

y (ζi ), ζi ∈ [ti , ti+1 ].
y(ti+1 ) = y(ti ) + hy (ti ) + (9)
2
En faisant la diérence des équations (9) - (8), on obtient la formule centrée

′ y(ti+1 ) − y(ti−1 ) h  ′′ ′′

y (ti ) = + y (ηi ) − y (ζi ) , (10)
2h |2 {z }
erreur de consistance
et l'approximation centrée en négligeant l'erreur de consistance

′ y(ti+1 ) − y(ti−1 )
y (ti ) ≃ . (11)
2h

3
Approximation arrière Si la solution y est de classe C 2 , alors on a la formule
de Taylor suivante

h2 ′′ ′
y(ti−1 ) = y(ti ) − hy (ti ) +
y (ηi ), ηi ∈ [ti−1 , ti ], (12)
2
On extrait de léquations (12) la formule arrière

′ y(ti ) − y(ti−1 ) h ′′
y (ti ) = + y (ηi ) , (13)
h |2 {z }
erreur de consistance
et l'approximation arrière en négligeant l'erreur de consistance

y(ti ) − y(ti−1 )

y (ti ) ≃ . (14)
h
En particulier, lorsqu'on doit discrétiser la dérivée en b, on utilise la formule

′ ′ y(tN +1 ) − y(tN )
y (b) = y (tN +1 ) ≃ . (15)
h

Approximation avant Si la solution y est de classe C 2 , alors on a la formule


de Taylor suivante

h2 ′′ ′
y (ζi ), ζi ∈ [ti , ti+1 ],
y(ti+1 ) = y(ti ) + hy (ti ) + (16)
2
On extrait de léquations (16) la formule arrière

′ y(ti+1 ) − y(ti ) h ′′
y (ti ) = − y (ζi ) , (17)
h |4 {z }
erreur de consistance
et l'approximation avant en négligeant l'erreur de consistance

y(ti+1 ) − y(ti )

y (ti ) ≃ . (18)
h
En particulier, lorsqu'on doit discrétiser la dérivée en a, on utilise la formule

′ ′ y(t2 ) − y(t1 )
y (a) = y (t1 ) ≃ . (19)
h

2.2 Approximation de la dérivée seconde


Si la solution y est de classe C 3 , alors on a les formules de Taylor suivantes

′ h2 ′′ h3
y(ti−1 ) = y(ti ) − hy (ti ) + y (ηi ) − y (3) (ηi ), ηi ∈ [ti−1 , ti ], (20)
2 6

4
′ h2 ′′ h3
y(ti+1 ) = y(ti ) + hy (ti ) + y (ζi ) + y (3) (ζi ), ζi ∈ [ti , ti+1 ]. (21)
2 6
En faisant la somme des équations (21) + (20), on obtient la formule centrée

′′ y(ti−1 ) − 2y(ti ) + y(ti+1 ) h  (3) 


y (ti ) = + y (η i ) − y (3)
(ζi ) , (22)
h2 |6 {z }
erreur de consistance
et l'approximation centrée en négligeant l'erreur de consistance

′′ y(ti−1 ) − 2y(ti ) + y(ti+1 )


y (ti ) ≃ . (23)
h2

5
3 Problèmes linéaires
Exercice 1 (Problème linéaire). On considère le problème aux limites :

 ü(x) = 0.02u(x) + 1, 0 < x < 10,
u(0) = 10, (24)
u(10) = 100.

Résoudre le problème avec la méthode des diérences nies, en utilisant les


formules de dérivées centrées, avec un pas h = 2.
Solution 1. Le domaine géométrique est l'intervalle [0, 10]. Il est subdivisé
en N sous-intervalles de même longueur. Le pas en espace est h = 2, donc le
nombre de sous-intervalles est N = = 5. Les noeuds du maillage sont ainsi
10−0

dénis par x = 0, x = 2, x = 4, x = 6, x = 8, x = 10. Les solutions


2

numériques sur ces diérents n÷uds sont notées respectivement : u , u , u , u ,


0 1 2 3 4 5

u , u . Sur chaque n÷ud interne, la dérivée seconde ü(x ) est remplacée par la
0 1 2 3

formule de diérences centrée (23) pour obtenir le schéma numérique suivant


4 5 i



 u0 = 10,



ui−1 −2ui +ui+1
h2 = 0.02ui + 1, i = 1, 2, 3, 4,




u5 = 100.

En simpliant l'équation ci-dessus, on obtient




 u0 = 10,



αui−1 + βui + αui+1 = 1, i = 1, 2, 3, 4, (25)




u5 = 100.

avec α = et β = −
1
h2
2
h2 − 0.02 . Le schéma numérique se réécrit comme suit
    
u0 = 10 1 0 0 0 0 0 u0 10
αu0 + βu1 + αu2 = 1 α
 β α 0 0 0 u1   1 
   
αu1 + βu2 + αu3 = 1 0 α β α 0 0 u2   1 
⇒   =  
αu2 + βu3 + αu4 = 1 0
 0 α β α 0 u3   1 
   
αu3 + βu4 + αu5 = 1 0 0 0 α β α u4   1 
u5 = 100 0 0 0 0 0 1 u5 100

Ce système linéaire est implémenté en Scilab. La résolution numérique nous


donne la solution u = (10, 15.34, 25.92, 42.57, 66.62, 100) . Elle est illustrée par
T

la gure 1. La précision de la méthode peut être améliorée en réduisant le pas h.

6
1 // domaine g éomé t r i q u e [a , b]

2 a = 0;

3 b = 10;

4
5 // maillage

6 N = 5; // nombre de sous = intervalles

7 h = (b =a ) /N ;

8 x = a:h:b;

9 x = x ';

10
11 // s y s t ème lin é aire

12 A = z e r o s (N+1 ,N+1) ;

13 F = z e r o s (N+ 1 , 1 ) ;

14
15 alph = 1/ h ^ 2 ;

16 bet = = 2/h ^ 2 = 0.02;

17
18 A( 1 , 1 ) = 1;

19 A(N+1 ,N+1) = 1;

20
21 F(1) = 10;

22 F (N+1) = 100;

23
24 for i = 2 :N

25 A( i , i = 1) = alph ;

26 A( i , i ) = bet ;

27 A( i , i +1) = alph ;

28 F( i ) = 1;

29 end

30
31 u = A\F ; // ré solution du s y s t ème lin é aire

32
33 // visualisation

34 disp ( ' [ x u] ') ; disp ( [ x u]) ;

35 plot2d (x , u) ;

36 xtitle ( ' ' , 'x ' , 'u(x) ' ) ;

ProblemeLineaireDF.sce

Figure 1  Tracé de la fonction u(x) de l'Exemple 1

7
On considère un deuxième exemple suivant
Exercice 2 (Coecient variable). Résoudre l'équation suivante avec la méthode
des diérences nies
 ′′ ′

 −ν(x)u (x) + u (x) = f (x), x ∈]a, b[,



(26)

u (a) − u(a) = ua ,




u(b) = ub .

Le coecient ν(x) de u (x) dépend de la variable x. On parle ainsi de coef-


′′

cient variable (non constant). Acher la solution x 7→ u(x) pour les données
suivantes :
 le domaine géométrique
a = 0, b = 1; (27)
 les conditions aux bords
ua = 0, ub = 1; (28)
 le coecient de diusion
ν(x) = sin(2πx); (29)
 le terme source
2
f (x) = e−x . (30)

Solution 2.
1. La première étape est le maillage du domaine consistant à subdiviser
l'intervalle [a, b] en N sous-intervalles de longueur
b−a
h= . (31)
h
Les n÷uds du maillage sont ainsi dénis par
xi = a + i ∗ h, ∀i = 0, 1, ..., N. (32)
Ainsi, on obtient
x0 = a, x1 = a + h, x2 = a + 2h, ..., xN = b. (33)
2. La seconde étape est la discrétisation des diérentes dérivées qui sont
u (x), u (x) et u (a) respectivement par les formules de diérences nies
′′ ′ ′

(23), (11) et (19). Pour la discrétisation de u (x), on a fait le choix du


schéma centré mais les schémas avant ou arrière peuvent être utilisés. Le
schéma numérique ainsi obtenu s'écrit
8
u1 −u0


 h − u0 = ua ,



−ν(xi ) ui−1 −2u
h2
i +ui+1
+ ui+1 −ui−1
2h = f (xi ), i = 1, 2, ..., N − 1,




uN = ub ,

(34)
ou encore


 αu0 + βu1 = ua



αi ui−1 + βi ui + γi ui+1 = f (xi ), i = 1, 2, ..., N − 1 (35)




uN = ub

avec
1 1
α = −1 − , β= , (36)
h h

ν(xi ) 1 2ν(xi ) ν(xi ) 1


αi = − 2
− , βi = , γi = − + . (37)
h 2h h2 h2 2h
3. La troisième étape consiste à construire le système linéaire, en écrivant
le schéma numérique sous la forme
αu0 + βu1 = ua
α1 u0 + β1 u1 + γ1 u2 = f (x1 )

.. .. ..
α2 u1 + β2 u2 + γ2 u3 = f (x2 )

(38)
.. .. ..
αi ui−1 +β u +γ u
i i i i+1 = f (x )
i

αN −1 uN −2 + βN −1 uN −1 + γN −1 uN = f (xN −1 )
uN = ub
Ce qui nous ramène au système lináire suivant :

... ..
··· ···
 
α β 0 0    
u0 ua

.. .. ..
 
...
α1 β1 γ1   u1   f (x1 ) 
    
    
.. . . . . . . . . . ... .. ..
0 α2 β2 γ2  (39)
   
  =
    
.. ... α

 0  
  
 


  uN −1  f (xN −1 )
 N −1 βN −1 γN −1 
uN ub
0 ··· ··· 0 0 1

9
Le code Scilab 1 calcule et ace la solution numérique sur un maillage de
N = 20 sous-intervalles. La solution numérique est présentée dans la Figure 2.

Figure 2  Tracé de la fonction u(x) de l'Exemple 2

Code Scilab 1 (Coecients variables).


// domaine géométrique [a, b]
a = 0;
b = 1;

// données
ua = 0;
ub = 1;

deff('y=nu(x)','y=sin(2*%pi*x)');
deff('y=f(x) ','y=exp(-x^2)');

// maillage
N = 20;
h = (b-a)/N;
x = a:h:b;
x = x';

// système linéaire
A = zeros(N+1,N+1);
b = zeros(N+1,1);

alpha = -1-1/h;
beta = 1/h;

A(1,1) = alpha;
A(1,2) = beta;
A(N+1,N+1) = 1;

10
b(1) = ua;
b(N+1) = ub;

for i=2:N
alphai = -nu(x(i))/h^2-1/(2*h);
betai = 2*nu(x(i))/h^2;
gammai = -nu(x(i))/h^2+1/(2*h);;
A(i,i-1) = alphai;
A(i,i) = betai;
A(i,i+1) = gammai;
b(i) = f(x(i));
end

u = A\b; // résolution du système linéaire

// visualisation
disp('[x u]'); disp([x u]);
plot2d(x,u);
xtitle(' ','x','u(x)');

4 Problèmes non linéaires


La résolution des problèmes non-linéaires se ramène à la résolution numé-
rique d'un système non-linéraire. Ce système peut être résolu en utilisant les
méthodes itératives (Newton, point xe, ...). On considère l'exemple d'équation
non-linéaire suivante :

11
Exercice 3 (Problème non-linéaire). Soit l'équation suivante :
 ′′

 u (x) − β(u(x))4 − αu(x) + γ = 0, x ∈]a, b[,



u(a) = ua , (40)




u(b) = ub ,

Résoudre cette équation avec la méthode des diérences nies. Ensuite, a-
chier la solution correspondante pour les données suivantes :
 le domaine géométrique
a = 1, b = 2; (41)
 les conditions aux bords
ua = 500, ub = 350 ; (42)
 les paramètres
α = 20, β = 10−8 , γ = 5.103 . (43)

Solution 3.
1. On subdivise le domaine [a, b] en N sous-intervalles de même longueur
b−a
h= . (44)
N
Les n÷uds du maillage sont notés
xi = a + ih, i = 0, 1, ..., N. (45)
2. En chaque point interne, la dérivée seconde est remplacée par la formule
des diérences nies. Le schéma numérique s'écrit


 u0 = ua



ui−1 −2ui +ui+1
h2 − βu4i − αui + γ = 0, i = 1, 2, ..., N − 1, (46)




uN = ub

ou encore


 u0 − ua = 0



ηui−1 + σui − βu4i + ηui+1 + γ = 0, i = 1, 2, ..., N − 1, (47)




uN − ub = 0

12

1 2
η= , σ = −α − (48)
h2 h2
3. Le schéma numérique est équivalent au système non-linéaire suivant :
f (u) = 0, (49)

où u = (u , u , ..., u et avec
 
T
0 1 N) f (u) = fi (u)
i=0,1,...,N

f0 (u) = u0 − ua
f1 (u) = ηu0 + σu1 − βu41 + ηu2 + γ

.. .. ..
f2 (u) = ηu1 + σu2 − βu42 + ηu3 + γ

(50)
.. .. ..
f (u)
i = ηu i−1 + σui − βu4i + ηui+1 + γ

fN −1 (u) = ηuN −2 + σuN −1 − βu4N −1 + ηuN + γ


fN (u) = uN − ub
On résout le système non linéaire en utilisant la méthode de Newton-
Raphson. Pour cela, on écrit d'abord le système ci-dessous sous la forme

 J(f )(uk )ck = −f (xk )
(51)
uk+1 = uk + ck

 ∂f0 ∂f0 ∂f0 ∂f0 


∂u0 ∂u1 ∂u2 ... ∂uN
 
 ∂f ∂f1 ∂f1 ∂f1

1

 ∂u0 ∂u1 ∂u2 ... ∂uN


 
 
 ∂f2 ∂f2 ∂f2
... ∂f2 
 ∂u0 ∂u1 ∂u2 ∂uN 

.. .. .. .. .. (52)
 
J(f )(u) = 



 
 
 
 
 ∂fN −1 ∂fN −1 ∂fN −1 ∂fN −1 

 ∂u0 ∂u1 ∂u2 ... ∂uN 

 
∂fN ∂fN ∂fN ∂fN
∂u0 ∂u1 ∂u2 ... ∂uN

13
1 0 0 ··· ··· ··· 0
 

.. 
 


η σ1 η 0

.. 
 
 


0 η σ2 η 0

.. . . . . . . . . . . . . .
 
. . . . 
 

J(f )(u) =  (53)

 
..
 
 
 

 0 η σ N −2 η 0

..
 
 
 

 0 η σN −1 η

 
0 ··· ··· ··· 0 0 1
σi = σ − 4u3i
La valeur initiale est arbitrairement sélectionnée à
u01 = u02 = ... = u0N = 400.
On choisit un nombre maximal d'itérations égal à 10.
itération :10

u =

500.
400.00026
399.99987
399.99987
399.99987
399.99987
399.99987
399.99987
399.99987
399.99968
350.
Le script suivant utilise la méthode de Newton pour estimer la solution sur
les n÷uds internes.
Code Scilab 2 (Résolution du problème non linéaire).
// domaine
a = 1;
b = 2;

14
// conditions aux bords
ua = 500;
ub = 350;

// paramètres
alpha = 20;
beta = 10^-8;
gamma = 5*10^3;
niter = 10; // nombre d'itérations

// maillage
N = 10;
h = (b-a)/N;

x = a:h:b;
x = x';

eta = 1/h^2;
sigma = -alpha-2/h^2;

// fonction f

function res=f(u)
res = zeros(N+1,1);
res(1) = u(1)-ua;
res(N+1) = u(N+1)-ub;

for n=2:N
res(n) = eta*u(n-1)+sigma*u(n);
res(n) = res(n) - beta*u(n)^4;
res(n) = res(n) + eta*u(n+1);
res(n) = res(n) + gamma;
end

endfunction

// matrice jacobienne de f, J(f)(u)

function res=Jf(u)

res = zeros(N+1,N+1);
res(1,1) = 1;
res(N+1,N+1) = 1;

for i=2:N

15
res(i,i-1) = eta;
res(i,i) = sigma-4*u(i)^3;
res(i,i+1) = eta;
end

endfunction

// initialisation
u = 400*ones(N+1,1);

// itérations

for iter=1:niter
c = Jf(u)\(-f(u));
u = u + c;
disp(' itération :'+string(iter));
disp(' u = ');
disp(u);
end

plot2d(x,u)

5 Equation de diusion
L'équation de diusion est utilisée pour modéliser les processus de diusion,
comme la diusion de la température et dans quelques cas le transfert de masses.
On recherche une fonction u(x, t) telle que


 ut = auxx + f (x, t), 0 < x < 1, t > 0
u(0, t) = g0 (t), t > 0

(54)

 u(1, t) = g1 (t), t > 0
u(x, 0) = u0 (x), 0 ≤ x ≤ 1,

g0 et g1 sont les conditions aux bords, f est le terme source et u0 la condition


initiale.

5.1 La méthode d'Euler explicite


On commence par une discrétisation de la variable spatiale

0 = x0 < x1 < · · · < xN −1 < xN = 1 ; (55)


et on suppose que le maillage est uniforme : xk − xk−1 = h pour tout k . On
dénit le pas de temps ∆t > 0, et les n÷uds tn = n∆t pour tout n ≥ 0. En tout
point de la grille, on construit les approximations des dérivées partielles :

16
Si u est de classe C 2 par rapport à la variable t, la formule de Taylor sécrit

∂u(x, t) ∆t2 ∂ 2 u(θ, t)


u(x, t + ∆t) = u(x, t) + ∆t + , (56)
∂t 2 ∂t2
où θ ∈ [t, t + ∆t]. On en déduit

∂u(x, t) u(x, t + ∆t) − u(x, t) 1 ∂ 2 u(x, θ)


= − ∆t , (57)
∂t ∆t 2 ∂t2
Si u est de classe C 4 par rapport à la variable x, les formules de Taylor
sécrivent

∂u(x, t) h2 ∂ 2 u(x, t) h3 ∂ 3 u(x, t) h4 ∂ 4 u(x, η1 )


u(x + h, t) = u(x, t) + h + + + ,
∂x 2 ∂x2 6 ∂x3 24 ∂x4
(58)
et

∂u(x, t) h2 ∂ 2 u(x, t) h3 ∂ 3 u(x, t) h4 ∂ 4 u(x, η2 )


u(x − h, t) = u(x, t) − h + − + ,
∂x 2 ∂x2 6 ∂x3 24 ∂x4
(59)
où η1 ∈ [x, x + h] et η2 ∈ [x − h, x]. La somme des deux dernières équations
s'écrit

∂ 2 u(x, t) h4  ∂ 4 u(x, η2 ) ∂ 4 u(x, η2 ) 


u(x − h, t) + u(x + h, t) = 2u(x, t) + h2 + + ,
∂x2 24 ∂x4 ∂x4
(60)
On en déduit

∂ 2 u(x, t) u(x − h, t) − 2u(x, t) + u(x + h, t) 1 2 ∂ 4 u(η, t)


= + h , (61)
∂x2 h2 12 ∂x4
où θ ∈ [t, t + ∆t] et η ∈ [x − h, x + h]. On remplace ensuite dans l'équation
4
∂u
∂t et ∂∂xu4 en utilisant les formules (57) et (61) et on obtient

 
u(x, t + ∆t) − u(x, t) u(x − h, t) − 2u(x, t) + u(x + h, t)
=a +f (x, t)+TE (x, t),
∆t h2
(62)
où l'erreur de troncature (ou de consistance) est

1 ∂ 2 u(x, θ) 1 2 ∂ 4 u(η, t)
TE (x, t) =
∆t + h . (63)
2 ∂t2 12 ∂x4
On dénit maintenant la solution uh,∆t (x, t) sur les n÷uds en négligeant
l'erreur de troncature de (62) et en remplaçant u(xi , tn ) avec uni = uh,∆t (xi , tn ).
On obtient

17
un+1
 n
− uni − 2uni + uni+1

u
i
= a i−1 + f (xi , tn ), (64)
∆t h2
(pour i = 1, · · · , N − 1 et n ≥ 0 ) qui peut se simplier comme suit

 
un+1
i = uni + a∆t
h2
n n n
ui−1 − 2ui + ui+1 + ∆tf (xi , tn )
(65)
= cf l ∗ uni−1 + (1 − 2 ∗ cf l) ∗ uni + cf l ∗ uni+1 + ∆tf (xi , tn ),

où cf l = a∆t
h2 . On appelle ce schéma, le schéma d'Euler explicite car la valeur
de la solution au temps tn+1 s'exprime explicitement en fonction de la solution
au temps tn .

18
Exemple 4. On considère le problème (54) avec les paramètres suivants :
a = π −2 , u0 (x) = sin(πx) + sin(2πx), g0 = g1 = 0, f (x, t) = 0, (66)

pour lesquels la solution exacte est


u(x, t) = e−t sin(πx) + e−4t sin(2πx). (67)
1. La Figure 3 montre le prol de la solution exacte et la solution numérique,
au temps t = 1 lorsque
h = 1/16, ∆t = 1/64. (68)
La Figure 4 montrer le prol de l'erreur au temps t = 1.
2. La Figure 5 montre le prol de la solution exacte et la solution numérique,
au temps t = 1 lorsque
h = 1/32, ∆t = 1/128. (69)
La Figure 6 montrer le prol de l'erreur au temps t = 1.

19
Figure 3  La solution en t = 1, pour l'Exemple 4 ; Euler explicite h = 1/16,
∆t = 1/64

Figure 4  L'erreur en t = 1, pour l'Exemple 4 ; Euler explicite h = 1/16,


∆t = 1/64

20
Figure 5  La solution en t = 1, pour l'Exemple 4 ; Euler explicite h = 1/32,
∆t = 1/128

Figure 6  L'erreur en t = 1, pour l'Exemple 4 ; Euler explicite h = 1/32,


∆t = 1/128

21
Code Scilab 3 (Equation de diusion - Euler explicite).
// données
a = %pi^-2;
deff('y=u0(x)','y=sin(%pi*x)+sin(2*%pi*x)');
deff('y=uexacte(x,t)','y=exp(-t)*sin(%pi*x)+exp(-4*t)*sin(2*%pi*x)');
deff('y=f(x,t)','y=zeros(x)');
deff('y=g0(t)','y=0');
deff('y=g1(t)','y=0');

// maillage
xmin = 0;
xmax = 1;
nx = 32;
h = (xmax-xmin)/nx;
x = xmin:h:xmax;
x = x';

tmin = 0;
tmax = 1;
nt = 128;
dt = (tmax-tmin)/nt;
t = tmin:dt:tmax;
t = t';

cfl = a*dt/h^2;

// initialisation u^0
u = zeros(nx+1,nt+1);
e = zeros(nx+1,nt+1);
u(:,1) = u0(x);
e(:,1) = zeros(x);

// calcul de u^1, u^2, ..., u^{nt}

for n = 1:nt

// noeuds internes
umoins = u(1:nx-1,n);
ucentr = u(2:nx ,n);
uplus = u(3:nx+1,n);

u(2:nx,n+1) = (1-2*cfl)*ucentr + cfl*(umoins+uplus);


u(2:nx,n+1) = u(2:nx,n+1) + dt*f(x(2:nx),t(n));

// conditions aux bords

22
u(1 ,n+1) = g0(t(n+1));
u(nx+1,n+1) = g1(t(n+1));

// erreur
e(:,n+1) = abs(uexacte(x,t(n+1))-u(:,n+1));

end

// visualisation

for n = 1:nt+1
clf()
plot2d(x,[u(:,n) uexacte(x,t(n))],rect=[min(x) min(u) max(x) max(u)]);
legend(['solution numérique';'solution exacte']);
title("solution au temps = "+string(t(n)));
xpause(100000);
end

// visualisation erreur
for n = 1:nt+1
clf()
plot2d(x,e(:,n),rect=[min(x) min(e) max(x) max(e)]);
title("erreur au temps = "+string(t(n)));
xpause(100000);
end

La méthode d'Euler explicite nécessite que le pas de temps soit susamment


petit pour que le calcul soit stable et précis. Le résultat de stabilité est le suivant.
Théoreme 1. Soit u ∈ C (Q), pour Q = {(x, t) | 0 ≤ x ≤ 1,
4,2
0 < t ≤ T}
pour T > 0. Si h et ∆t sont tels que
h2
∆t ≤ (70)
2a
(ou cf l ≤ ), alors il existe une constante C > 0, indépendante de h et ∆t,
1

telle que 2

max u(xi , tn ) − uh,∆t (xi , tn ) ≤ max u0 (xi ) − uh,∆t (xi , 0) + Ch2 M, (71)
(xi ,tn ) xi

avec
n o
M = max uxxxx (x, t) , utt (x, t) . (72)
(x,t)∈Q

La condition (70) est appelée condition stabilité


, car elle est une condition
nécessaire et susante pour s'assurer que la solution numérique "n'explose pas"

23
au cours des calculs. On peut montrer que si une méthode numérique pour
l'approximation de la solution du problème de diusion est stable et possède une
erreur de troncature qui tend vers 0 lorsque les paramètres h et ∆t tendent vers
0, donc les solutions approchées tendent vers la solution exacte. Il faudra noter
que la condition (70) requiert l'utilisation d'un pas de temps susamment petit.
Cela est considéré comme une restriction en pratique, quoique la simplicité de
la méthode d'Euler explicite la rend attractive pour les problèmes non linéaires
et les problèmes en dimension spatiale supérieure à 1.

5.2 La méthode d'Euler implicite


La restriction sur le pas de temps du schéma d'Euler explicite peut être
évitée en utilisant des formules de diérences nies un peu diérentes dans
l'approximations des dérivées partielles. Si on utilise

∂u(x, t + ∆t) u(x, t + ∆t) − u(x, t) 1 ∂ 2 u(x, θ)


= + ∆t , (73)
∂t ∆t 2 ∂t2

∂ 2 u(x, t + ∆t) u(x − h, t + ∆t) − 2u(x, t + ∆t) + u(x + h, t + ∆t)


=
∂x2 h2
1 ∂ 4 u(η, t + ∆t)
+ h2 , (74)
12 ∂x4
où θ ∈ [t, t + ∆t] et η ∈ [xi−1 , xi+1 ], alors le schéma numérique devient
a∆t  n+1 
un+1
i − ui−1 − 2un+1
i + un+1
i+1 = uni + ∆tf (xi , tn+1 ), (75)
h2
(i = 1, · · · , N − 1 et n ≥ 0). Le schéma numérique est équivalent au système
linéaire suivant :

un+1 un+1
      n 
1 2 −1 0 ··· 0 0 1 u1
 un+1
2
 −1 2 −1 0 ··· 0   un+1
2
  un2 
 ..  a∆t  .. ..  ..   .. 
      
 . + 2  . ... . .  =  . 
 n+1  h     
u
N −2
 0 ··· 0 −1 2 −1 un+1
N −2
 un 
N −2
un+1
N −1
0 0 0 0 −1 2 un+1 unN −1
| {z } | {z } | N{z−1 } | {z }
un+1 K un
h,∆t
un
h,∆t
h,∆t

f (x1 , tn+1 ) + ha2 g0 (tn+1 )


 
 f (x2 , tn+1 ) 
..
 
+ ∆t  .  (76)
 
 
 f (xN −2 , tn+1 ) 
a
f (xN −1 , tn+1 ) + h2 g1 (tn+1 )
| {z }
F n+1

24
C'est un système tridiagonal de N − 1 équations à N − 1 inconnues de la
forme
 a∆t  n+1
I+ K uh,∆t = unh,∆t + ∆tF n+1 . (77)
h2
De plus, la méthode est inconditionnellement stable ; c'est-à-dire qu'elle est
stable pour toutes les valeurs de ∆t. Le problème est qu'il est d'ordre 1 en temps.
Théoreme 2. Pour le schéma d'Euler implicite (75), il existe une constante
C>0 , indépendante de h et ∆t, telle que
max u(xi , tn ) − uh,∆t (xi , tn ) ≤ max u0 (xi ) − uh,∆t (xi , 0) + C(h2 + ∆t)M,
(xi ,tn ) xi
(78)
avec
n o
M = max uxxxx (x, t) , utt (x, t) . (79)
(x,t)∈Q

La méthode d'Euler implicite est inconditionnellement stable


parce qu'il
n'existe pas de condition sur les pas h et ∆t pour que la solution approchée
soit bornée et précise. Le problème avec cette méthode, cependant, est qu'il
est de O(∆t + h2 ) en précision ; la méthode d'Euler explicite est de O(h2 ),
quoiqu'elle requiert ∆t = O(h2 ) pour être stable. Pour comparer, on considère
l'Exemple 4 pour lequel on a utilisé la méthode d'Euler implicite. Si on utilise la
maillage (h = 1/16, ∆t = 1/64), on obtient la courbe d'erreur de la Figure (7) ;
de plus, si nous prenons un pas de temps plus grand, la solution reste stable. Si
nous utilisons h = 1/32, ∆t = 1/128, on obtient le prol d'erreur dans la Figure
8, on rappelle l'approximation d'Euler explicite "explose" dans ce cas.

25
Figure 7  L'erreur en t = 1, pour l'Exemple 4 ; Euler implicite h = 1/16,
∆t = 1/64

Figure 8  L'erreur en t = 1, pour l'Exemple 4 ; Euler implicite h = 1/32,


∆t = 1/128

26
Code Scilab 4 (Equation de diusion - Euler implicite).
clear
// données
a = %pi^-2;
deff('y=u0(x)','y=sin(%pi*x)+sin(2*%pi*x)');
deff('y=uexacte(x,t)','y=exp(-t)*sin(%pi*x)+exp(-4*t)*sin(2*%pi*x)');
deff('y=f(x,t)','y=zeros(x)');
deff('y=g0(t)','y=0');
deff('y=g1(t)','y=0');

// maillage
xmin = 0;
xmax = 1;
nx = 16;
h = (xmax-xmin)/nx;
x = xmin:h:xmax;
x = x';

tmin = 0;
tmax = 1;
nt = 64;
dt = (tmax-tmin)/nt;
t = tmin:dt:tmax;
t = t';

cfl = a*dt/h^2;

// matrices

I = eye(nx-1,nx-1);
K = 2*I;
K = K - diag(ones(nx-2,1),-1);
K = K - diag(ones(nx-2,1), 1);
A = I + cfl*K;

// initialisation u^0
u = zeros(nx+1,nt+1);
e = zeros(nx+1,nt+1);
u(:,1) = u0(x);
e(:,1) = zeros(x);

// calcul de u^1, u^2, ..., u^{nt}

for n = 1:nt

27
// noeuds internes
F = f(x(2:nx),t(n+1));
F(1) = F(1) + (a/h^2)*g0(t(n+1));
F(nx-1) = F(nx-1) + (a/h^2)*g1(t(n+1));

uold = u(2:nx,n);

u(2:nx,n+1) = A\(uold+dt*F);

// conditions aux bords


u(1 ,n+1) = g0(t(n+1));
u(nx+1,n+1) = g1(t(n+1));

// erreur
e(:,n+1) = abs(uexacte(x,t(n+1))-u(:,n+1));

end

// visualisation

for n = 1:nt+1
clf()
plot2d(x,[u(:,n) uexacte(x,t(n))],rect=[min(x) min(u) max(x) max(u)]);
legend(['solution numérique';'solution exacte']);
title("solution au temps = "+string(t(n)));
xpause(100000);
end

// visualisation erreur
for n = 1:nt+1
clf()
plot2d(x,e(:,n),rect=[min(x) min(e) max(x) max(e)]);
title("erreur au temps = "+string(t(n)));
xpause(100000);
end

5.3 La méthode de Crank-Nicolson


Il existe plusieurs méthodes pour dériver le schéma de Crank-Nicolson. Peut
être, la meilleure méthode pour "résoudre" l'EDP est en l'intégrant en temps
Z ∆t  
u(x, t + ∆t) − u(x, t) = auxx (x, s) + f (x, s) ds, (80)
t
et on utilise la méthode du trapèze pour l'approximation de l'intégrale :

28
 
1
u(x, t + ∆t) − u(x, t) = 2 ∆ta uxx (x, t) + uxx (x, t + ∆t)
 
+ 12 ∆t f (x, t) + f (x, t + ∆t) (81)
 
1
− 12 ∆t3 uxxtt (x, θt ) + ftt (x, ηt ) .

Ensuite, on remplace les dérivées partielles par les quotients aux diérences
nies, on obtient l'expression suivante :

 
1 u(x−h,t)−2u(x,t)+u(x+h,t)
u(x, t + ∆t) − u(x, t) = 2 ∆ta h2

 
u(x−h,t+∆t)−2u(x,t+∆t)+u(x+h,t+∆t)
+ 12 ∆ta h2

 
+ 12 ∆t f (x, t) + f (x, t + ∆t)
 
1 2
+ 24 h ∆ta uxxxx (η1 , t + ∆t) + uxxxx (η0 , t)
 
1
− 12 ∆t3 uxxtt (x, θt ) + ftt (x, ηt ) ,
(82)
où ηt ∈ [t, t + h], θt ∈ [t, t + h], η0 ∈ [x − h, x + h], et η1 ∈ [x − h, x + h].
Finalement, on en déduit le schéma numérique suivant :

   
un+1
i − µ un+1 n+1
i−1 − 2ui + un+1
i+1 = uni + µ uni−1 − 2uni + uni+1
 
+ 12 ∆t f (xi , tn ) + f (xi , tn+1 ) ,
(83)
où uni = uh,∆t (xi , tn ) ≃ u(xi , tn ) est la solution approchée et µ = 21 a∆th−2 .
C'est encore un système à N − 1 équations et N − 1 inconnues. Le schéma
estinconditionnellement stable et il est du second ordre au temps et en espace,
comme nous allons le voir. On peut réécrire le système (83) sous forme matricielle
comme suit
1
(I + µK)un+1 n n n
h,∆t = (I − µK)uh,∆t + ∆tF + G , (84)
2

29
   
f (x1 , tn ) + f (x1 , tn+1 ) µ g0 (tn ) + g0 (tn+1 )
 f (x2 , tn ) + f (x2 , tn+1 )
  0 
.. .
   
n
F =

., ,
 n
G =
 .. .

   
f (xN −2 , tn ) + f (xN −2 , tn+1 )  0 

f (xN −1 , tn ) + f (xN −1 , tn+1 ) µ g1 (tn ) + g1 (tn+1 )
(85)
Théoreme 3. Le schéma de Crank-Nicolson est inconditionnellement stable et
du second ordre en espace et en temps, en ce sens que
−1 
 NX 2 1/2 −1 
 NX 2 1/2
u(xi , tn )−uh,∆t (xi , tn ) ≤ C0n u(xi , 0)−uh,∆t (xi , 0)
i=1 i=1
+ C1 (h2 + ∆t2 )M, (86)

où C et C sont positifs et indépendants de h et ∆t, C , et M dépend


des dérivées partielles u , u , et f .
0 1 0 <1
xxxx xxtt tt
Pour illustrer l'augmentation de la précision, on considère l'exemple utilisé
pour tester les méthodes d'Euler explicite et implicite. Si nous utilisons le schéma
de Crank-Nicolson, nous obtenons une meilleure approximation aussi bien pour
h = 1/16, ∆t = 1/64 que pour h = 1/32, ∆t = 1/128 comme illustré par les
Figures 9, 10 et le Tableau 1.

Euler explicite Euler implicite Crank-Nicolson


h = 1/16, ∆t = 1/64 2.8 × 10−3 6.5 × 10−3 1.9 × 10−3
h = 1/32, ∆t = 1/128 4.5 × 1027 2.8 × 10−3 4.5 × 10−4

Table 1  Le pic de l'erreur absolue de l'Exemple 4 au temps t = 1

30
Figure 9  L'erreur en t = 1, pour l'Exemple 4 ; Crank-Nicolson h = 1/16,
∆t = 1/64

Figure 10  L'erreur en t = 1, pour l'Exemple 4 ; Crank-Nicolson h = 1/32,


∆t = 1/128

31
Code Scilab 5 (Equation de diusion - Crank-Nicolson).
clear
// données
a = %pi^-2;
deff('y=u0(x)','y=sin(%pi*x)+sin(2*%pi*x)');
deff('y=uexacte(x,t)','y=exp(-t)*sin(%pi*x)+exp(-4*t)*sin(2*%pi*x)');
deff('y=f(x,t)','y=zeros(x)');
deff('y=g0(t)','y=0');
deff('y=g1(t)','y=0');

// maillage
xmin = 0;
xmax = 1;
nx = 32;
h = (xmax-xmin)/nx;
x = xmin:h:xmax;
x = x';

tmin = 0;
tmax = 1;
nt = 128;
dt = (tmax-tmin)/nt;
t = tmin:dt:tmax;
t = t';

mu = 0.5*a*dt/h^2;

// matrices

I = eye(nx-1,nx-1);
K = 2*I;
K = K - diag(ones(nx-2,1),-1);
K = K - diag(ones(nx-2,1), 1);
A = I + mu*K;
B = I - mu*K;

// initialisation u^0
u = zeros(nx+1,nt+1);
e = zeros(nx+1,nt+1);
u(:,1) = u0(x);
e(:,1) = zeros(x);

// calcul de u^1, u^2, ..., u^{nt}

for n = 1:nt

32
// noeuds internes
F = f(x(2:nx),t(n));
F = F + f(x(2:nx),t(n+1));
F = 0.5*dt*F;

F(1) = F(1) + mu*g0(t(n));


F(nx-1) = F(nx-1) + mu*g1(t(n));

F(1) = F(1) + mu*g0(t(n+1));


F(nx-1) = F(nx-1) + mu*g1(t(n+1));

uold = u(2:nx,n);

u(2:nx,n+1) = A\(B*uold+F);

// conditions aux bords


u(1 ,n+1) = g0(t(n+1));
u(nx+1,n+1) = g1(t(n+1));

// erreur
e(:,n+1) = abs(uexacte(x,t(n+1))-u(:,n+1));

end

// visualisation

for n = 1:nt+1
clf()
plot2d(x,[u(:,n) uexacte(x,t(n))],rect=[min(x) min(u) max(x) max(u)]);
legend(['solution numérique';'solution exacte']);
title("solution au temps = "+string(t(n)));
xpause(100000);
end

// visualisation erreur
for n = 1:nt+1
clf()
plot2d(x,e(:,n),rect=[min(x) min(e) max(x) max(e)]);
title("erreur au temps = "+string(t(n)));
xpause(100000);
end

33
6 Equation des ondes
L'équation des ondes décrit les phénomènes vibratoires et spécialement la
propagation des ondes. L'équation des ondes en une dimenion (en espace) 'écrit

∂2u 2
2∂ u
= c , a < x < b, t > 0. (87)
∂t2 ∂x2
La solution de l'équation doit satisfaire les conditions aux bords sur la fron-
tière du domaine

u(a, t) = ua (t), u(b, t) = ub (t), (88)


ainsi que des conditions initiales au temps t = 0

∂u(x, t = 0) ′
u(x, t = 0) = i0 (x), = i0 (x). (89)
∂t
Puisque le problème est du second ordre en temps, les conditions initiales
doivent inclure la vitesse initiale ∂u(x,0)
∂t et le déplacement initial u(x, 0) en tous
les points du domaine géométrique.

6.1 La méthode d'Euler explicite centrée


On peut résoudre l'équation (87) en remplaçant les dérivées partielles par
les formules de diérences nies :

∂ 2 u(x, t) u(x, t − ∆t) − 2u(x, t) + u(x, t + ∆t) 1 ∂ 4 u(x, θ)


2
= 2
+ ∆t2 (90)
∂t ∆t 12 ∂t4
et

∂ 2 u(x, t) u(x − h, t) − 2u(x, t) + u(x + h, t) 1 2 ∂ 4 u(η, t)


= + h (91)
∂x2 h2 12 ∂x4
où θ ∈ [t − ∆t, t + ∆t] et η ∈ [x − h, x + h]. On remplace dans l'équation (87)
en utilisant les formules (90) et (91) et on obtient

u(x, t − ∆t) − 2u(x, t) + u(x, t + ∆t) u(x − h, t) − 2u(x, t) + u(x + h, t)


= c2 +TE (x, t),
∆t2 h2
(92)
où l'erreur de consistance est

1 ∂ 4 u(x, θ) 1 2 ∂ 4 u(η, t)
TE (x, t) = −∆t2 + h . (93)
12 ∂t4 12 ∂x4
En agissant ainsi, on obtient le schéma numérique suivant

un+1 − 2uni + uin−1 n n n


2 ui−1 − 2ui + ui+1
i
= c (94)
(∆t)2 h2

34
pour i = 2, · · · , N − 1 et n = 1, 2, .... On montre ainsi que l'ordre de consis-
tance est de O(h2 + ∆t2 ). Si les conditions aux bords comportent des dérivées,
on les discrétise en utilisant les formules de diérences centrées, comme nous
avons l'habitude de le faire. Si nous exprimons la solution au temps courant
tn+1 , on obtient

un+1
i = −uin−1 + α(uni−1 + uni+1 ) + 2(1 − α)uni , (95)
2
avec α = c2 dth2 . Ce schéma nous permet de calculer la solution aux temps t2 ,
t3 , ..., tM . On peut obtenir u−1
i ≃ u(xi , −∆t) n'est pas connu, on peut obtenir
u1i à partir de la formule (95)

u1i = −u−1 0 0 0
i + α(ui−1 + ui+1 ) + 2(1 − α)ui , (96)
Ainsi, on approxime la condition initiale sur la dérivée en temps par la for-
mule de diérences centrée comme suit

u1i − u−1 ′
i
= i0 (xi ), (97)
2∆t
et on peut l'utiliser pour remplacer u−1
i dans l'équation (95)

u1i = −(u1i − 2i0 (xi )∆t) + α(u0i−1 + u0i+1 ) + 2(1 − α)u0i , (98)
pour obtenir
α 0 ′
(ui−1 + u0i+1 ) + (1 − α)u0i + i0 (xi )∆t
u1i = (99)
2
La solution au temps t0 est obtenu à partir de la condition initial sur le
déplacement

u0i = i0 (xi ). (100)

Stabilité Le schéma d'Euler explicite (94) est stable sous la condition

dt2
c2 ≤ 1. (101)
h2

35
On applique la méthodologie de résolution de l'équation des ondes dans
l'exemple suivant.
Exemple 5 (Equation des ondes). On considère l'équation suivante :
∂ 2 u(x, t) 2
2 ∂ u(x, t)
= c , 0 < x < 2, 0<t≤8 (102)
∂t2 ∂x2
où c = 1, avec les conditions initiales
∂u(x, 0)
u(x, 0) = x(1 − x), = 0, (103)
∂t
et les conditions aux bords
u(0, t) = 0, u(2, t) = 0. (104)
On construit le programme Scilab suivant pour résoudre l'équation de l'Exemple
5, obtenir le résultat de la Figure ??, et observer la dynamique de la solution.
Code Scilab 6 (Equation des ondes).
// données
c = 1;
deff('y=i0(x)','y=x.*(1-x)');
deff('y=i0prim(x)','y=zeros(x)');
deff('y=ua(t)','y=0');
deff('y=ub(t)','y=0');

// maillage
xmin = 0;
xmax = 2;
nx = 100;
h = (xmax-xmin)/nx;
x = xmin:h:xmax;
x = x';

cfl = 0.5;

tmin = 0;
tmax = 8;
dt = cfl*h/c;
t = tmin:dt:tmax;
t = t';
nt = length(t);

// initialisation u^0
u = zeros(nx+1,nt);
u(:,1) = i0(x);

36
// calcul de u^1,

alpha = cfl^2;

umoins = u(1:nx-1,1);
ucentr = u(2:nx ,1);
uplus = u(3:nx+1,1);

u(2:nx,2) = 0.5*alpha*(umoins+uplus);
u(2:nx,2) = u(2:nx,2) + (1-alpha)*ucentr;
u(2:nx,2) = u(2:nx,2) + dt*i0prim(x(2:nx));

// calcul de u^2, ..., u^{nt}

for n = 2:nt-1

// noeuds internes
umoins = u(1:nx-1,n);
ucentr = u(2:nx ,n);
uplus = u(3:nx+1,n);

u(2:nx,n+1) = - u(2:nx,n-1);
u(2:nx,n+1) = u(2:nx,n+1) + alpha*(umoins+uplus);
u(2:nx,n+1) = u(2:nx,n+1) + 2*(1-alpha)*ucentr;

// conditions aux bords


u(1 ,n+1) = ua(t(n+1));
u(nx+1,n+1) = ub(t(n+1));

end

// visualisation

for n = 1:nt
clf()
plot2d(x,u(:,n),rect=[min(x) min(u) max(x) max(u)]);
title("solution au temps = "+string(t(n)));
xpause(100000);
end

37
7 Equation d'advection
On considère l'équation d'advection

 ut + aux = 0, 0 < x < 1, t>0
(105)
u(0, x) = u0 (x),

avec a > 0. La solution est une onde qui se propage vers la droite si a > 0 et
vers la gauche si a < 0. On remplace ut par la formule de diérences nies avant
en temps et ux par la diérence nie arrière en espace pour obtenir le schéma
explicite

un+1 − uni un − uni−1


i
+a i =0
∆t h
a∆t n
⇒ un+1
i = uni + (ui − uni−1 ), i = 1, 2, ..., N. (106)
h

Consistance Le schéma explicite est du premier ordre en temps et en espace,


i.e

u(xi , tn+1 ) − u(xi , tn ) u(xi , tn ) − u(xi−1 , tn )


+a = O(∆t, h) (107)
∆t h

Stabilité La condition nécessaire de stabilité est

|a|∆t
cf l =≤ 1. (108)
h
Elle n'est pas une condition susante.
On illustre l'utilisation du schéma explicite pour la résolution de l'équation
d'advection d'une courbe gaussienne se déplaçant vers la droite.
Exemple 6 (Advection). Le domaine spatial x ∈ [0, 1] est discrétisé en utilisant
101 n÷uds, ainsi le pas d'espace est de h = 0.01. La solution exacte est dénie
par

U (x, t) = exp − 200 × (x − xc − at)2 , (109)

où x = 0.25 est le centre de la courbe au temps initial t = 0. Des conditions


aux bords de transmission sont utilisées aux bords du domaine, i.e
c

u0 = u2 , uN = uN −2 , (110)
La vitesse est de a = 1 m/s. La solution calculée et la solution exacte sont
montrées par la Figure 11. On observe une décroissance de l'amplitude de la so-
lution numérique. C'est le phénomène de dissipation numérique, caractéristique
des méthodes du premier ordre (consistantes d'ordre 1).
38
Figure 11  Solution de l'équation d'advection pour cf l = 0.5

Code Scilab 7 (Advection - Euler explicite - Arrière en espace).


clear
// données
a = 1;
xc = 0.25;
deff('y=u0(x)','y=exp(-200*(x-xc)^2)');
deff('y=uexacte(x,t)','y=exp(-200*(x-xc-a*t)^2)');

// maillage
xmin = 0;
xmax = 1;
nx = 100;
h = (xmax-xmin)/nx;
x = xmin:h:xmax;
x = x';

tmin = 0;
tmax = 0.5;
cfl = 1.2;
dt = cfl*h/abs(a);
t = tmin:dt:tmax;
t = t';
nt = length(t);

// initialisation u^0
u = zeros(nx+1,nt+1);

39
u(:,1) = u0(x);

// calcul de u^1, u^2, ..., u^{nt}


for n = 1:nt
// noeuds internes
umoins = u(1:nx-1,n);
ucentr = u(2:nx ,n);

u(2:nx,n+1) = ucentr;
u(2:nx,n+1) = u(2:nx,n+1) - a*(dt/h)*(ucentr-umoins);

// conditions aux bords


u(1 ,n+1) = u(3,n+1);
u(nx+1,n+1) = u(nx-1,n+1);
end

// visualisation

errmax = 0;

for n = 1:nt
clf()
err = abs(u(:,n)-uexacte(x,t(n)));
err = max(err);
errmax = max([errmax,err]);
//plot2d(x,[u(:,n) uexacte(x,t(n))],rect=[min(x) min(u) max(x) max(u)]);
plot2d(x,[u(:,n) uexacte(x,t(n))]);
legend(['solution numérique';'solution exacte']);
title("solution au temps = "+string(t(n)));
xpause(100000);
end

// Erreur maximale
disp(' Erreur maximale = '+string(errmax));

Lorsque a < 0, on remplace ut par la formule de diérences nies avant


en temps et ux par la diérence nie avant en espace pour obtenir le schéma
explicite

un+1 − uni un − uni


i
+ a i+1 =0
∆t h
a∆t n
⇒ un+1
i = uni + (ui+1 − uni ), i = 1, 2, ..., N. (111)
h

40
Code Scilab 8 (Advection - Euler explicite - Avant en espace).
clear
// données
a = -1;
xc = 0.75;
deff('y=u0(x)','y=exp(-200*(x-xc)^2)');
deff('y=uexacte(x,t)','y=exp(-200*(x-xc-a*t)^2)');

// maillage
xmin = 0;
xmax = 1;
nx = 100;
h = (xmax-xmin)/nx;
x = xmin:h:xmax;
x = x';

tmin = 0;
tmax = 0.5;
cfl = 1.2;
dt = cfl*h/abs(a);
t = tmin:dt:tmax;
t = t';
nt = length(t);

// initialisation u^0
u = zeros(nx+1,nt+1);
u(:,1) = u0(x);

// calcul de u^1, u^2, ..., u^{nt}


for n = 1:nt
// noeuds internes
ucentr = u(2:nx ,n);
uplus = u(3:nx+1,n);

u(2:nx,n+1) = ucentr;
u(2:nx,n+1) = u(2:nx,n+1) - a*(dt/h)*(uplus-ucentr);

// conditions aux bords


u(1 ,n+1) = u(3,n+1);
u(nx+1,n+1) = u(nx-1,n+1);
end

// visualisation

errmax = 0;

41
for n = 1:nt
clf()
err = abs(u(:,n)-uexacte(x,t(n)));
err = max(err);
errmax = max([errmax,err]);
//plot2d(x,[u(:,n) uexacte(x,t(n))],rect=[min(x) min(u) max(x) max(u)]);
plot2d(x,[u(:,n) uexacte(x,t(n))]);
legend(['solution numérique';'solution exacte']);
title("solution au temps = "+string(t(n)));
xpause(100000);
end

// Erreur maximale
disp(' Erreur maximale = '+string(errmax));

8 Travaux dirigés
8.1 Problèmes linéaires
Exercices 1. Considérons le problème suivant :
ü + 3u̇ = t, u(0) = 1, u(5) = 2.4.
1. Résoudre en utilisant la méthode des diérences nies (diérences cen-
trées) avec ∆t = 1.
2. Résoudre en utilisant la méthode des diérences nies (diérences cen-
trées) avec ∆t = 0.5. Dans un tableau, comparer avec toutes les solutions
(pour ∆t = 1 et ∆t = 0.5), en t=1, 2, 3 et 4. Inclure aussi dans le tableau
la solution exacte en ces points.
Exercices 2. Considérons le problème suivant :
2
2ü + u̇ + 3u = sin(t/2), u(0) = 1, u(1) = 1.
3
1. Résoudre en utilisant la méthode des diérences nies (diérences cen-
trées) avec ∆t = 0.25.
2. Résoudre en utilisant la méthode des diérences nies (diérences cen-
trées) avec ∆t = 0.125. Dans un tableau, comparer avec toutes les solu-
tions (pour ∆t = 0.25 et ∆t = 0.125), en t=0.25, 0.5 et 0.75. Inclure
aussi dans le tableau la solution exacte en ces points.

42
Exercices 3. Considérons le problème suivant :
′′ ′
2xω + ω = 0, ω(1) = 3, ω(3) = 1.
1. Résoudre en utilisant la méthode des diérences nies (diérences cen-
trées) avec ∆x = 0.5.
2. Résoudre en utilisant la méthode des diérences nies (diérences cen-
trées) avec ∆x = 0.25. Dans un tableau, comparer avec toutes les solu-
tions (pour ∆x = 0.5 et ∆x = 0.25), en t=1.5, 2.0 et 2.5. Inclure aussi
dans le tableau la solution exacte en ces points.
Exercices 4. Considérons le problème suivant :
(2t − 1)ω̈ − 4tω̇ + 4ω = 0, ω(1) = −1, ω(2) = 1.
1. Résoudre en utilisant la méthode des diérences nies (diérences cen-
trées) avec ∆t = 0.25.
2. Résoudre en utilisant la méthode des diérences nies avec ∆t = 0.125.
Dans un tableau, comparer avec toutes les solutions (pour ∆t = 0.25 et
∆t = 0.125), en t=1.25, 1.5 et 1.75. Inclure aussi dans le tableau la
solution exacte en ces points.
8.2 Problèmes non linéaires
Exercices 5. Considérons le problème non linéaire suivant :
uü + u̇2 = 0, u(0) = 2, u(2) = 3.
Résoudre en utilisant la méthode des diérences nies (diérences centrées)
avec ∆t = 0.5. En appliquant la méthode de Newton, xer les valeurs initiales
des inconnues à 2, et utiliser kmax = 20, tol = 10 . −4

Exercices 6. Considérons le problème non linéaire suivant :


2ω̈ − exp(ω) = 0, w(0) = 1, w(2) = 0.
Résoudre en utilisant la méthode des diérences nies (diérences centrées)
avec ∆t = 0.5. En appliquant la méthode de Newton, xer les valeurs initiales
des inconnues à 1, et utiliser kmax = 20, tol = 10 . −4

Exercices 7. Considérons le problème non linéaire suivant :


ü + u2 u̇ = t, u(0) = 1, u(3) = 2.
Résoudre en utilisant la méthode des diérences nies (diérences centrées)
avec ∆t = 0.5. En appliquant la méthode de Newton, xer les valeurs initiales
des inconnues à 1, et utiliser kmax = 20, tol = 10 . −4

43
Exercices 8. Considérons le problème non linéaire suivant :
ÿ + ẏ − 2y 2 = 0, y(0) = 1, y(3) = 2.
Résoudre en utilisant la méthode des diérences nies (diérences centrées)
avec ∆t = 0.5. En appliquant la méthode de Newton, xer les valeurs initiales
des inconnues à 1, et utiliser kmax = 20, tol = 10 . −4

Exercices 9. Considérons le problème non linéaire suivant :


ẍ + tẋ2 + 3t2 x = 0, x(0) = −1, x(1) = 1.
Résoudre en utilisant la méthode des diérences nies (diérences centrées)
avec ∆t = 0.25. En appliquant la méthode de Newton, xer les valeurs initiales
des inconnues à 0.2, et utiliser kmax = 10, tol = 10 . −4

Exercices 10. Considérons le problème non linéaire suivant :


1 5
ω̈ − ω 3 = 0, ω(1) = , ω(3) = .
2 2
1. Résoudre en utilisant la méthode des diérences nies (diérences cen-
trées) avec ∆t = 0.5. En appliquant la méthode de Newton, xer les
valeurs initiales des inconnues à 2, et utiliser kmax = 10, tol = 10 .−4

2. Répéter 1) pour ∆t = 0.25. Comparer les résultats des deux parties dans
un tableau en t=1.5, 2, 2.5.
8.3 Conditions aux bords mixtes
Exercices 11. Considérons le problème suivant :
1
ü − u = exp(−2t/3), u(0) = −1, u̇(0.5) = 1.
3
Résoudre en utilisant la méthode des diérences nies avec ∆t = 0.1. Utili-
ser la formule de diérence centrée pour la dérivée seconde, et une formule de
diérence arrière à trois points pour la dérivée première sur la frontière droite,
qui est aussi du second ordre. Comparer les résultats avec la solution exacte sur
les n÷uds du maillage.
Exercices 12. Considérons le problème suivant :
tÿ + 2ẏ = t exp(−2t), y(2) = −0.8, ẏ(4) = 1.3.
1. Résoudre en utilisant la méthode des diérences nies avec ∆t = 0.5.
Utiliser la formule de diérence centrée pour la dérivée seconde, et une
formule de diérence arrière à trois points pour la dérivée première sur
la frontière droite, qui est aussi du second ordre. Comparer les résultats
avec la solution exacte sur les n÷uds du maillage.

44
2. Répéter 1) pour ∆t = 0.25. Comparer les résultats des deux parties et la
valeur exacte dans un tableau en t=2.5, 3, 3.5.
Exercices 13. Considérons le problème suivant :
tω̈ + ω̇ + t2 = 0, ω(0) = 0, ω̇(1) = 1.
1. Résoudre en utilisant la méthode des diérences nies avec ∆t = 0.25.
Utiliser la formule de diérence centrée pour la dérivée seconde, et une
formule de diérence arrière à trois points pour la dérivée première sur
la frontière droite, qui est aussi du second ordre. Comparer les résultats
avec la solution exacte sur les n÷uds du maillage.
2. Répéter 1) pour ∆t = 0.125. Comparer les résultats des deux parties et
la valeur exacte dans un tableau en t=0.25, 0.5, 0.75.
Exercices 14. Considérons le problème suivant :
ÿ + 2ẏ = 0, ẏ(0) = 0, y(1) = 1.
1. Résoudre en utilisant la méthode des diérences nies avec ∆t = 0.125.
Utiliser la formule de diérence centrée pour la dérivée seconde, et une
formule de diérence avant à trois points pour la dérivée première sur
la frontière gauche, qui est aussi du second ordre. Comparer les résultats
avec la solution exacte sur les n÷uds du maillage.
2. Répéter 1) pour ∆t = 0.0625. Comparer les résultats des deux parties et
la valeur exacte dans un tableau en t=0.25, 0.5, 0.75.
Exercices 15. Considérons le problème suivant :
2ω̈ − exp(ω) = 0, ω̇(0) = 1, ω̇(2) + ω(2) = 0.
Résoudre en utilisant la méthode des diérences nies avec ∆t = 0.5. Utili-
ser la formule de diérence centrée pour la dérivée seconde, et une formule de
diérence avant et arrière à trois points pour la dérivée première respectivement
sur les frontières gauche et droite. Comparer les résultats avec la solution exacte
sur les n÷uds du maillage. Résoudre le système non linéaire avec la méthode de
Newton avec les valeurs initiales xées à 1, kmax = 10 et tol = 10 . −4

Exercices 16. Considérons le problème suivant :


ω̈ − ω̇ 3 = 0, ω(1) = 0, ω̇(2) + ω(2) = 1.
1. Résoudre en utilisant la méthode des diérences nies avec ∆t = 0.25.
Utiliser la formule de diérence centrée pour la dérivée seconde, et une
formule de diérence avant à trois points pour la dérivée première sur la
frontière droite, qui est aussi du second ordre. Résoudre le système non
linéaire avec la méthode de Newton avec les valeurs initiales xées à 1,
kmax = 10 et tol = 10 . −4

2. Répéter 1) pour ∆t = 0.125. Comparer les résultats des deux parties dans
un tableau en t=1.25, 1.5, 1.75.
45
8.4 Equation de diusion
Exercices 17. Ecrire un programme qui utilise la méthode d'Euler explicite
pour résoudre l'équation de diusion


 ut = uxx , t > 0, 0 < x < 1;
u(0, t) = 0 ;

(112)

 u(1, t) = 0 ;
u(x, 0) = sin(πx) ;

qui a une solution exacte


2
u(x, t) = e−π t sin(πx) (113)
(il faudra vérier qu'elle est bien la solution exacte). Utiliser h = 4, 8, 12, 16
−1

et prendre ∆t aussi grand que possible pour maintenir la stabilité. Conrmer que
la solution approximative est aussi précise que la théorie l'a prédite. Calculer la
solution au temps t = 1.
Exercices 18. Reprendre l'Exercice 17, mais dans ce cas choisir ∆t, 10% plus
grand que la limite xée par la condition de stabilité, et calculer la solution au
temps t = 1. Commenter les résultats.
Exercices 19. Appliquer la méthode de Crank-Nicolson à l'équation de l'Exer-
cice 17. Pour chaque valeur de h, ajuster le choix de ∆t pour obtenir une préci-
sion comparable aux résultats de l'Exercice 17. Commenter les résultats. Essayer
d'estimer le nombre d'itérations nécessaire pour chaque calcul.
Exercices 20. Ecrire un programme qui utilise la méthode d'Euler explicite
pour résoudre l'équation de diusion


 ut = uxx , t > 0, 0 < x < 1;
 u(0, t) = 0 ;
2 (114)

 u(1, t) = e−π t/4 ;
u(x, 0) = sin(πx/2) ;

qui a une solution exacte


2
u(x, t) = e−π t sin(πx) (115)
(il faudra vérier qu'elle est bien la solution exacte). Utiliser h = 4, 8, 12, 16
−1

et prendre ∆t aussi grand que possible pour maintenir la stabilité. Conrmer que
la solution approximative est aussi précise que la théorie l'a prédite. Calculer la
solution au temps t = 1.
Exercices 21. Modier les 3 algorithmes pour l'équation de diusion pour in-
tégrer les conditions aux bords non homogènes pour résoudre les problèmes de la
forme

46


 ut = uxx + f (x, t), t > 0, 0 < x < 1;
u(0, t) = g0 (t) ;

(116)
 u(1, t) =
 g1 (t) ;
u(x, 0) = u0 (x) ;

où g (t) et g (t) ne sont pas nulles. Tester les programmes en les appliquant
au ptoblème dénie par
0 1

f (x, t) = −2ex−t ; g0 (t) = e−t ; g1 (t) = e1−t ; u0 (x) = ex , (117)

pour lesquels la solution exacte est


u(x, t) = ex−t . (118)

Exercices 22. On considère le problème non linéaire


ut = uxx + V uux . (119)
Prendre u (x) = sin(πx) et des conditions aux bords de Dirichlet homogène.
Résoudre l'équation avec le schéma d'Euler explicite. Choisir ∆t égal à 90% de
0

la limite de stabilité. Calculer la solution jusqu'à t = 1, et acher la solution


pour V = 1, 5, 10.
8.5 Equation des ondes
Exercices 23. Modier le code Scilab 6 pour résoudre l'équation suivante en
utilisant la méthode d'Euler explicite, la méthode d'Euler implicite, et la méthode
de Crank-Nicholson
∂ 2 u(x, t) ∂ 2 u(x, t)
4 = , 0 < x < 1, 0 < t ≤ 1, (120)
∂x2 ∂t2
avec les conditions aux bords et initiales suivantes :
∂u(x,0)
u(x, 0) = 0, ∂t = 5 sin(πx),
(121)
u(0, t) = 0, u(1, t) = 0.
On note que la solution analytique est
2.5
u(x, t) = sin(πx) sin(2πt). (122)
π
On note M et N respectivement le nombre de subdivisions en espace et en
temps.
1. On suppose que le domaine est subdivisé en M × N = 20 × 50 sections,
quelle est la valeur de r = c ∆t /h ? Quelle est la valeur maximale de
2 2 2

l'erreur absolue?
47
2. On suppose que le domaine est subdivisé en M × N = 40 × 100 sec-
tions, quelle est la valeur de r ? Quelle est la valeur maximale de l'erreur
absolue?
3. On suppose que le domaine est subdivisé en M × N = 50 × 100 sec-
tions, quelle est la valeur de r ? Quelle est la valeur maximale de l'erreur
absolue? Est-ce-que l'approximation de la solution s'est améliorée?
4. On suppose que le domaine est subdivisé en M × N = 52 × 100 sections,
quelle est la valeur de r ? Peut-on espérer une meilleure approximation
en vertu de la condition de stabilité? Quelle est la valeur maximale de
l'erreur absolue? Est-ce-que l'approximation de la solution s'est amélio-
rée?
Exercices 24. Modier le code Scilab 6 pour résoudre l'équation suivante en
utilisant la méthode d'Euler explicite, la méthode d'Euler implicite, et la méthode
de Crank-Nicholson
∂ 2 u(x, t) ∂ 2 u(x, t)
= , 0 < x < 10, 0 < t ≤ 10, (123)
∂x2 ∂t2
avec les conditions aux bords et initiales suivantes :

 (x − 2)(3 − x) si 2 ≤ x ≤ 3,
(124)
0 sinon ,
u(x, 0) =

∂u(x, 0)
= 0, u(0, t) = 0, u(10, t) = 0. (125)
∂t
On note M et respectivement le nombre de subdivisions en espace et en
temps.
N

1. On suppose que le domaine est subdivisé en M × N = 100 × 100 sections,


quelle est la valeur de r = c ∆t /h ? Quelle est la valeur maximale de
2 2 2

l'erreur absolue?
2. Acher l'évolution de la solution, en achant le temps sur la gure.
Estimer le temps pour lequel l'onde se déplaçant vers la gauche est ré-
échi sur la frontière. A quel moment les deux impulsions séparées sont
réunies?
Exercices 25. Une barre élastique horizontale est initialement non déformée
et au repos. Une extrémité, en x = 0, est xée, et l'autre extrémité, en x = L
(lorsque t = 0), est tirée avec une force constante de F (lb/ft ). On peut montrer
2

que le déplacement y(x, t) de la barre est donné par les équations


∂2y 2
∂ y ∂y(L,0) F
∂t2 = a2 ∂x2, y(0, t) = 0, ∂t = E
(126)
∂y(x,0)
y(x, 0) = 0, ∂t = 0,

48
où a = Eg/ρ ; E est le module de Young (lb/ft ); g est l'accélération de la
2 2

pesanteur; ρ est la densité (lb/ft ). Trouver y en fonction de t au point milieu


3

pour une barre en caoutchouc de 2 ft de long pour lequel E = 1.8 × 10 et ρ = 70


6

si F/E = 0.7.

49

Vous aimerez peut-être aussi