• Aucun résultat trouvé

Programme : matrices trigonalisables

Manipulation de matrices

2.2 Matrices trigonalisables

2.2.4 Programme : matrices trigonalisables

Le calcul du crochet de Lie ne pose pas de probl`eme particulier.

PROCEDURE CrochetDeLie (n: integer; A, B: matC; VAR ALieB: matC);

ALieB=AB−BA

END; { de "CrochetDeLie" }

Avec les exemples de la question 1, on trouve

A1A2 =

ce qui explique les r´esultats.

Pour calculer la dimension de l’espace vectoriel (E) engendr´e par un ensemble finiE= {A1, . . . , Ak} de matrices de Kn et pour d´eterminer une base de (E), on transforme chaque matrice Ai en un vecteur vi de dimension n2, puis on calcule le rang de la matrice rectangulaire V de taillek×n2 form´ee par les vi. On extrait simultan´ement deV une famille maximale de lignes lin´eairement ind´ependantes, qui fournit donc une base deE. La premi`ere op´eration est r´ealis´ee par la proc´edure suivante :

PROCEDURE Linearise (n: integer; A: matC; VAR vA: vecC);

Transforme une matrice carr´ee d’ordrenen un vecteur `an2 composantes.

VAR

i, j: integer;

BEGIN

FOR i := 0 TO n - 1 DO FOR j := 1 TO n DO

vA[i * n + j] := A[i + 1, j];

END; { de "Linearise" }

Pour le calcul du rang et d’un syst`eme maximal de lignes ind´ependantes, le principe est assez simple. On examine les lignes de la matrice dans leur ordre naturel. Si la lignek est nulle, on lui substitue la derni`ere ligne courante et on diminue le nombre de lignes d’une unit´e. Sinon on utilise la m´ethode du pivot : on s´electionne le premier ´el´ement ak,q non nul de la lignek. On permute ´eventuellement les colonnesketqsiq > k, puis on pivote.

On fait donc subir `a la matrice un certain nombre de permutations des lignes et des colonnes et des op´erations de pivot sur les lignes. Comme on veut ´egalement obtenir un ensemble maximal de lignes ind´ependantes, on m´emorise les permutations des lignes. En revanche, il est inutile de m´emoriser les permutations des colonnes et les op´erations de pivot, puisque deux matrices d´eduites l’une de l’autre par permutation des colonnes ou par op´eration de pivot sur les lignes ont les mˆemes ensembles de lignes ind´ependantes.

PROCEDURE BaseDesLignes (m, n: integer; B: matC; VAR rang: integer;

VAR LignesIndependantes: vecE);

Calcule le rang d’une matrice B d’ordre(m, n) et en extrait un ensemble maximal de lignes ind´ependantes.

VAR

inversible: boolean;

A: matC; Obtenue par permutation des lignes deB.

Lignes: vecE; D´ecrit la permutation des lignes d´efinissantA.

v: vecC;

i, j, k, pivot, q: integer;

FUNCTION ChercherPivot (k: integer): integer;

Cherche un pivot non nul entreketn; si le r´esultat estn+ 1, il n’y a pas de pivot non nul.

VAR

i: integer;

BEGIN i := k;

WHILE (i <= n) AND EstCNul(a[k, i]) DO { "and" s´equentiel } i := i + 1;

ChercherPivot := i END; { de "ChercherPivot" }

PROCEDURE EchangerFinColonnes (i, j: integer);

VAR

m: integer;

BEGIN

FOR m := i TO n DO

EchangerC(a[m, i], a[m, j]);

END; { de "EchangerColonnes" }

La proc´edure qui permet l’´echange de deux lignes est presque identique `a la pr´ec´edente, mais on prend la pr´ecaution de m´emoriser la permutation.

PROCEDURE EchangerLignes (i, j: integer);

VAR

m: integer;

BEGIN

FOR m := i TO n DO

EchangerC(a[i, m], a[j, m]);

EchangerE(Lignes[i], Lignes[j]);

END; { de "EchangerLignes" } PROCEDURE PivoterGauss (k: integer);

VAR

i, j: integer;

g, z: complexe;

BEGIN

FOR j := k + 1 TO n DO BEGIN

ComplexeSurComplexe(a[k, j], a[k, k], g);

FOR i := k + 1 TO n DO BEGIN

ComplexeParComplexe(g, a[i, k], z);

ComplexeMoinsComplexe(a[i, j], z, a[i, j]);

END END

END; { de "PivoterGauss" } BEGIN { de "BaseDesLignes" }

A := B;

rang := 0;

FOR i := 1 TO m DO

Lignes[i] := i; Au d´epart, les lignes sont dans l’ordre.

inversible := true;

k := 1;

WHILE (k <= m) DO BEGIN q := ChercherPivot(k);

inversible := q <> n + 1;

IF inversible THEN BEGIN IF q > k THEN

EchangerFinColonnes(k, q);

PivoterGauss(k);

rang := rang + 1;

LignesIndependantes[rang] := Lignes[k];

k := k + 1 END

ELSE BEGIN

EchangerLignes(k, m);

m := m - 1 END

END; { sur k }

END; { de "BaseDesLignes" }

Enfin, la proc´edure ci-dessous donne la dimension de l’espace vectoriel engendr´e par un ensemble fini de matrices.

FUNCTION dim (CardE, n: integer; E: EnsembleDeMatrices;

VAR BaseE: EnsembleDeMatrices): integer;

Calcule la dimension de l’espace vectoriel engendr´e par un ensembleE deCardE ma-trices et extrait deE une base de cet espace vectoriel.

VAR

i, r: integer;

L: vecE;

ELinearise: matC;

BEGIN

FOR i := 1 TO CardE DO

Linearise(n, E[i], ELinearise[i]);

BaseDesLignes(CardE, n * n, ELinearise, r, L);

FOR i := 1 TO r DO BaseE[i] := E[L[i]];

dim := r;

END; {de "dim"}

Pour calculer la dimension de l’alg`ebre de Lie engendr´ee par un ensemble fini de matrices E, on calcule, pour chaque entierk, une baseBk de l’espace vectoriel Ek d´efini dans l’´enonc´e. Pour obtenirB0, il suffit d’extraire une base deE. Pour passer deBk `aBk+1, on calcule l’ensemble de tous les crochets de Lie des matrices deBk, puis on extrait une base de cet ensemble. Lorsque les dimensions deBk et deBk+1 sont ´egales, le calcul est termin´e.

PROCEDURE LesCrochetsDeLie (VAR CardB: integer; n: integer;

VAR B: EnsembleDeMatrices);

VAR

i, j, k: integer;

BEGIN

k := CardB;

FOR i := 1 TO CardB DO

FOR j := i + 1 TO CardB DO BEGIN

k := k + 1; On ajoute tous les crochets de Lie.

CrochetDeLie(n, B[i], B[j], B[k]) END;

CardB := k

END; { de "LesCrochetsDeLie" }

PROCEDURE AlgebreDeLie (CardE, n: integer; E: EnsembleDeMatrices);

Calcule la dimension de l’alg`ebre de Lie engendr´ee par un ensembleEdeCardEmatrices d’ordren.

VAR

i, CardB, dimE: integer;

B: EnsembleDeMatrices;

BEGIN

CardB := dim(CardE, n, E, B);

REPEAT

dimE := CardB;

LesCrochetsDeLie(CardB, n, B);

CardB := dim(CardB, n, B, B);

UNTIL dimE = CardB;

Si le rang n’a pas augment´e, on a l’alg`ebre de Lie engendr´ee parE.

writeln(’Dimension de l’’alg`ebre de Lie comme espace vectoriel = ’, CardB : 1);

writeln(’Base de l’’alg`ebre de Lie comme espace vectoriel : ’);

FOR i := 1 TO CardB DO

EcrireMatriceC(n, B[i], ’’);

END; { de "AlgebreDeLie" }

Pour terminer, voici quelques exemples d’ex´ecution : Voici A1 :

- i 0 - 2.0

0 1.0 0

i 0 2.0 + i

rang(A 1) = 3 Voici A2 :

2.0 - i 0 - 2.0 i

- i 1.0 - 1.0 - i

- 1.0 0 i

rang(A 2) = 3 Voici A3 :

1.0 1.0 - i - 1.0 - i

0 1.0 - i - 1.0

0 - 1.0 1.0 + i

rang(A 3) = 3 Voici A1A2 :

1.0 - 2.0 i 0 - 2.0 - 2.0 i

- i 1.0 - 1.0 - i

- 1.0 + i 0 1.0 + 2.0 i

rang (A1A2) = 3 Voici [A1,A2] :

0 0 0

0 0 0

0 0 0

rang ([A1,A2]) = 0 Voici [A1,A3] :

- 1.0 + i 0 2.0 i

i 0 1.0 + i

1.0 0 1.0 - i

rang(A 1A 3) = 1

Dimension de l’espace engendr´e par E = 3

Dimension de l’alg`ebre de Lie comme espace vectoriel = 4 Base de l’alg`ebre de Lie comme espace vectoriel :

- i 0 - 2.0

0 1.0 0

i 0 2.0 + i

2.0 - i 0 - 2.0 i

- i 1.0 - 1.0 - i

- 1.0 0 i

1.0 1.0 - i - 1.0 - i

0 1.0 - i - 1.0

0 - 1.0 1.0 + i

- 1.0 + i 0 2.0 i

i 0 1.0 + i

1.0 0 1.0 - i

Notes bibliographiques

Les pseudo-inverses sont fr´equemment d´efinies pour les matrices complexes, la trans-pos´ee ´etant remplac´ee par l’adjointe. Parmi les monographies consacr´ees aux pseudo-inverses, citons :

R. M. Pringle, A. A. Rayner,Generalized Inverse Matrices, London, Griffin, 1971.

Une pr´esentation br`eve est donn´ee par :

J. Stoer,Numerische Mathematik 1, Berlin, Springer-Verlag, 1989.

Chapitre 3

D´ ecompositions

Uned´ecompositiond’une matrice carr´eeAest un couple (B, C) de deux matrices carr´ees B et C telles queA=BC. Lorsque ces matrices ont une forme particuli`ere, certaines op´erations, comme la r´esolution de syst`emes lin´eaires, s’en trouvent simplifi´ees. Dans ce chapitre, nous consid´erons trois d´ecompositions : la d´ecompositionLU, la d´ecomposition de Choleski et la d´ecompositionQR. On utilisera aussi ces d´ecompositions pour le calcul des valeurs propres.

3.1 D´ ecomposition LU

Uned´ecompositionLUd’une matrice carr´eeAd’ordrenest un couple (L, U) de matrices carr´ees d’ordre n, avec L unitriangulaire inf´erieure, c’est-`a-dire ayant des 1 sur la diagonale, etU triangulaire sup´erieure, telles que

A=LU

L’int´erˆet de disposer d’une telle d´ecomposition est clair. La r´esolution d’un syst`eme d’´equations lin´eaires

Ax=b

se ram`ene alors `a la r´esolution des deux syst`emes triangulaires Ly=b U x=y

ce qui est particuli`erement simple. De la mˆeme mani`ere, si A est inversible, l’inverse A1=U1L1 s’obtient en inversant deux matrices triangulaires, ce qui est facile. En fait, une matrice quelconque n’admet pas n´ecessairement une d´ecompositionLU.

Proposition 3.1.1. Une matrice inversible A admet une d´ecomposition LU si et seulement si tous ses mineurs principaux sont inversibles; de plus, la d´ecomposition LU est alors unique.

Preuve. Supposons que A ait deux d´ecompositions A = LU = L0U0. Comme A est inversible, L et L0 le sont. Alors L1L0 = U U0−1. La matrice L1L0 est triangulaire inf´erieure et U U0−1 est triangulaire sup´erieure. L’´egalit´e implique qu’elles sont toutes deux diagonales et la premi`ere, donc aussi la deuxi`eme, est en fait la matrice unit´e, montrant queL=L0 etU =U0. Ceci prouve l’unicit´e, qui d’ailleurs d´ecoule aussi de la preuve d’existence qui suit.

L’existence se montre par r´ecurrence sur l’ordre n de A, le cas n = 1 ´etant ´evident.

Consid´erons alors la d´ecomposition par blocs A=

A0 b b0 a

o`uA0 est d’ordren−1. Par r´ecurrence,A0poss`ede une d´ecompositionLU, soit (L0, U0).

Cherchons alors deux matrices d’ordren L=

avecLU =A. On obtient les ´equations

L0u=b vU0=b0 vu+r=a

Les deux premi`eres permettent de d´etermineruetvde fa¸con unique parce queL0 etU0 sont inversibles et la troisi`eme donnerde fa¸con unique. D’o`u l’existence.

R´eciproquement, si A =LU, alors U est inversible et en particulier le produit de ses

´el´ements diagonaux est non nul. Soit 1 ≤k ≤ n et soit A0 le mineur principal deA d’ordrek. Consid´erons la d´ecomposition par blocs

L=

Il n’est pas difficile de v´erifier que, siAposs`ede deux d´ecompositions (L, U) et (L0, U0), alors on a toujoursU =U0. En revanche, l’´egalit´e entre L et L0 ne peut ˆetre assur´ee;

consid´erer par exemple le casU = 0.

Toute matrice inversible A peut ˆetre, par une permutation de ses lignes, transform´ee en une matrice dont les mineurs principaux sont inversibles. Toute matrice inversible poss`ede donc, `a une permutation de ses lignes pr`es, une d´ecompositionLU. La m´ethode appel´ee m´ethode de Crout ou m´ethode de Gauss modernis´ee est un algorithme pour obtenir cette d´ecomposition. Elle consiste en fait en une organisation judicieuse des calculs faits lors de la m´ethode de Gauss.

Dans la m´ethode de Gauss, une op´eration de pivotage peut ˆetre interpr´et´ee comme la multiplication `a gauche par une matrice de Frobenius Gk qui, dans ce cas, est unitri-angulaire inf´erieure. S’il n’y a pas d’´echange de lignes, une matrice A d’ordre n est transform´ee en

Gn1· · ·G2G1A=U

la matrice U est triangulaire sup´erieure et G = Gn1· · ·G2G1 est unitriangulaire inf´erieure. On a donc

A=LU

avecL=G1. En d’autres termes, la m´ethode de Gauss contient de fa¸con cach´ee une m´ethode de d´ecompositionLU.

S’il y a ´echange de lignes dans la m´ethode de Gauss, on a en fait Gn1Pn1· · ·G2P2G1P1A=U o`u lesPk sont des matrices de permutations. Or

Gn1Pn1· · ·G2P2G1P1=P Hn1· · ·H2H1

avecP =Pn1· · ·P2P1 et

Hk = (Pk· · ·P1)1GkPk· · ·P1 1≤k < n

de sorte que la matrice H = P Hn1· · ·H2H1P1 est unitriangulaire inf´erieure et HP A=U; avecL=H1, on a

A=LU

Pour la r´ealisation, nous partons de l’´equation A = LU, avec A = (ai,j), L = (`i,j), U = (ui,j). On suppose`i,j = 0 pourj > iet `i,i = 1 et de mˆemeui,j = 0 pouri > j.

On a alors, en identifiant

ai,k=

min(i,k)

X

j=1

`i,juj,k

d’o`u l’on tire

`i,k= (ai,k

k1

X

j=1

`i,juj,k)/uk,k i > k ui,k =ai,k

i1

X

j=1

`i,juj,k i≤k

Il y a plusieurs strat´egies pour r´esoudre ces ´equations : on peut proc´eder ligne par ligne, colonne par colonne, en diagonale, etc. On peut ´egalement remarquer que chaque coefficient ai,k n’est utilis´e qu’une fois; on peut donc stocker, `a la place de ai,k, le coefficient `i,k, si i > k, et ui,k quand i ≤ k (les ´el´ements diagonaux de L n’ont pas besoin d’ˆetre conserv´es).

Pour pouvoir ´eliminer un pivotuk,k nul, on constate que les formules donnantuk,k et les`i,ksont, `a la division pr`es, formellement les mˆemes. Ceci montre que tout `i,k pour i > kpeut jouer le rˆole deuk,k. On adopte donc la d´emarche suivante : on calcule, pour

chaque colonnek, d’abord des ´el´ements`0i,k et ui,k par les formules ui,k=ai,k

i1

X

j=1

`i,juj,k i≤k

`0i,k = ai,k

kX1 j=1

`i,juj,k i > k

puis l’on cherche un pivot non nul et on fait la division des`0i,k par le pivot. Voici une r´ealisation :

PROCEDURE DecompositionLU (n: integer; VAR a: mat; VAR p: vecE;

VAR inversible: boolean);

Calcule, dansa, la d´ecomposition LU dea, `a une permutation des lignes pr`es. Cette permutation est dans le vecteurp. Sia n’est pas inversible, le bool´een est mis `a faux, mais une partie deapeut ˆetre d´etruite.

VAR

k, q: integer;

FUNCTION PivotMax (k: integer): integer;

Cherche le pivot maximal entreketn.

VAR

i, p: integer;

BEGIN p := k;

FOR i := k + 1 TO n DO

IF abs(a[i, k]) > abs(a[p, k]) THEN p := i;

PivotMax := p END; { de "PivotMax" }

PROCEDURE EchangerLignes (i, j: integer);

VAR

m: integer;

BEGIN

FOR m := 1 TO n DO echanger(a[i, m], a[j, m]);

END; { de "EchangerLignes" } PROCEDURE Decomposer (k: integer);

VAR

i, j: integer;

somme: real;

BEGIN

FOR i := 1 TO n DO BEGIN somme := a[i, k];

FOR j := 1 TO min(i, k) - 1 DO

somme := somme - a[i, j] * a[j, k];

a[i, k] := somme END

END; { de "Decomposer" } PROCEDURE Diviser (k: integer);

VAR

i: integer;

BEGIN

FOR i := k + 1 TO n DO

a[i, k] := a[i, k] / a[k, k]

END; { de "Diviser" } BEGIN { de "DecompositionLU" }

FOR k := 1 TO n DO p[k] := k;

k := 1;

inversible := true;

WHILE (k <= n) AND inversible DO BEGIN Decomposer(k);

q := PivotMax(k);

inversible := NOT EstNul(a[q, k]);

IF inversible THEN BEGIN IF q > k THEN BEGIN

EchangerLignes(k, q);

echangerE(p[q], p[k]) END;

Diviser(k) END;

k := k + 1

END; { du while sur k } END; { de "DecompositionLU" } Voici un exemple de d´ecomposition :

Voici la matrice lue

4.000 2.000 1.000 0.000 2.000 5.000 3.000 5.000 1.000 1.000 1.000 1.000 2.000 1.000 4.000 1.000 Matrice L

1.000 0.000 0.000 0.000 0.500 1.000 0.000 0.000 0.500 0.000 1.000 0.000 0.250 0.125 0.125 1.000 Matrice U

4.000 2.000 1.000 0.000 0.000 4.000 2.500 5.000 0.000 0.000 3.500 1.000 0.000 0.000 0.000 0.250 Vecteur de permutation des lignes

1 2 4 3

Matrice LU

4.000 2.000 1.000 0.000 2.000 5.000 3.000 5.000 2.000 1.000 4.000 1.000 1.000 1.000 1.000 1.000

Les lignes 3 et 4 sont en effet permut´ees. Comme il est d´ej`a dit plus haut, la d´ecompo-sitionLUfacilite la r´esolution d’un syst`eme lin´eaire. Voici une r´ealisation :

PROCEDURE SystemeParCrout (n: integer; a: mat; b: vec; VAR x: vec;

VAR inversible: boolean);

R´esolution du syst`eme d’´equations lin´eaireAx=bpar la m´ethode de Crout. Si Aest inversible,xcontient la solution, sinon le bool´een est faux.

VAR

p: vecE;

PROCEDURE Permuter (b: vec; p: vecE; VAR bp: vec);

VAR

k: integer;

BEGIN

FOR k := 1 TO n DO bp[k] := b[p[k]];

END; { de "Permuter" } BEGIN

DecompositionLU(n, a, p, inversible);

IF inversible THEN BEGIN Permuter(b, p, b);

SystemeUniTriangulaireInferieur(n, a, b, x);

SystemeTriangulaireSuperieur(n, a, x, x);

END

END; { de "SystemeParCrout" }

La proc´edureSystemeTriangulaireSuperieura d´ej`a ´et´e pr´esent´ee au chapitre 1; la proc´edureSystemeUniTriangulaireInferieurci-dessous tient en plus compte du fait que les ´el´ements diagonaux valent 1 pour ne pas faire de division :

PROCEDURE SystemeUniTriangulaireInferieur (n: integer; a: mat; b: vec;

VAR x: vec);

R´esolution d’un syst`eme unitriangulaire inf´erieur.

VAR

k, j: integer;

s: real;

BEGIN

FOR k := 1 TO n DO BEGIN s := b[k];

FOR j := 1 TO k - 1 DO s := s - a[k, j] * x[j];

x[k] := s Pas de division : le coefficient diagonal est1.

END;

END; { de "SystemeUniTriangulaireInferieur" }