• Aucun résultat trouvé

R´ esolution d’un syst` eme triangulaire

Dans le document Méthodes Numériques (Page 79-84)

M´ ethodes directes pour la r´ esolution des syst` emes lin´ eaires

3.2 R´ esolution d’un syst` eme triangulaire

x= Cbde l’analysea priorir´etrograde. On pourrait donc songer `a calculer C dans le seul but d’utiliser l’estimation (3.16) (par exemple, dans le cas o`u (3.2) est r´esolu par la m´ethode d’´elimination de Gauss, on peut calculer C a posteriorien utilisant la factorisation LU de A, voir les Sections 3.3 et 3.3.1).

Concluons en remarquant que si δb est interpr´et´e dans (3.11) comme le r´esidu de la solution calcul´eey=x+δx, on a ´egalement

e

x ≤K(A) r

b . (3.17)

L’estimation (3.17) n’est pas utilis´ee en pratique car le r´esidu calcul´e est en-tach´e d’erreur d’arrondi. En posant r = fl(b−Ay) et en supposant que notation sera d´esign´ee dans la suitenotation valeur absolue. Nous utiliserons aussi la notation suivante

C≤D, o`u C, D∈Rm×n pour indiquer que

cij≤dij pour i= 1, . . . , m, j= 1, . . . , n.

Des formules du type de (3.18) sont impl´ement´ees dans la biblioth`eque d’al-g`ebre lin´eaire LAPACK (voir [ABB+92]).

3.2 R´ esolution d’un syst` eme triangulaire

Consid´erons un syst`eme inversible 3×3 triangulaire inf´erieur :

La matrice ´etant inversible, ses termes diagonaux lii, i = 1,2,3 sont non nuls. On peut donc d´eterminer successivement les valeurs inconnues xi pour i= 1,2,3 :

x1=b1/l11,

x2= (b2−l21x1)/l22, x3= (b3−l31x1−l32x2)/l33.

Cet algorithme peut ˆetre ´etendu aux syst`emes n×n. On l’appelle substitu-tion directe. Dans le cas d’un syst`eme Lx=b, o`u L est une matrice inversible triangulaire inf´erieure d’ordren(n≥2), la m´ethode s’´ecrit

x1= b1 l11, xi= 1

lii

⎝bi

i−1

j=1

lijxj

⎠, i= 2, . . . , n.

(3.19)

On appelle ces relations formules de “descente”. L’algorithme effectue n(n+ 1)/2 multiplications et divisions et n(n−1)/2 additions et soustractions. Le nombre global d’op´erations pour (3.19) est doncn2flops.

On traite de mani`ere analogue un syst`eme lin´eaire Ux=b, o`u U est une matrice inversible triangulaire sup´erieure d’ordren(n≥2). Dans ce cas l’al-gorithme s’appellesubstitution r´etrogradeet s’´ecrit dans le cas g´en´eral

xn= bn unn, xi= 1

uii

⎝bin j=i+1

uijxj

⎠, i=n−1, . . . ,1

(3.20)

(formules de “remont´ee”). Son coˆut est encore den2flops.

3.2.1 Impl´ementation des m´ethodes de substitution

A l’´etape i de l’algorithme (3.19), on effectue un produit scalaire entre le vecteur ligne L(i,1 : i−1) (cette notation d´esignant le vecteur obtenu en extrayant de la matrice L les ´el´ements de la i-i`eme ligne depuis la premi`ere jusqu’`a la (i-1)-i`eme colonne) et le vecteur colonne x(1 :i−1). L’acc`es aux

´

el´ements de la matrice L se fait donc par ligne ; pour cette raison, on dit que l’algorithme de substitution directe impl´ement´e comme ci-dessus est orient´e ligne.

Son impl´ementation est propos´ee dans le Programme 1.

Programme 1 - forwardrow: Substitution directe : version orient´ee ligne function [x]=forwardrow(L,b)

% FORWARDROW substitution directe: version orient´ee ligne.

% X=FORWARDROW(L,B) r´esout le syst`eme triangulaire inf´erieur L*X=B

% avec la m´ethode de substitution directe dans sa version

% orient´ee ligne [n,m]=size(L);

if n ˜= m, error(’Seulement des syst`emes carr´es’); end

if min(abs(diag(L))) == 0, error(’Le syst`eme est singulier’); end x(1,1) = b(1)/L(1,1);

for i = 2:n

x (i,1) = (b(i)-L(i,1:i-1)*x(1:i-1,1))/L(i,i);

end return

Pour obtenir une version orient´ee colonne du mˆeme algorithme, on tire avantage du fait que la i-i`eme composante du vecteur x, une fois calcul´ee, peut ˆetre ais´ement ´elimin´ee du syst`eme.

Une impl´ementation de cette proc´edure, dans laquelle la solution x est stock´ee `a la place du membre de droiteb, est propos´ee dans le Programme 2.

Programme 2 - forwardcol: Substitution directe : version orient´ee colonne function [b]=forwardcol(L,b)

% FORWARDCOL substitution directe: version orient´ee colonne.

% X=FORWARDCOL(L,B) r´esout le syst`eme triangulaire inf´erieur L*X=B

% avec la m´ethode de substitution directe dans sa version

% orient´ee colonne [n,m]=size(L);

if n ˜= m, error(’Seulement des syst`emes carr´es’); end

if min(abs(diag(L))) == 0, error(’Le syst`eme est singulier’); end for j=1:n-1

b(j)= b(j)/L(j,j); b(j+1:n)=b(j+1:n)-b(j)*L(j+1:n,j);

end

b(n) = b(n)/L(n,n);

return

Impl´ementer le mˆeme algorithme par une approche orient´ee ligne plutˆot que colonne peut modifier consid´erablement ses performances (mais bien sˆur pas la solution). Le choix de l’impl´ementation doit donc ˆetre subordonn´e `a l’ar-chitecture sp´ecifique du calculateur utilis´e.

Des consid´erations analogues sont valables pour la m´ethode de substitution r´etrograde pr´esent´ee en (3.20) dans sa version orient´ee ligne.

On a impl´ement´e la version orient´ee colonne dans le Programme 3. Comme pr´ec´edemment, le vecteur xest stock´e dansb.

Programme 3 - backwardcol: Substitution r´etrograde : version orient´ee colonne

function [b]=backwardcol(U,b)

% BACKWARDCOL substitution r´etrograde: version orient´ee colonne.

% X=BACKWARDCOL(U,B) r´esout le syst`eme triangulaire sup´erieur

% U*X=B avec la m´ethode de substitution r´etrograde dans sa

% version orient´ee colonne.

[n,m]=size(U);

if n ˜= m, error(’Seulement des syst`emes carr´es’); end

if min(abs(diag(U))) == 0, error(’Le syst`eme est singulier’); end for j = n:-1:2,

b(j)=b(j)/U(j,j); b(1:j-1)=b(1:j-1)-b(j)*U(1:j-1,j);

end

b(1) = b(1)/U(1,1);

return

Quand on r´esout de grands syst`emes triangulaires, seule la partie triangu-laire de la matrice doit ˆetre stock´ee, ce qui permet une ´economie de m´emoire consid´erable.

3.2.2 Analyse des erreurs d’arrondi

Dans l’analyse effectu´ee jusqu’`a pr´esent, nous n’avons pas consid´er´e la pr´ e-sence des erreurs d’arrondi. Quand on prend celles-ci en compte, les algo-rithmes de substitution directe et r´etrograde ne conduisent plus aux solutions exactes des syst`emes Lx=bet Uy=b, mais fournissent des solutions appro-ch´eesxqu’on peut voir comme des solutionsexactesdes syst`emes perturb´es

(L +δL)x=b, (U +δU)x=b,

o`u δL = (δlij) et δU = (δuij) sont des matrices de perturbation. En vue d’appliquer l’estimation (3.9) ´etablie `a la Section 3.1.2, on doit estimer les matrices de perturbationδL etδU en fonction des coefficients des matrices L et U, de leur taille, et des caract´eristiques de l’arithm´etique `a virgule flottante.

On peut montrer que

|δT| ≤ nu

1−nu|T|, (3.21)

o`u T est ´egal `a L ou U et o`uuest l’unit´e d’arrondi d´efinie en (2.34). Clairement, si nu<1, en utilisant un d´eveloppement de Taylor, il d´ecoule de (3.21) que

|δT| ≤nu|T|+O(u2). De plus, d’apr`es (3.21) et (3.9), si nuK(T)<1 alors x−x

x ≤ nuK(T)

1−nuK(T) =nuK(T) +O(u2), (3.22)

pour les normes · 1, · et la norme de Frobenius. Si la valeur deuest assez petite (comme c’est typiquement le cas), les perturbations introduites

par les erreurs d’arrondi dans la r´esolution d’un syst`eme triangulaire peuvent donc ˆetre n´eglig´ees. Par cons´equent, la pr´ecision des solutions calcul´ees par les algorithmes de substitution directe et r´etrograde est g´en´eralement tr`es ´elev´ee.

Ces r´esultats peuvent ˆetre encore am´elior´es en faisant des hypoth`eses sup-pl´ementaires sur les coefficients de L ou U. En particulier, si les coefficients de U sont tels que|uii| ≥ |uij|pour toutj > i, alors

|xi−xi| ≤2ni+1 nu 1−nu max

ji|xj|, 1≤i≤n.

On a le mˆeme r´esultat si T=L quand |lii| ≥ |lij|pour toutj < i, ou si L et U sont `a diagonale dominante. Les estimations pr´ec´edentes seront utilis´ees dans les Sections 3.3.1 et 3.4.2.

Pour les d´emonstrations des r´esultats que nous venons d’´enoncer, voir [FM67], [Hig89] et [Hig88].

3.2.3 Inverse d’une matrice triangulaire

On peut employer l’algorithme (3.20) (resp. (3.19)) pour calculer explicitement l’inverse d’une matrice triangulaire sup´erieure (resp. inf´erieure). En effet, ´etant donn´e une matrice triangulaire sup´erieure inversible U, les vecteurs colonnes vi de l’inverse V=(v1, . . . ,vn) de U satisfont les syst`emes lin´eaires suivants

Uvi =ei, i= 1, . . . , n, (3.23) o`u {ei} est la base canonique deRn (d´efinie dans l’Exemple 1.2). Le calcul desvi n´ecessite donc d’appliquernfois l’algorithme (3.20) `a (3.23).

Cette proc´edure est assez inefficace puisqu’au moins la moiti´e des ´el´ements de l’inverse de U sont nuls. Nous allons tirer avantage de ceci. Notons vk = (v1k, . . . , vkk)T le vecteur de taillektel que

U(k)vk=lk k= 1, . . . , n, (3.24) o`u les U(k)sont les sous-matrices principales de U d’ordreketlkest le vecteur deRkdont le premier ´el´ement vaut 1 et les autres 0. Les syst`emes (3.24) sont triangulaires sup´erieurs d’ordre k et ils peuvent ˆetre `a nouveau r´esolus en utilisant la m´ethode (3.20). L’algorithme d’inversion des matrices triangulaires sup´erieures s’´ecrit : pourk=n, n−1, . . . ,1, calculer

vkk=u−1kk, vik=−u−1ii

k j=i+1

uijvjk, pour i=k−1, k−2, . . . ,1. (3.25) A la fin de cette proc´edure, les vecteurs vk fournissent les termes non nuls des colonnes de U−1. L’algorithme n´ecessite environn3/3 + (3/4)n2 flops. A nouveau `a cause des erreurs d’arrondi, l’algorithme (3.25) ne donne pas la solution exacte, mais une approximation de celle-ci. On peut ´evaluer l’erreur introduite en utilisant l’analysea priorir´etrograde effectu´ee `a la Section 3.1.3.

Dans le document Méthodes Numériques (Page 79-84)