Académique Documents
Professionnel Documents
Culture Documents
Babacar LEYE
17 mai 2023
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
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 ′
′ ′ ′ ′
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
y(x)
x1 = a x2 x3 xN +1 = b x
′ 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
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
′ 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
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.
u , u . Sur chaque n÷ud interne, la dérivée seconde ü(x ) est remplacée par la
0 1 2 3
u0 = 10,
ui−1 −2ui +ui+1
h2 = 0.02ui + 1, i = 1, 2, 3, 4,
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
6
1 // domaine g éomé t r i q u e [a , b]
2 a = 0;
3 b = 10;
4
5 // maillage
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 ;
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
35 plot2d (x , u) ;
ProblemeLineaireDF.sce
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 .
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
′′ ′ ′
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
.. .. ..
α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.
// 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
// visualisation
disp('[x u]'); disp([x u]);
plot2d(x,u);
xtitle(' ','x','u(x)');
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
où
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 + γ
.. .. .. .. .. (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
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,
16
Si u est de classe C 2 par rapport à la variable t, la formule de Taylor sécrit
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)
19
Figure 3 La solution 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
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);
for n = 1:nt
// noeuds internes
umoins = u(1:nx-1,n);
ucentr = u(2:nx ,n);
uplus = u(3:nx+1,n);
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
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
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.
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
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
25
Figure 7 L'erreur en t = 1, pour l'Exemple 4 ; Euler implicite h = 1/16,
∆t = 1/64
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);
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);
// 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
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
où
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)
30
Figure 9 L'erreur en t = 1, pour l'Exemple 4 ; Crank-Nicolson h = 1/16,
∆t = 1/64
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);
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;
uold = u(2:nx,n);
u(2:nx,n+1) = A\(B*uold+F);
// 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(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.
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
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
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));
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;
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
|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)
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
// 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);
u(2:nx,n+1) = ucentr;
u(2:nx,n+1) = u(2:nx,n+1) - a*(dt/h)*(ucentr-umoins);
// 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));
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);
u(2:nx,n+1) = ucentr;
u(2:nx,n+1) = u(2:nx,n+1) - a*(dt/h)*(uplus-ucentr);
// 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
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
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
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) ;
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) ;
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
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
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
48
où a = Eg/ρ ; E est le module de Young (lb/ft ); g est l'accélération de la
2 2
si F/E = 0.7.
49