Académique Documents
Professionnel Documents
Culture Documents
Méthodes directes de
résolution des systèmes
linéaires
4.1 Introduction
Définition 4.1 Factorisation LU
Calculer la factorisation LU d’une matrice inversible A c’est déterminer L, une
matrice triangulaire inférieure, et U , une matrice triangulaire supérieure, telles
que A = LU .
1
2CHAPITRE 4. MÉTHODES DIRECTES DE RÉSOLUTION DES SYSTÈMES LINÉAIRES
end for
x(i) = y(i)/u(i,i)
end for
Le coût principal d’une méthode directe réside dans la phase de factorisation.
C’est à celle-ci qu’est consacré ce chapitre.
Remarque
Dans la suite du paragraphe, afin de dissocier plus clairement les blocs des
coefficients, on continuera à appeler les matrices avec des lettres majuscules
alors que les références à des coefficients seront notées en minuscule dans la
description des algorithmes.
4.2 Factorisation LU
Considérons une matrice inversible A décomposée en 2 × 2 blocs :
A11 A12
A = (4.1)
A21 A22
Les blocs A11 et A22 sont des matrices carrées respectivement de dimension n1
et n2 . Les blocs A12 et A21 sont des matrices rectangulaires respectivement de
dimensions (n1 , n2 ) et (n2 , n1 ).
Définition 4.2 Factorisation LU incomplète d’une matrice
On appelle factorisation LU incomplète de la matrice A une factorisation de la
matrice par blocs :
A11 A12 L11 0 U11 U12
= (4.2)
A21 A22 L21 I 0 S22
dans laquelle les blocs L11 et U11 sont respectivement triangulaires inférieurs et
triangulaires supérieurs.
La factorisation incomplète représente l’opération de base de tous les algo-
rithmes qui seront étudiés dans ce chapitre.
Lemme 4.1 Pour que la matrice A admette la factorisation incomplète 4.2, il
faut et il suffit que le bloc A11 soit factorisable en A11 = L11 U11 .
Démonstration
La matrice A admet la factorisation incomplète 4.2 si et seulement si :
A11 A12 L11 0 U11 U12 L11 U11 L11 U12
= =
A21 A22 L21 I 0 S22 L21 U11 L21 U12 + S22
(4.3)
Par identification. :
A11 = L11 U11
A21 = L21 U11
(4.4)
A12 = L11 U12
A22 = L21 U12 + L22 U22
4.2. FACTORISATION LU 3
Le bloc S22 est appelé complément de Schur.
Lemme 4.2 Le complément de Schur ne dépend pas de la factorisation du bloc
A11 et vaut :
S22 = A22 − A21 A−1
11 A12 (4.7)
Démonstration
Elle découle immédiatement du lemme précédent et plus précisément des équations
4.5 et 4.6 :
S22 = A22 − L21 U12 = A22 − A21 U11 L11 A12
−1 −1
(4.8)
Finalement, on obtient le théorème fondamental pour les méthodes de fac-
torisation LU.
Théorème 4.1 La matrice A admet une factorisation LU si et seulement si le
bloc A11 et le complément de Schur S22 = A22 − A21 A−1 11 A12 sont eux-mêmes
factorisables.
La factorisation LU de la matrice est déterminée par les factorisations des blocs
A11 = L11 U11 et S22 = L22 U22 selon la formule :
A11 A12 L11 0 U11 U12
= (4.9)
A21 A22 L21 L22 0 U22
dans laquelle les blocs L21 et U12 sont ceux de la factorisation incomplète de la
matrice :
A11 A12 L11 0 U11 U12
= (4.10)
A21 A22 L21 I 0 S22
Démonstration
Une factorisation LU de la matrice s’écrit :
A11 A12 L11 0 U11 U12 L11 U11 L11 U12
= =
A21 A22 L21 L22 0 U22 L21 U11 L21 U12 + L22 U22
(4.11)
Par identification , on retrouve bien que les blocs L11 , U11 , L21 et U12 sont les
mêmes que ceux de la factorisation incomplète du lemme 4.1 et finalement :
A22 = L21 U12 + L22 U22 = L21 U12 + S22 si et seulement si S22 = L22 U22 .
4CHAPITRE 4. MÉTHODES DIRECTES DE RÉSOLUTION DES SYSTÈMES LINÉAIRES
for k = 1 to n − 1 do
for i = k + 1 to n do
a(i,k) = a(i,k) / a(k,k)
end for
for j = k + 1 to n do
for i = k + 1 to n do
a(i,j) = a(i,j) - a(i,k) ⋆ a(k,j)
end for
end for
end for
L’algorithme construit, si elle existe, la factorisation de Gauss de la ma-
trice, A = LU , où L est une matrice triangulaire inférieure dont les coefficients
diagonaux sont tous égaux à 1 et U une matrice triangulaire supérieure.
Par construction, l’étape numéro n1 de l’algorithme de Schur calcule la co-
lonne numéro n1 de L, la ligne numéro n1 de U , ainsi qu’un bloc diagonal
inférieur de dimension n2 , avec n1 + n2 = n = dim(A). L’application de l’al-
gorithme de factorisation de Gauss à ce bloc donne les n2 dernières lignes et
colonnes de la matrice complète. Donc, d’après le lemme 4.1, ce bloc n’est autre
que le complément de Schur.
On a donc le théorème suivant.
Démonstration
L’étape n1 de l’algorithme de factorisation ci-dessus n’est réalisable que si le
coefficient a(n1 , n1 ) issu des n1 − 1 premières itérations est différent de 0.
Inversement, si la factorisation de Gauss existe, le théorème 4.1 montre que le
complément de Schur est factorisable, ce qui implique que son premier coefficient
diagonal, égal au produit des deux premiers coefficients des matrices inversibles
L22 et U22 , est différent de 0.
Remarque
Un autre choix de factorisation du premier terme diagonal à chaque étape ne
change pas cette condition, puisque, comme on l’a vu au théorème 4.1, le bloc
diagonal inférieur de n’importe quelle factorisation incomplète est toujours le
complément de Schur. Ce qui signifie aussi que deux méthodes de factorisation
LU ne diffèrent que par le choix de la factorisation du terme diagonal à chaque
itération.
6CHAPITRE 4. MÉTHODES DIRECTES DE RÉSOLUTION DES SYSTÈMES LINÉAIRES
Démonstration
Décomposons le système par blocs, il s’écrit :
L11 0 x1 y1
= (4.12)
L21 L22 x2 y2
Démonstration
Si L1 U1 = LU , alors L−1 L1 = U1 U −1 = B. La matrice B vérifie : LB = L1 .
Donc le vecteur colonne numéro j de B, que l’on notera x, est solution du
système Lx = y, où y est le vecteur colonne numéro j de L1 . Comme L1 est une
matrice triangulaire inférieure, les j − 1 premiers coefficients de y sont nuls et
il en est de même des j − 1 premiers coefficients de x d’après le lemme .
On en déduit donc que si L et L1 sont deux matrices triangulaires inférieures,
il en est de même pour L−1 L1 .
De même, si U1 et U sont deux matrices triangulaires supérieures, il en est de
même pour U1 U −1 . En effet, la matrice transposée de U1 U −1 est égale à U −t U1 ,
U −t désignant indifféremment la transposée de l’inverse de U ou l’inverse de
sa transposée. C’est donc, on vient de le démontrer, une matrice triangulaire
inférieure, ce qui signifie que U1 U −1 est triangulaire supérieure.
La matrice B est donc simultanément triangulaire inférieure et triangulaire
supérieure. Elle est donc diagonale.
Démonstration
En effet, LU et L1 U1 sont deux factorisations de Gauss de la même matrice,
alors, L1 = LD−1 . L et L1 étant toutes deux des matrices triangulaires inférieures
4.4. FACTORISATION DE GAUSS-JORDAN 7
Démonstration
Si A = LDU est une factorisation de Gauss-Jordan, alors L et DU sont les
facteurs de la factorisation de Gauss.
Cette démonstration indique aussi que la factorisation de Gauss-Jordan s’ob-
tient tout simplement en commençant par la factorisation de Gauss puis en met-
tant le terme diagonal en facteur dans chaque ligne de U . La mise en facteur
du terme diagonal de la ligne numéro k de U peut être réalisée dès que celle-ci
cesse d’être utilisée, c’est-à-dire à l’issue de l’étape numéro k de la factorisa-
tion de Gauss. Ce qui nous donne l’algorithme suivant pour la factorisation de
Gauss-Jordan :
for k = 1 to n − 1 do
for i = k + 1 to n do
a(i,k) = a(i,k) / a(k,k)
end for
for j = k + 1 to n do
for i = k + 1 to n do
a(i,j) = a(i,j) - a(i,k) ⋆ a(k,j)
end for
end for
for j = k + 1 to n do
a(k,j) = a(k,j) / a(k,k)
end for
end for
Évidemment, à l’issue de ces calculs, les coefficients des parties triangulaires
inférieures et supérieures strictes de A sont respectivement ceux de L et de U ,
les coefficients diagonaux étant ceux de D.
8CHAPITRE 4. MÉTHODES DIRECTES DE RÉSOLUTION DES SYSTÈMES LINÉAIRES
Q0 Pour résoudre
k+1,k+ik
le système AxQ
= b, on le remplace par le système
0 k+1,k+ik
k=n−1 P Ax = LU x = k=n−1 P b.
Il suffit donc d’appliquer successivement à b les permutations des lignes k + 1
et k + ik pour k allant de 0 à n − 1, avant de résoudre le système par descente-
remontée.
On peut appliquer le pivotage, même si le premier coefficient diagonal n’est
pas nul. Ceci permet d’améliorer la stabilité de l’algorithme de factorisation de
Gauss. En effet, considérons pour simplifier la première étape de la factorisation.
Le calcul du complément de Schur s’écrit : s(i, j) = a(i, j) − l(i, 1) ⋆ u(1, j) =
a(i, j) − a(i, 1) ⋆ a(1, j)/a(1, 1).
Si le coefficient a(1, 1) est très petit, le terme a(i, 1) ⋆ a(1, j)/a(1, 1) va dominer
le terme a(i, j). Compte tenu du fait que la précision des calculs sur un ordina-
teur est limitée par la représentation des nombres, un certain nombre de chiffres
significatifs de a(i, j) vont disparaı̂tre. En mettant les choses au pire, le résultat
sera le même que si a(i, j) était nul. Cette disparition, ou du moins cette mo-
dification des termes a(i, j) revient à modifier la matrice initiale, de telle sorte
qu’elle peut ne plus être inversible. L’algorithme va devenir numériquement in-
stable.
Au contraire, si le coefficient a(1, 1) est très grand, le terme a(i, 1)⋆a(1, j)/a(1, 1)
va être dominé par le terme a(i, j), au point éventuellement de disparaı̂tre de-
vant celui-ci. Ce qui revient à considérer que les termes a(i, 1) ou a(1, j) sont
négligeables devant a(1, 1), ce qui est source d’imprécision certes mais ne remet
pas en cause l’inversibilité de la matrice.
Faire du ”pivotage numérique” dans la factorisation de Gauss consiste donc à
pivoter à chaque itération de manière à amener un terme grand sur la diagonale.
10CHAPITRE 4. MÉTHODES DIRECTES DE RÉSOLUTION DES SYSTÈMES LINÉAIRES
for k = 1 to n − 1 do
for i = k + 1 to n do
v(i) = a(i,k)
a(i,k) = a(i,k) / a(k,k)
end for
for j = k + 1 to n do
for i = j to n do
a(i,j) = a(i,j) - a(i,k) ⋆ v(j)
end for
end for
end for
Le vecteur utilitaire v sert à conserver les valeurs des coefficients de la ligne k
de U qui sont en fait égaux, par symétrie, aux coefficients de la colonne k de L
avant leur division par le coefficient diagonal.
Remarque
L’algorithme de Crout demande deux fois moins de données et d’opérations
que l’algorithme de Gauss-Jordan, puisqu’on ne se sert que de la moitié de la
matrice et que l’on ne fait que la moitié des opérations arithmétiques. Pour
bénéficier réellement de la diminution du nombre de données nécessaires, il fau-
drait évidemment stocker la partie triangulaire inférieure de la matrice d’une
manière différente.
Écrivons la factorisation de Gauss partielle d’une matrice symétrique.
A11 A12 L11 0 U11 U12
= (4.16)
A21 A22 L21 I 0 S22
4.6. MATRICES SYMÉTRIQUES, FACTORISATIONS DE CROUT ET DE CHOLESKY11
Corollaire 4.4 Si A est symétrique définie positive, elle est factorisable et tous
les coefficients diagonaux de sa factorisation de Crout sont strictement positifs.
Démonstration
Puisque le complément de Schur est symétrique défini positif, ses coefficients
diagonaux sont strictement positifs. De ce fait le premier coefficient diagonal du
complément de Schur n’est jamais nul. Les coefficients diagonaux de la factorisa-
tion de Crout sont égaux aux premiers coefficients diagonaux des compléments
de Schur successifs.
Puisque les termes diagonaux sont strictement positifs, il existe un autre
mode de factorisation qui conserve la symétrie.p A l’étape 1 de l’algorithme de
factorisation, on prend : l(1, 1) = u(1, 1) = a(1, 1), puis de même à chaque
itération. En faisant de la sorte, on va calculer la factorisation de Cholesky
de la matrice, A = LLt . Bien évidemment, par unicité de la factorisation
de Gauss-Jordan et donc de Crout pour une matrice symétrique, on obtient
immédiatement que si la factorisation de Crout de la matrice définie positive
h √ i h √ it
s’écrit A = LDLt , alors la factorisation de Cholesky vaut : A = L D L D .
L’algorithme de Cholesky peut donc s’écrire de la manière suivante :
for k = 1 top n − 1 do
a(k, k) = a(k, k)
for i = k + 1 to n do
a(i,k) = a(i,k) / a(k,k)
end for
for j = k + 1 to n do
for i = j to n do
a(i,j) = a(i,j) - a(i,k) ⋆ a(j,k)
end for
end for
end for
12CHAPITRE 4. MÉTHODES DIRECTES DE RÉSOLUTION DES SYSTÈMES LINÉAIRES
Or, les données d’entrée de l’algorithme sont les coefficients de la matrice A, leur
nombre vaut n2 , de même pour les données de sortie. Il devrait donc être possible
de ne faire que 2n2 accès mémoire au total pour n3 /3 couples d’opérations (−, ⋆).
La localisation temporelle des accès devrait être très bonne, ce qui n’est pas le
cas avec l’algorithme par ligne tel qu’on l’a écrit.
Une fois de plus, la solution réside dans la mise en place d’une stratégie par
blocs. En effet, si la matrice est de taille suffisamment réduite pour tenir dans
la mémoire cache, elle va y résider tout au long des calculs, et le nombre total
d’accès à la mémoire centrale sera limité à n2 lectures et n2 écritures. Cependant,
contrairement au cas du produit de matrice, il ne suffit pas de dédoubler les trois
niveaux de boucles d’indices k, j et i et d’effectuer des permutations : le caractère
récursif de l’algorithme empêche la permutation automatique. L’algorithme par
blocs ne se construit donc pas à l’aide de simples manipulations des boucles
imbriquées.
En fait, on a déjà posé les bases de l’algorithme de factorisation par blocs en
écrivant la factorisation incomplète 4.2. Pour réaliser la factorisation incomplète,
quatre opérations sont nécessaires.
1. Factorisation du bloc diagonal, A11 = L11 U11 .
2. Détermination du bloc supérieur, U12 = L−1
11 A12 .
3. Détermination du bloc inférieur, L21 = A21 U11
−1
.
4. Calcul du complément de Schur, S22 = A22 − L21 U12 .
Si la dimension de A11 , n1 , est suffisamment petite, la première opération peut
se faire dans le cache. Le nombre de couples d’opérations (−, ∗) qu’elle exige est
d’ordre n31 /3.
La deuxième nécessite la résolution de n2 = n − n1 systèmes linéaires as-
sociés à une matrice triangulaire inférieure, puisque le bloc U12 est solution
de l’équation L11 U12 = A12 . Le coût d’une descente étant de l’ordre de n21 /2
couples d’opérations (−, ∗), le calcul de U12 en demande n2 ⋆ n21 /2. Pour chaque
descente, si le bloc L11 réside déjà dans le cache, il suffit de faire n1 accès à
la mémoire en lecture du vecteur second membre puis n1 accès en écriture du
vecteur résultat, soit 2n1 accès mémoire pour n21 /2 couples d’opérations (−, ∗).
La troisième opération est identique à la précédente. En effet, la transposition
t
de l’équation L21 U11 = A21 , donne U11 Lt21 = At21 , il faut donc de nouveau faire
n2 descentes de systèmes linéaires associés à la matrice triangulaire inférieure
t
de dimension n1 , U11 .
Le calcul du complément de Schur, S22 = A22 − L21 U12 , est un produit de ma-
trices, que l’on peut organiser par blocs pour assurer la localisation temporelle
et spatiale des données. Il requiert n22 ⋆ n1 couples d’opérations (−, ∗), puisque
14CHAPITRE 4. MÉTHODES DIRECTES DE RÉSOLUTION DES SYSTÈMES LINÉAIRES
chacun des n22 coefficients de la matrice S22 est obtenu à l’aide du produit sca-
laire des n1 termes d’une ligne de L21 par ceux d’une colonne de U12 .
Pour compléter la factorisation de la matrice, il suffirait maintenant de réaliser
une cinquième étape consistant à factoriser le complément de Schur, S22 =
L22 U22 , ce qui demanderait d’ordre n32 /3 couples d’opérations (−, ∗). Pour as-
surer la bonne localisation temporelle et spatiale des données, cette factorisation
elle-même se fait en applicant récursivement la même méthodologie par blocs.
On vient de démontrer au passage que le coût du calcul par blocs de la
factorisation de Gauss était le même que celui de l’algorithme classique. En effet,
les cinq étapes décrites précédemment requièrent un nombre total de couples
d’opérations (−, ∗) de l’ordre de :
end for
for J = K + 1 to P do
for I = K + 1 to P do
AIJ = AIJ − AIK × AKJ
end for
4.8. MISE EN ŒUVRE DE LA FACTORISATION PAR BLOCS DANS UN ENVIRONNEMENT DE PROGRAMMA
end for
end for
Au cours de la factorisation du bloc diagonal, les blocs LKK et UKK sont
évidemment substitués au bloc AKK .
Les calculs des blocs L−1KK × AKJ et AIK × UKK se font, par descentes de
−1
end if
end for
for J = K + 1 to P do
for I = K + 1 to P do
if distribution(I,J) = rank then
16CHAPITRE 4. MÉTHODES DIRECTES DE RÉSOLUTION DES SYSTÈMES LINÉAIRES
11 12 13 14
21 22 23 24
31 32 33 34
41 42 43 44
Fig. 4.1 – Répartition aléatoire.
par le processus vert, le facteur L11 devra être transmis à tous les autres pro-
cessus chargés d’un bloc A1J , sur la première ligne, en l’occurrence au processus
rouge. De même, le facteur U11 devra être transmis à tous les autres processus
chargés d’un bloc AI1 , sur la première colonne, c’est-à-dire au processus bleu.
Ce n’est qu’après avoir reçu ces facteurs que les processus pourront exécuter
leur part des calculs des nouveaux blocs :
for J = 2 to P do
if distribution(1,J) = rank then
A1J = L−111 × A1J
end if
end for
for I = 2 to P do
if distribution(I,1) = rank then
AI1 = AI1 × U1−1
end if
end for
De même, les blocs A1J et AI1 ainsi calculés devront être respectivement trans-
mis à tous les processus calculant des compléments de Schur sur la colonne J
4.8. MISE EN ŒUVRE DE LA FACTORISATION PAR BLOCS DANS UN ENVIRONNEMENT DE PROGRAMMA
et la ligne I.
La figure4.2 illustre les différents types de transferts de blocs par ligne ou
par colonne nécessaires à la première itération de l’algorithme de Gauss.
L11
A21
A31
A41
for J = K + 1 to P do
if distribution(K,J) = rank then
AKJ = L−1 KK × AKJ
end if
dif f usion par colonne(J, K, AKJ , distribution(K, J))
end for
for I = K + 1 to P do
if distribution(I,K) = rank then
AIK = AIK × UKK −1
end if
dif f usion par ligne(I, K, AIK , distribution(I, K))
end for
for J = K + 1 to P do
for I = K + 1 to P do
if distribution(I,J) = rank then
AIJ = AIJ − AIK × AKJ
end if
end for
end for
end for
Une distribution efficace doit faire en sorte de faire travailler le plus grand
nombre de processus possibles à chaque phase, tout en équilibrant les charges.
La distribution aléatoire de la figure 4.1 n’est certainement pas très efficace,
puisque, à la première itération par exemple, le processus jaune n’a rien à faire
pendant la phase de remise à jour des blocs de la première ligne et de la première
colonne mais qu’en revanche il traite 4 des 9 blocs dans la phase de calcul du
complément de Schur.
Une possibilité pour parvenir à une bonne efficacité consiste à colorier les
blocs de manière cyclique par ligne et par colonne, comme sur la figure 4.3,
avec un nombre total de blocs sur chaque ligne ou colonne multiple du nombre
de processus. Avec cette répartition, tous les processus travaillent également à
toutes les itérations pour chaque phase parallèle de remise à jour des blocs sur la
ligne et la colonne ou de calcul du complément de Schur. De plus, les procédures
dif f usion par ligne ou dif f usion par colonne peuvent être tout simplement
remplacées par la fonction MPI Bcast, puisque la distribution cyclique fait en
sorte que tous les processus aient des blocs sur chaque ligne et chaque colonne.
En revanche, cette distribution présente l’inconvénient de découper en un
très grand nombre de blocs, ce qui peut nuire à la granularité. De plus, à chaque
itération de l’algorithme de Gauss par blocs, tous les processus auront besoin
de tous les blocs sur la ligne et la colonne pour calculer leurs contributions au
complément de Schur. Ce qui requiert une place mémoire importante.
Il existe d’autres méthodes de distribution nécessitant un découpage en un
nombre de blocs moins importants. Mais, quelque soit la méthode de distri-
bution, le problème de la mémoire nécessaire pour stocker temporairement les
blocs utilisés pour les calculs se pose pour des matrices de grande taille.
4.8. MISE EN ŒUVRE DE LA FACTORISATION PAR BLOCS DANS UN ENVIRONNEMENT DE PROGRAMMA
11 12 13 14 15 16 17 18
21 22 23 24 25 26 27
31 32 33 34 35 36
41 42 43 44 45
51 5 2 5 3 5 4
61 62 63
71 72
81