• Aucun résultat trouvé

Élimination de Gauss, forme échelonnée

Dans le document Calcul mathématique avec Sage (Page 169-177)

Algèbre linéaire 8

8.2 Calculs sur les matrices

8.2.1 Élimination de Gauss, forme échelonnée

Élimination de Gauss et équivalence à gauche. L’élimination de Gauss est l’une des opérations fondamentales en algèbre linéaire car elle permet d’accéder à une représentation de la matrice à la fois plus adaptée au calcul, comme la résolution de systèmes, et révélant certaines de ses propriétés fondamentales, comme le rang, le déterminant, le profil de rang, etc. Les opérations de base pour l’élimination sont les opérations élémentaires sur les lignes :

– permutation de deux lignes : LiLj,

– ajout d’un multiple d’une ligne à une autre : LiLi+sLj.

Au niveau matriciel, ces transformations correspondent à la multiplication à gauche par les matrices de transpositionTi,jet de transvectionCi,j,sdonnées par :

Ces matrices ont toutes pour déterminant 1 ou −1. Ainsi toute multipli-cation à gauche par un produit de ces matrices peut être vu comme un changement de base préservant les volumes et donc en particulier le déter-minant. En Sage, l’opération de transvection est effectuée par la méthode add_multiple_of_row(i,j,s), et celle de transposition par la méthode swap_rows(i,j).

Étant donné un vecteur colonne x=

dont lak-ième composantexk est inversible, on définit la transformation de Gauss comme la composition

BR

OUILLON

des transvections Ci,k,`i pour i= k+ 1. . . n, avec `i = −xxi

k (peu importe l’ordre étant donné qu’elles commutent). La matrice correspondante est la suivante :

Une transformation de GaussGx,k a pour effet d’éliminer les coefficients du vecteur situés sous le coefficient pivotxk :

Gx,k

Pour une matrice A = [ai,j] de dimension m×n, l’algorithme du pivot de Gauss procède alors itérativement, de la colonne gauche à la colonne droite. En supposant que les k−1 premières colonnes ont déjà été traitées, fournissantp6k−1 pivots, lak-ième est alors traitée de la façon suivante : – trouver la première composante inversibleai,k de la colonneCksur une

lignei > p. On l’appelle le pivot.

– Si aucun pivot n’est trouvé, passer à la colonne suivante.

– Appliquer la transposition Ti,p+1 sur les lignes pour placer le pivot en position (p+ 1, k).

– Appliquer la transformation de Gauss Gx,p+1.

Cet algorithme transforme la matrice A en une matrice triangulaire supérieure. Plus précisément elle aura une forme échelonnée, c’est-à-dire telle que le premier coefficient non nul de chaque ligne se trouve plus à droite que celui de la ligne précédente ; de plus, toutes les lignes nulles se trouvent regroupées en bas de la matrice. Voici un exemple de déroulement de cet algorithme.

BR

OUILLON

sage: u, u*a (

[6 0 0 0] [1 5 5]

[5 1 0 0] [0 0 0]

[6 0 1 0] [0 2 3]

[5 0 0 1], [0 4 6]

)

sage: v=copy(identity_matrix(GF(7),4)); v.swap_rows(1,2);

sage: b=v*u*a; v,b (

[1 0 0 0] [1 5 5]

[0 0 1 0] [0 2 3]

[0 1 0 0] [0 0 0]

[0 0 0 1], [0 4 6]

)

sage: w=copy(identity_matrix(GF(7),4));

sage: w[1:,1]=-b[1:,1]/b[1,1]; w, w*b (

[1 0 0 0] [1 5 5]

[0 6 0 0] [0 5 4]

[0 0 1 0] [0 0 0]

[0 5 0 1], [0 0 0]

)

Élimination de Gauss-Jordan. La transformation de Gauss-Jordan est similaire à celle de Gauss, en ajoutant àGx,k les transvections correspondant aux lignes d’indicei < k; cela revient à éliminer les coefficients d’une colonne au-dessus et au-dessous du pivot. Si de plus on divise chaque ligne par son pivot, on obtient alors une forme échelonnée diteréduiteencore appelée forme de Gauss-Jordan. Pour toute classe d’équivalence de matrices, il n’existe qu’une unique matrice sous cette forme ; il s’agit donc d’une forme normale.

Définition. Une matrice est dite sous forme échelonnée réduite si – toutes les lignes nulles sont en bas de la matrice,

– le premier coefficient non nul de chaque ligne non nulle, appelé le pivot, est un 1, et est situé à droite du pivot de la ligne précédente,

– les pivots sont les seuls coefficients non nuls au sein de leur colonne.

Théorème. Pour toute matrice A de dimension m×nà coefficients dans un corps, il existe une unique matrice R de dimension m×n sous forme échelonnée réduite et une matrice inversible U de dimension m×m telles queU A=R. Il s’agit de la décomposition de Gauss-Jordan.

En Sage, la forme échelonnée réduite est donnée par les méthodes echelonizeetechelon_form. La première remplace la matrice initiale par sa forme échelonnée réduite alors que la deuxième renvoie une matrice

BR

OUILLON

immuable sans modifier la matrice initiale.

sage: A=matrix(GF(7),4,5,[4,4,0,2,4,5,1,6,5,4,1,1,0,1,0,

... 5,1,6,6,2]); A, A.echelon_form()

(

Plusieurs variantes de l’élimination de Gauss s’interprètent sous la forme de différentes décompositions matricielles, parfois utiles pour le calcul : les décompositionsA=LU pour les matrices génériques, A=LU P, pour les matrices régulières,A=LSP, A=LQU P ouA=P LU Qpour les matrices de rang quelconque. Les matricesL sont triangulaires inférieures (en anglais Lower triangular), U triangulaires supérieures (Upper triangular), et les matricesP, Qsont des permutations. Si ces dernières sont algorithmiquement moins coûteuses que la forme échelonnée réduite, elles n’offrent pas l’avantage de fournir une forme normale.

Forme échelonnée dans les anneaux euclidiens. Dans un anneau euclidien, les coefficients non nuls ne sont pas nécessairement inversibles, et l’élimination de Gauss consisterait donc à choisir le premier élément inversible de la colonne courante pour pivot. Ainsi certaines colonnes non nulles peuvent ne pas contenir de pivot et l’élimination n’est alors plus possible.

Il est cependant toujours possible de définir une transformation unimodu-laire éliminant le coefficient de tête d’une ligne avec celui d’une autre, grâce à l’algorithme d’Euclide étendu.

Soit A=

"

ab

#

et soitg = pgcd(a, b). Soientu et v les coefficients de Bézout fournis par l’algorithme d’Euclide étendu appliqué àaetb (tels que g=ua+vb), ets=b/g, t=−a/gtels que

Cette transformation est unimodulaire car det "

u v s t

#!

= 1.

Par ailleurs, comme pour Gauss-Jordan, on peut toujours ajouter des multiples de la ligne pivot aux lignes supérieures afin de réduire leurs coeffi-cients dans la même colonne modulo le pivotg. Cette opération effectuée itérativement sur toutes les colonnes de la matrice produit la forme normale de Hermite.

Définition. Une matrice est dite sous forme de Hermite si – ses lignes nulles sont en bas,

BR

OUILLON

– le premier coefficient non nul de chaque ligne, appelé le pivot, se trouve à droite de celui de la ligne supérieure,

– tous les coefficients au-dessus du pivot sont réduits modulo le pivot.

Théorème. Pour toute matrice A de dimension m×nà coefficients dans un anneau euclidien, il existe une unique matrice H de dimension m×n sous forme de Hermite et une matriceU unimodulaire, de dimension m×m telles que U A=H.

Dans le cas d’un corps, la forme de Hermite correspond à la forme échelonnée réduite, ou forme de Gauss-Jordan. En effet, dans ce cas, tous les pivots sont inversibles, chaque ligne peut être divisée par son pivot, et les coefficients au-dessus de celui-ci peuvent être à nouveau éliminés par des transformations de Gauss, produisant ainsi une forme échelonnée réduite. En Sage, il n’y a donc qu’une seule méthode : echelon_form, qui retourne soit la forme de Hermite, soit la forme échelonnée réduite, selon que la matrice est à coefficients dans un anneau ou dans un corps.

Par exemple, pour une matrice à coefficients dans Z, on obtient les deux formes échelonnées différentes, selon que le domaine de base soitZ ouQ :

sage: a=matrix(ZZ, 4, 6, [2,1,2,2,2,-1,1,2,-1,2,1,-1,2,1,-1,\

... -1,2,2,2,1,1,-1,-1,-1]); a.echelon_form() [ 1 2 0 5 4 -1]

[ 0 3 0 2 -6 -7]

[ 0 0 1 3 3 0]

[ 0 0 0 6 9 3]

sage: a.base_extend(QQ).echelon_form()

[ 1 0 0 0 5/2 11/6]

[ 0 1 0 0 -3 -8/3]

[ 0 0 1 0 -3/2 -3/2]

[ 0 0 0 1 3/2 1/2]

Pour les matrices surZ, la forme normale de Hermite est aussi accessible par la fonctionhermite_form. Pour obtenir la matrice de passage U telle queU A=H, on peut utiliser l’optiontransformation=True.

sage: A=matrix(ZZ,4,5,[4,4,0,2,4,5,1,6,5,4,\

... 1,1,0,1,0,5,1,6,6,2])

sage: E,U=A.echelon_form(transformation=True); E,U (

[ 1 1 0 0 2] [ 0 1 1 -1]

[ 0 4 -6 0 -4] [ 0 -1 5 0]

[ 0 0 0 1 -2] [ 0 -1 0 1]

[ 0 0 0 0 0], [ 1 -2 -4 2]

)

Facteurs invariants et forme normale de Smith. Si l’on s’autorise à éliminer plus avant la forme de Hermite par des transformations

unimodu-BR

OUILLON

laires à droite, on peut alors obtenir une forme diagonale canonique, appelée forme normale de Smith. Ses coefficients diagonaux sont appelés lesfacteurs invariants (en anglaiselementary divisors) de la matrice. Ils sont totalement ordonnés pour la divisibilité (i.e.si|si+1).

Théorème. Pour toute matriceAde dimension m×net à coefficients dans un anneau principal, il existe des matrices unimodulairesU etV de dimension m×m et n×net une unique matrice diagonale S=diag(s1, . . . , sminm,n) telles que S=U AV. Les coefficients si vérifientsi |si+1 et sont appelés les facteurs invariants deA.

EnSage, la méthodeelementary_divisorsrenvoie la liste des facteurs invariants. On peut par ailleurs calculer la forme normale de Smith ainsi que les matrices de passages U etV par la commandesmith_form.

sage: A=matrix(ZZ,4,5,[-1,-1,-1,-2,-2,-2,1,1,-1,2,2,2,2,2,-1,\

... 2,2,2,2,2])

sage: A.smith_form() (

[ 0 -2 -1 -5 0]

[1 0 0 0 0] [ 1 0 0 0] [ 1 0 1 -1 -1]

[0 1 0 0 0] [ 0 0 1 0] [ 0 0 0 0 1]

[0 0 3 0 0] [-2 1 0 0] [-1 2 0 5 0]

[0 0 0 6 0], [ 0 0 -2 -1], [ 0 -1 0 -2 0]

)

sage: S,U,V=A.smith_form(); S [1 0 0 0 0]

[0 1 0 0 0]

[0 0 3 0 0]

[0 0 0 6 0]

sage: A.elementary_divisors() [1, 1, 3, 6]

sage: S==U*A*V True

Rang, profil de rang et pivots. L’élimination de Gauss révèle de nom-breux invariants de la matrice, tels que son rang et son déterminant (qui peut être lu comme le produit des pivots). Ils sont accessibles par les fonctionsdet et rank. Ces valeurs seront mises en cache, et ne seront donc pas recalculées lors d’un deuxième appel.

Plus généralement, la notion de profil de rang est très utile, lorsque l’on considère la matrice comme une séquence de vecteurs.

Définition. Le profil de rang par colonne d’une matrice m×n Ade rang r est la séquence de r indices lexicographiquement minimale, telle que les colonnes correspondantes dansA sont linéairement indépendantes.

Le profil de rang se lit directement sur la forme échelonnée réduite,

BR

OUILLON

comme la séquence des indices des pivots. Il est calculé par la fonction pivots. Lorsque la forme échelonnée réduite a déjà été calculée, le profil de rang est aussi mémorisé dans le cache, et peut être obtenu sans calcul supplémentaire.

Le profil de rang par ligne se définit de manière similaire, en considérant la matrice comme une séquence demvecteurs ligne. Il s’obtient par la commande pivot_rows ou comme sous-produit de la forme échelonnée réduite de la matrice transposée.

sage: B=matrix(GF(7),5,4,[4,5,1,5,4,1,1,1,0,6,0,6,2,5,1,6,\

... 4,4,0,2])

sage: B.transpose().echelon_form() [1 0 5 0 3]

[0 1 2 0 6]

[0 0 0 1 5]

[0 0 0 0 0]

sage: B.pivot_rows() (0, 1, 3)

sage: B.transpose().pivots() == B.pivot_rows() True

8.2.2 Résolution de systèmes ; image et base du noyau Résolution de systèmes. Un système linéaire peut être représenté par une matriceA et un vecteurbsoit à droite :Ax=b, soit à gauche :tx A=b.

Les fonctions solve_right et solve_left effectuent leur résolution. On peut aussi utiliser de façon équivalente les opérateursA\bet b/A. Lorsque le système est donné par une matrice à coefficients dans un anneau, la résolution est systématiquement effectuée dans le corps des fractions de cet anneau (e.g., QpourZouK(X) pourK[X]). On verra plus loin comment la résolution peut être faite dans l’anneau lui-même. Le membre de droite dans l’égalité du système peut être aussi bien un vecteur qu’une matrice (ce qui correspond à résoudre plusieurs systèmes linéaires simultanément, avec la même matrice).

Les matrices des systèmes peuvent être rectangulaires, et admettre une unique, aucune ou une infinité de solutions. Dans ce dernier cas, les fonctions solverenvoient l’une de ces solutions, en mettant à zéro les composantes linéairement indépendantes.

sage: R.<x>=PolynomialRing(GF(5),'x')

sage: A=random_matrix(R,2,3); A # random [ 3*x^2 + x x^2 + 2*x 2*x^2 + 2]

[ x^2 + x + 2 2*x^2 + 4*x + 3 x^2 + 4*x + 3]

sage: b=random_matrix(R,2,1); b # random [ 4*x^2 + 1]

[3*x^2 + 2*x]

sage: A.solve_right(b) # random

BR

OUILLON

[(4*x^3 + 2*x + 4)/(3*x^3 + 2*x^2 + 2*x)]

[ (3*x^2 + 4*x + 3)/(x^3 + 4*x^2 + 4*x)]

[ 0]

Image et noyau. Interprétée comme une application linéaire Φ, une ma-triceA de dimensionm×n définit deux sous-espaces vectoriels deKm et Kn, respectivement l’image et le noyau de Φ.

L’image est l’ensemble des vecteurs de Km obtenus par combinaisons linéaires des colonnes deA. Il s’obtient par la fonctionimagequi renvoie un espace vectoriel dont la base est sous forme échelonnée réduite.

Le noyau est le sous-espace vectoriel de Kn des vecteurs x tels que Ax = 0. Obtenir une base de ce sous-espace sert en particulier à décrire l’ensemble des solutions d’un système linéaire, lorsque celui-ci en possède une infinité : si x est une solution de Ax = b et V le noyau de A, alors l’ensemble des solutions s’écrit simplementx+V. Il s’obtient par la fonction right_kernel qui renvoie l’espace vectoriel ainsi qu’une base mise sous forme échelonnée réduite. On peut naturellement aussi définir le noyau à gauche (l’ensemble des x dans Km tels que tx A = 0), qui correspond au noyau à droite de la transposée deA (i.e., l’adjoint de Φ). Il s’obtient avec la fonctionleft_kernel. Par convention, la fonctionkernelretourne le noyau à gauche. De plus les bases sont données comme des matrices de vecteurs lignes dans les deux cas.

sage: a=matrix(QQ,3,5,[2,2,-1,-2,-1,2,-1,1,2,-1/2,2,-2,\

... -1,2,-1/2])

sage: a.image()

Vector space of degree 5 and dimension 3 over Rational Field Basis matrix:

[ 1 0 0 1/4 -11/32]

[ 0 1 0 -1 -1/8]

[ 0 0 1 1/2 1/16]

sage: a.right_kernel()

Vector space of degree 5 and dimension 2 over Rational Field Basis matrix:

[ 1 0 0 -1/3 8/3]

[ 0 1 -1/2 11/12 2/3]

La notion de noyau se généralise naturellement au cas où les coefficients ne sont plus dans un corps ; il s’agit alors d’un module libre. En particulier, pour une matrice définie dans un corps de fraction, on obtiendra le noyau dans l’anneau de base par la commande integer_kernel. Par exemple, pour une matrice à coefficients dansZ, plongée dans l’espace vectoriel des matrices à coefficients dans Q, on pourra calculer aussi bien son noyau comme un sous-espace vectoriel de Qm ou comme un module libre de Zm.

BR

OUILLON

sage: a=matrix(ZZ,5,3,[1,1,122,-1,-2,1,-188,2,1,1,-10,1,\

... -1,-1,-1])

sage: a.kernel()

Free module of degree 5 and rank 2 over Integer Ring Echelon basis matrix:

[ 1 979 -11 -279 811]

[ 0 2079 -22 -569 1488]

sage: b=a.base_extend(QQ) sage: b.kernel()

Vector space of degree 5 and dimension 2 over Rational Field Basis matrix:

[ 1 0 -121/189 -2090/189 6949/63]

[ 0 1 -2/189 -569/2079 496/693]

sage: b.integer_kernel()

Free module of degree 5 and rank 2 over Integer Ring Echelon basis matrix:

[ 1 979 -11 -279 811]

[ 0 2079 -22 -569 1488]

sage: b.integer_kernel() == a.kernel() True

8.2.3 Valeurs propres, forme de Jordan et transformations

Dans le document Calcul mathématique avec Sage (Page 169-177)