Vous êtes sur la page 1sur 14

Université Pierre et Marie Curie Bases des méthodes numériques

Master de Sciences & Technologies MM006


Mention Mathématiques & Applications Cours : E. Godlewski
Année universitaire 2010–2011 Travaux dirigés et télé-enseignement : M. Vohralı́k

Travaux pratiques Scilab N◦ 2


Méthode des différences finies

Dans cette séance, nous allons utiliser le logiciel Scilab pour calculer une approximation
de la solution u : [0, 1] −→ R du problème suivant

 −u′′ (x) + b(x)u′ (x) + c(x)u(x) = f (x),
(P ) u(0) = a0 , (1)
u(1) = a1 .

Les fonctions f , b et c sont données de sorte qu’il existe une solution et une seule au problème.
On suppose la solution u aussi régulière que nécessaire.

Exercice 1 (Discrétisation du problème (1))


Pour n ∈ N∗ , on pose h = 1/(n + 1) et définit les points

xk = kh, k = 1, . . . , n.

On notera, pour alléger les notations, bk = b(xk ), ck = c(xk ) et fk = f (xk ).


1. On note u0 = u(0) = a0 , un+1 = u(1) = a1 et pour k = 1, . . . , n, uk une approximation
(qu’on se propose de déterminer) de u(xk ). Justifier formellement la méthode des
différences finies pour le problème (P ), donnée par

−uk−1 + 2uk − uk+1 uk+1 − uk−1


2
+ bk + ck uk = fk , k = 1, . . . , n. (2)
h 2h

2. On pose uh = (u1 , . . . , un )T . Montrer que les relations précédentes peuvent s’écrire


sous forme compacte
Ah uh = vh , (3)
où Ah ∈ Mn (R) et vh ∈ Rn sont à déterminer.

Exercice 2 (Résolution du système linéaire (3))


On suppose dans cette partie que les fonctions b et c sont nulles.
1. Montrer que pour tout vecteur x = (x1 , . . . , xn )T ∈ Rn , on a
" n
#
1 X
hAh x, xi = 2 x21 + x2n + (xk − xk−1 )2 .
h k=2

En déduire que la matrice Ah est définie positive et inversible.


2. Calcul de la matrice et du second membre du système (3).

1
(a) Ecrire une fonction Scilab calculant la matrice Ah . L’entête de cette fonction
sera
function A=CalculMat(n)
Argument d’entrée : un entier n.
Argument de sortie : un tableau carré A contenant Ah .
(b) Ecrire une fonction qui construit le vecteur vh . L’entête de cette fonction sera
function v=CalculSM(n,f,a0,a1)
Arguments d’entrée : le nombre de points n, f le nom de la fonction calculant le
second membre f , a0 et a1 les deux conditions limites u(0) = a0 et u(1) = a1 .
Argument de sortie : v contenant le vecteur vh de l’égalité (3).
3. Validation. On suppose dans cette partie la fonction f constante, égale à 1, et on
impose des conditions limites homogènes a0 = a1 = 0.
(a) Déterminer, à la main, une solution ue du problème (1).
(b) Écrire une fonction construisant le vecteur ueh = (ue (x1 ), . . . , ue (xn ))T . L’entête
de cette fonction sera
function ue=SolExa0(n)
Argument d’entrée : n, argument de sortie : ue contenant le vecteur ueh .
(c) Résoudre par Scilab le système (3). Comparer les vecteurs uh et ueh , en calculant
la norme 2 (ou une autre) de leur différence. Commenter.
4. Convergence.
(a) Déterminer, à la main, une fonction f pour que ue (x) = e−4x sin(πx) soit solution
du problème (1). Quelles sont les valeurs de a0 et a1 ?
(b) On se propose d’étudier la convergence de la méthode des différences finies en
étudiant la décroissance de l’erreur uh − ueh en fonction de n. On dira que cette
méthode est d’ordre p ∈ R+ s’il existe un réel C tel qu’asymptotiquement
C
kuh − ueh k ≤ .
np
L’ordre p va dépendre de la norme choisie. Pour différentes valeurs de n (par
exemple n = 6 × 2j , j = 1, . . . , 7), calculer chacune des erreurs kuh − ueh k1 ,
kuh − ueh k2 et kuh − ueh k∞ . Représenter sur un même graphique les trois courbes
kuh − ueh kq en fonction de n en échelle log–log. Déterminer p. Commenter.

Exercice 3 (Valeurs propres de la matrice Ah , conditionnement)


On suppose ici que la fonction b est nulle et la fonction c constante.
1. Vérifier, à la main, que les n valeurs propres de la matrice Ah sont
 
4 2 kπh
λn,k = c + 2 sin , k = 1, . . . , n,
h 2

associées aux n vecteurs propres

ϕn,k = (sin(kπh), sin(2kπh), . . . , sin(nkπh))T , k = 1, . . . , n.

2
2. Calculer, à la main, les valeurs propres de l’opérateur u 7→ −u′′ +cu muni des conditions
aux limites homogènes. C’est à dire les scalaires λ pour lesquels il existe une fonction
non nulle ψ (appelée fonction propre associée à λ) vérifiant ψ(0) = ψ(1) = 0 et telle
que −ψ ′′ (x) + cψ(x) = λψ(x).
3. Comparer (à la main) les valeurs propres de la matrice Ah avec les valeurs propres du
l’opérateur u 7→ −u′′ + cu calculées précédemment.
4. Pour différentes valeurs de n, représenter sur un même graphique les valeurs propres
de Ah et celles de l’opérateur u 7→ −u′′ + u. Commenter.
5. Pour c = 0, représenter graphiquement, en échelle log–log, le conditionnement en
norme 2 de la matrice Ah en fonction de n. On pourra prendre n = 6 ×2j , j = 1, . . . , 7.
Commenter.

Exercice 4 (Un problème mal posé)


On suppose ici que c = −π 2 . Pour différentes valeurs de n = 50, 100, 150, 200, . . . résoudre le
système linéaire (3) avec un second membre constant, égal à 1. Noter à chaque fois la valeur
minimale que prend la solution calculée par Scilab. Commenter les résultats.

Exercice 5 (Le cas général)


On suppose maintenant b(x) et c(x) non constants et a0 et a1 non nuls. Ecrire des fonctions
Scilab pour calculer b(x) = b̄ cos(πx) et c(x) = c̄ sin(πx), avec b̄ et c̄ deux constantes, une
fonction
function A=CalculMatBC(n)
pour calculer la matrice et une fonction second membre correspondant à la solution exacte
ue (x) = e−4x cos(πx). Ecrire un script pour comparer graphiquement la solution différences
finies avec la solution exacte calculée aux points xi . Faire varier les coefficients b̄ et c̄ de
manière à illustrer le critère de stabilité
1
max |b(x)|∆x ≤ ,
2
qui peut être théoriquement démontré.

3
4
Université Pierre et Marie Curie Bases des méthodes numériques
Master de Sciences & Technologies MM006
Mention Mathématiques & Applications Cours : E. Godlewski
Année universitaire 2010–2011 Travaux dirigés et télé-enseignement : M. Vohralı́k

Corrigé des travaux pratiques N◦ 2

Corrigé 1 (Discrétisation du problème (1))


1. On a vu dans TD 4 que, sous la condition que la solution exacte du problème (P) u
est de la classe C 4 ([0, 1]), il existe ξk et ηk dans l’intervalle [xk−1 , xk+1 ] tels que

−u(xk−1 ) + 2u(xk ) − u(xk+1 ) h2  (4) 


−u′′ (xk ) = 2
+ u (ξk ) (4)
h 12
et
u(xk+1) − u(xk−1 ) h2  (3)
u′ (xk ) =

− u (ηk ) . (5)
2h 6
Donc on a

−u(xk−1 ) + 2u(xk ) − u(xk+1) u(xk+1) − u(xk−1 )

2
+ bk + c(xk )u(xk ) − f (xk )
h 2h
h2 h2
≤ sup |u(4) | + sup |b| sup |u(3) |.
12 [0,1] 6 [0,1] [0,1]

Pour de petites valeurs de h, la quantité entre valeurs absolues est proche de 0. Ceci
conduit à l’approximation
−uk−1 + 2uk − uk+1 uk+1 − uk−1
2
+ bk + ck uk − fk = 0,
h 2h
c’est à dire (2).
2. On a Ah uh = vh avec (attention, la matrice Ah n’est pas symétrique en général !)

2 + h2 c1 −1 + hb1 /2 0 ... 0
 
.. ..
 −1 − hb /2
2 2 + h2 c2 −1 + hb2 /2 . . 
1 
. . .

Ah = 2  .. .. ..

h  0 0 
.
.. . ..

 −1 − hbn−1 /2 2 + h2 cn−1 −1 + hbn−1 /2 
0 ... 0 −1 − hbn /2 2 + h2 cn

et pour le second membre (attention aux signes pour les conditions aux limites sur les
composantes 1 et n !)  a0 a0 
f1 + 2 + b1
h 2h 
f2

 
 .
..

vh = 
.

 fn−1 
a1 a1
 
fn + 2 − bn
h 2h

5
Corrigé 2 (Résolution du système linéaire (3))
On suppose dans cette partie que les fonctions b et c sont nulles.
1. Pour tout x ∈ Rn , on a
n−1
X
2
h hAh x, xi = (2x1 − x2 )x1 + (−xn−1 + 2xn )xn + (−xk−1 + 2xk − xk+1 )xk
k=2
n
X
= x21 + x2n + (xk − xk−1 )2 .
k=2

On en déduit que pour tout vecteur x non nul, hAh x, xi > 0. La matrice Ah , symétrique
pour b = c = 0, est donc définie positive et en particulier inversible.
2. Calcul de la matrice et du second membre du système (3) :
(a) Voici l’une des nombreuses manières de définir la matrice Ah :
function A=CalculMat(n)
A=zeros(n,n);
h=1/(n+1);
for i=1:n-1
A(i,i)=2;
A(i,i+1)=-1;
A(i+1,i)=-1;
end;
A(n,n)=2;
A=A/h^2;
endfunction
(b) Et encore le vecteur vh :
function v=CalculSM(n,f,a0,a1)
x=1:n;
h=1/(n+1);
x=h*x’;
v=f(x);
v(1)=v(1)+a0/h^2;
v(n)=v(n)+a1/h^2;
endfunction
On va prendre ensuite
function y=f(x)
y=ones(size(x,1),size(x,2));
endfunction
3. Validation. Dans cette partie la fonction f = 1.
(a) ue (x) = x(1 − x)/2 est solution du problème (1).
(b) Voici la fonction :
function ue=SolExa0(n)
x=(1:n)’/(n+1);
ue=0.5*x.*(1-x);
endfunction

6
(c) On exécute le script suivant
n=5;
a0=0;
a1=0;

A=CalculMat(n);
v=CalculSM(n,f,a0,a1);
uh=A\v;
ue=SolExa0(n);
norm(ue-uh)
ce qui donne
ans =
1.963D-17
Le calcul est exact, à la ≪ précision-machine ≫ près !
Explication : Pour tout polynôme de degré inférieur ou égal à 3, la relation (4)
montre qu’il y égalité entre la dérivée seconde exacte et l’approximation faite
−u(xk−1 ) + 2u(xk ) − u(xk+1)
−u′′ (xk ) = .
h2
Comme on a affaire ici à une solution polynomiale de degré 2, les calculs sont
exacts.
4. Convergence.
(a) Il suffit de prendre

f (x) = −u′′ (x) = (π 2 − 16)ue (x) + 8πe−4x cos(πx).

On a ensuite a0 = a1 = 0.
(b) On définit d’abord
function y=f1(x)
y=(%pi*%pi-16)*sin(%pi*x)+8*%pi*cos(%pi*x);
y=y.*exp(-4*x);
endfunction
et
function u=SolExa1(n)
x=(1:n)’/(n+1);
u=exp(-4*x).*sin(%pi*x);
endfunction
Le script ci-dessous produit ensuite la figure 1.
a0=0;
a1=0;
sz=7;

for j=1:sz

7
Erreur en fonction du nombre d’inconnues

−1
10
Erreur 1
Erreur 2
Erreur Inf
−2
10

−3
10

−4
10

−5
10

−6
10 1 2 3
10 10 10

Figure 1 – Convergence de la méthode des différences finies

n=6*2^j;
N(j)=n;

A=CalculMat(n);
v=CalculSM(n,f1,a0,a1);
uh=A\v;
ue=SolExa1(n);

erreur1(j)=norm(ue-uh,1);
erreur2(j)=norm(ue-uh,2);
erreurI(j)=norm(ue-uh,’inf’);
end

clf()
plot2d(N,erreur1,-1,logflag="ll");
plot2d(N,erreur2,-2,logflag="ll");
plot2d(N,erreurI,-4,logflag="ll");
legends(["Erreur 1", "Erreur 2", "Erreur Inf"],[-1,-2,-4],1)
xtitle("Erreur en fonction du nombre d’’inconnues")

p1=(log(erreur1(sz))-log(erreur1(1)))/(log(N(sz))-log(N(1)));
p2=(log(erreur2(sz))-log(erreur2(1)))/(log(N(sz))-log(N(1)));
pI=(log(erreurI(sz))-log(erreurI(1)))/(log(N(sz))-log(N(1)));

pentes=-[p1,p2,pI]
On a aussi pour des pentes des différentes droites
pentes =

8
0.9748896 1.4658568 1.9543412
De ce calcul, on déduit que p ≃ 1 pour la norme 1, p ≃ 1.5 pour la norme 2 et
p ≃ 2 pour la norme infinie. On sait (voir le cours) que

M
max |ui − u(xi )| ≤ ,
1≤i≤n 96n2

où M est un majorant de |u′′′′ | sur [0, 1]. On en déduit que p = 2, si l’erreur est
calculée en norme infinie. Les autres résultats découlent des majorations (opti-
males)

kxk1 ≤ nkxk∞ et kxk2 ≤ nkxk∞ , ∀x ∈ Rn .

Corrigé 3 (Valeurs propres de la matrice Ah , conditionnement)


On suppose ici que la fonction b est nulle et la fonction c constante.
1. On calcule la composante i de Ah ϕn,k pour 2 ≤ i ≤ n − 1 :

1
Ah (ϕn,k )i = c(ϕn,k )i + [−(ϕn,k )i−1 + 2(ϕn,k )i − (ϕn,k )i+1 ]
h2
= c sin(ikπh)
1
+ 2 [− sin ((i − 1)kπh) + 2 sin (ikπh) − sin ((i + 1)kπh)]
h  
4 2 kπh
= c + 2 sin sin (ikπh) = λn,k (ϕn,k )i ,
h 2

en utilisant les formules

sin(α + β) = sin(α) cos(β) + cos(α) sin(β),


1 + cos(2α)
cos2 (α) = .
2

On vérifie la même relation pour i = 1 et i = n.


2. On cherche des fonctions non nulles ψ et des scalaires λ tels que −ψ ′′ = (λ − c)ψ.
Posant ω 2 = λ − c, on cherche ψ de la forme ψ(x) = Aeiωx + Be−iωx . La condition
ψ(0) = 0 implique que ψ(x) = 2A sin(ωx) et la condition ψ(1) = 0 que ω = kπ avec
k ∈ Z. Les fonctions propres sont les ψk (x) = sin(kπx) et les valeurs propres associées
sont les λk = c + k 2 π 2 , k ∈ N.
Remarque : Les fonctions propres (commes les valeurs propres) sont définies à une
constante près.
3. Pour k fixé et n tendant vers l’infini, on a
" #
2 kπh
sin ( )
lim λn,k = lim c + k 2 π 2 2 = λk .
n→∞ h→0 kπh 2
2

4. On trace les deux courbes sur la figure 2.

9
Valeurs propres discrètes et continues

4000
Matrice Ah

3500 Opérateur continu

3000

2500

2000

1500

1000

500

0
0 2 4 6 8 10 12 14 16 18 20

Figure 2 – Les 20 premières valeurs propres de la matrice Ah et de l’opérateur −u′′ + u

n=20;
x=(1:n)’;
c=1;

A=CalculMat(n)+c*eye(n,n);
spA=spec(A); // les valeurs propres de la matrice A_h
spo=c+%pi*%pi*x.*x; // les valeurs propres de l’opérateur

clf()
plot2d(x, spA, -1)
plot2d(x, spo, -2)
legends(["Matrice Ah", "Opérateur continu"],[-1,-2],2)
xtitle("Valeurs propres discrètes et continues")
On note que les premières valeurs propres coı̈ncident, pas les autres.
5. On peut définir le conditionnenement de la matrice Ah dans une norme donnée,
cond(Ah ) = kAh k kA−1 h k.
La figure 3 est générée par le script suivant :
sz=7;

for j=1:sz
n=6*2^j;
N(j)=n;

A=CalculMat(n);
cond2(j)=cond(A);
end

10
Conditionnenement de la matrice Ah

6
10

5
10

4
10

3
10

2
10

1
10 1 2 3
10 10 10

Figure 3 – Conditionnement de la matrice Ah en fonction de n

clf()
plot2d(N,cond2,-1,logflag="ll");
xtitle("Conditionnenement de la matrice Ah")

pente=(log(cond2(sz))-log(cond2(1)))/(log(N(sz))-log(N(1)))
On a pour la pente de cette droite
pente =

1.9644811
Justification : La matrice Ah étant symétrique, son conditionnement en norme 2 est

sin2 nπh

maxk |λn,k | 4
cond2 (Ah ) = = 2 
2 πh
≃ 2 n2 .
mink |λn,k | sin 2 π

Corrigé 4 (Un problème mal posé)


L’exécutant le script
c=-%pi*%pi;
a0=0;
a1=0;
clf()

for j=1:4
n=j*50;
x=(1:n)’/(n+1);

11
Non convergence

0
n=50
n=100
−1000
n=150
n=200
−2000

−3000

−4000

−5000

−6000

−7000
0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0

Figure 4 – Problème de convergence pour c = −π 2

A=CalculMat(n)+c*eye(n,n);
v=CalculSM(n,f,a0,a1);
uh=A\v;

min(uh)
plot2d(x,uh,j)
end

legends(["n=50", "n=100", "n=150", "n=200"],[1,2,3,4],1)


xtitle("Non convergence")

donne

--> ans =

- 407.70743
ans =

- 1599.7876
warning
matrix is close to singular or badly scaled. rcond = 3.0663D-09
computing least squares solution. (see lsq)

ans =

- 3576.1311
warning
matrix is close to singular or badly scaled. rcond = 9.7658D-10

12
computing least squares solution. (see lsq)

ans =

- 6336.738
et la graphique donnée sur la figure 4. Il semble que la solution calculée par Scilab ne
converge pas, quand n augmente.
Explication : Le problème 
 −u′′ (x) − π 2 u(x) = 1,
u(0) = 0,
u(1) = 0

a une infinité de solutions car si u est une solution, il en est de même des fonctions u + αψ1 ,
pour tout α ∈ R. Plus n est grand, plus la matrice Ah ≪ devient ≫ singulière, puisqu’on a
vu que la première partie du spectre de Ah est proche de la première partie du spectre de
l’opérateur continu. En particulier, λn,1 est de plus en plus proche de λ1 = −π 2 .

Corrigé 5 (Le cas général)


Si on veut que la fonction u(x) = e−4x cos(πx) soit solution du problème, on doit poser
comme conditions limites

u(0) = a0 = 1, u(1) = a1 = −e−4 .

Par ailleurs, le second membre doit être maintenant égal à

f (x) = e−4x (π 2 − 16) cos(πx) − 8π sin(πx) − b(x)(π sin(πx) + 4 cos(πx)) + c(x) cos(πx) .


Le code peut être programmé en Scilab comme ci-dessous.


clear

function y=SolExa(x)
y=exp(-4*x).*cos(%pi*x);
endfunction

function bx=b(x)
bx=barb*cos(%pi*x);
endfunction

function cx=c(x)
cx=barc*sin(%pi*x);
endfunction

function y=fSmBC(x)
y=(%pi*%pi-16)*cos(%pi*x)-8*%pi*sin(%pi*x)-...
b(x).*(4*cos(%pi*x)+%pi*sin(%pi*x))+ c(x).*cos(%pi*x);
y=y.*exp(-4*x);
endfunction

13
function A=CalculMatBC(n)
A=zeros(n,n);
h=1/(n+1);
for i=1:n-1
A(i,i)=2+h^2*c(i*h);
A(i,i+1)=-1+0.5*h*b(i*h);
A(i+1,i)=-1-0.5*h*b((i+1)*h);
end
A(n,n)=2+h^2*c(n*h);;
A=A/h^2;
endfunction

function v=CalculSm(n,f,a0,a1)
x=1:n;
h=1/(n+1);
x=h*x’;
v=f(x);
v(1)=v(1)+a0/h^2+0.5*b(h)*a0/h;
v(n)=v(n)+a1/h^2-0.5*b(1-h)*a1/h;
endfunction

///////////////////////////////////
barb=10
barc=0
a0=1;
a1=-exp(-4);
sz=1;

clf()
for j=1:sz
n=5*10^(j-1);
x=(1:n)’/(n+1);

A=CalculMatBC(n);
v=CalculSm(n,fSmBC,a0,a1);
sol=A\v;
plot2d(x,sol,j)
end

plot2d(x,SolExa(x),sz+1)

14

Vous aimerez peut-être aussi