Académique Documents
Professionnel Documents
Culture Documents
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.
xk = kh, k = 1, . . . , n.
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.
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.
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
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
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
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 .
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
9
Valeurs propres discrètes et continues
4000
Matrice Ah
3000
2500
2000
1500
1000
500
0
0 2 4 6 8 10 12 14 16 18 20
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
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 π
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
A=CalculMat(n)+c*eye(n,n);
v=CalculSM(n,f,a0,a1);
uh=A\v;
min(uh)
plot2d(x,uh,j)
end
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 .
f (x) = e−4x (π 2 − 16) cos(πx) − 8π sin(πx) − b(x)(π sin(πx) + 4 cos(πx)) + c(x) cos(πx) .
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