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
⎛
⎝bi− n 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| ≤2n−i+1 nu 1−nu max
j≥i|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.