Algèbre linéaire/Systèmes d'équations linéaires

De testwiki
Aller à la navigation Aller à la recherche

Systèmes d'équations linéaires et matrices

Résolution de systèmes d'équations linéaires

2x+y+z=1

3x+3y-z=5

x-2y+3z=2

2x+y+z=1

3y+z=7

-3y+5z=3

2x+y+z=1

3y+z=7

6z=10

donc z=6/10=3/5 et y=

Systèmes de deux équations linéaires à deux inconnues

Factorisation LU d'une matrice

Certains systèmes d'équations linéaires sont plus faciles à résoudre que d'autres. Un cas particulier de système facile à résoudre est un système d'équations triangulaire tel que

a11x1+a12x2+a13x3=b1a22x2+a23x3=b2a33x3=b3.

La factorisation LU d'une matrice permet de transformer un système d'équations linéaires en deux systèmes d'équations triangulaires. En effet, si A=LU avec L une matrice triangulaire inférieure et U une matrice triangulaire supérieure (la notation LU prend son origine de l'anglais L pour lower et U pour upper) alors résoudre Ax=b est équivalent à résoudre LUx=b qui peut se faire en résolvant les deux systèmes triangulaires Lz=b et Ux=z.


Factorisation LU sans permutation

Pour alléger l'écriture, nous allons montrer comment faire une factorisation LU sur un exemple simple d'une matrice 3×3. Le lecteur devrait être capable de généraliser facilement la procédure à des matrices carrées d'autres dimensions. Soit A la matrice que l'on veut factoriser :

A=(211434228)

Nous transformerons la matrice A en une matrice triangulaire supérieure par des opérations linéaires sur les lignes, ce sera la matrice U, la matrice L pourra être récupérée simplement en prenant note des opérations effectuées. Pour faire la factorisation, nous procédons par colonne. Nous voulons mettre des zéros dans la première colonne partout sous le premier élément, ce premier élément que l'on n'annule pas est appelé le pivot. Pour mettre un zéro à la position a21, nous retranchons 2 fois la première ligne de la deuxième. Le nombre de fois qu'il faut soustraire la première ligne est bien entendu obtenu en divisant l'élément a21 par le pivot a11, nous obtenons :

(211012228).

Nous devons garder en mémoire l'opération qui a été faite de manière à pouvoir construire la matrice L, alors appelons l21 le facteur de l'opération effectuée, c'est-à-dire le nombre de fois que l'on a soustrait la première ligne à la deuxième, ici nous avons l21=2.

Continuons avec l'élément suivant sur la première colonne. Nous voulons mettre un zéro à la position a31. Cette fois il nous faudra ajouter la ligne 1 à la ligne 3 ; à l'opération précédente nous avions pris en note combien de fois nous avions soustrait la ligne 1 à la ligne 2. Pour être constant dans notre façon de noter les opération et parce que, comme nous le verrons plus loin, c'est beaucoup plus pratique, nous noterons toujours combien de fois nous soustrayons les lignes. Au lieu de noter que nous ajoutons une fois la ligne 1 à la ligne 3, nous noterons que nous soustrayons moins une fois la ligne 1 à la ligne 3, donc l31=1 et nous avons maintenant la matrice :

(211012039).

PASSONS maintenant à la deuxième colonne. Il nous faut choisir un nouveau pivot sur la deuxième colonne. Nous ne pouvons pas choisir le pivot sur la première ligne sinon nous remplirons la première colonne en annulant les entrées dans la deuxième colonne. Prenons donc l'élément à la position 2,2 pour pivot. L'opération pour mettre un zéro à la position 3,2 sera de soustraire 3 fois la deuxième ligne à la troisième ligne. Nous obtenons notre matrice triangulaire supérieure :

(211012003).

Et nous notons le facteur de l'opération l32=3. La matrice L est obtenue en mettant des zéros au-dessus de la diagonale, des un sur la diagonale et les coefficients pris en note à leur position respective sous la diagonale c'est-à-dire :

L=(100l2110l31l321)=(100210131).

Avant de démontrer pourquoi cela fonctionne, vérifions-le sur cet exemple en faisant le produit :

A=LU=(100210131)(211012003)=(211434228).


Pour voir pourquoi les matrices L et U obtenues selon la procédure décrite ci-haut sont bien des facteurs de la matrice A nous introduisons des matrices de soustraction de lignes Eij(c). Ces matrices sont obtenus en mettant des 1 sur la diagonale et l'élément c à la position i,j. Par exemple, pour les matrices 3×3 :

E21(2)=(100210001).

On peut voir que pré-multiplier une matrice par E21(2) a pour effet de soustraire deux fois la première ligne à la deuxième ligne. Et de manière générale, pré-multiplier une matrice par Eij(c) a pour effet de soustraire c fois la ligne j à la ligne i. Donc la triangularisation que l'on a faite ci-haut peut s'écrire

U=E32(3)E31(1)E21(2)A.

L'inverse d'une matrice Eij(c) est facile à déterminer. L'inverse est simplement Eij(c), en effet Eij(c)Eij(c)=I. En multipliant à gauche l'équation de U ci-haut par E32(3) on obtient:

E32(3)U=E32(3)E32(3)E31(1)E21(2)A=E31(1)E21(2)A.

Et en remultipliant successivement par E31(1) et E21(2), on obtient

E21(2)E31(1)E32(3)U=E21(2)E31(1)E31(1)E21(2)A=A.

Nous laissons au lecteur l'exercice de vérifier que :

E21(2)E31(1)E32(3)=L.

Résoudre un système d'équation linéaire par factorisation LU de la matrice

Soit à résoudre le système d'équations

2x1+x2+x3=34x1+3x2+4x3=92x1+2x2+8x3=12.

Il est plus pratique d'utiliser la notation matricielle pour écrire le système d'équation, alors dorénavant nous n'écrirons plus de système d'équation tel que ci-haut, nous l'écrirons sous la forme Ax=b, c'est-à-dire:

(211434228)(x1x2x3)=(3912).

Nous reconnaissons dans ce problème la matrice A de la section précédente. Le problème est donc équivalent à résoudre LUx=b :

(100210131)(211012003)(x1x2x3)=(3912).

Pour résoudre ce problème on commence par faire la substitution Ux=z. Le problème se résout donc en deux étapes, premièrement on résout Lz=b, c'est une descente triangulaire:

(100210131)(z1z2z3)=(3912).

La première ligne nous donne z1=3. Ce que l'on peut introduire dans la deuxième ligne qui devient 23+z2=9, d'où z2=3. On introduit ces deux valeurs dans la troisième ligne qui devient 13+33+z3=12, ce qui donne z3=6.

Deuxièmement on résoud la remontée triangulaire Ux=z

(211012003)(x1x2x3)=(336).

La troisième ligne nous donne 3x3=6, c'est-à-dire x3=2. Que l'on insère dans la deuxième ligne, ce qui donne x2+22=3, donc x2=1. Finalement, on introduit x1 et x2 dans la première ligne pour avoir 2x11+2=3 et x1=1.

Les descentes et remontées triangulaires se font relativement rapidement, ce qui permet si on a plusieurs systèmes d'équations linéaire ayant la même matrice de toutes les résoudre à peu de frais une fois la matrice factorisé. Nous verrons, plusieurs situations où cela s'avère utile tout au long de ce livre.

Factorisation PLU

Factorisation LDU

Méthode de Gauss-Jordan

Méthode de Gauss-Jordan

C'est une méthode permettant la mise sous carré d'une forme quadratique.

Chaînes de Markov

Équations chimiques

Temps d'exécutions et considérations numériques

Méthodes d'ordre inférieur à O(n3)

Note : Cette section introduit des notions qui sont peu utilisées et difficilement utilisables. De plus les notions de cette sections ne serviront pas dans le reste de ce livre. Le lecteur peut donc sans crainte passer à la section suivante.


Multiplication rapide de matrices

La méthode de multiplication suivante est appelé l'algorithme de Strassen, ou multiplication rapide de matrices. Soient A et B les matrices:

A=(a11a12a21a22) et B=(b11b12b21b22).

La méthode standard pour multiplier ces deux matrices demandes 8 multiplications scalaires. Mais il est possible de faire cette multiplication matricielle avec une multiplication scalaire de moins de la manière suivante.

On pose:

p1=(a11+a22)(b11+b22)
p2:=(a21+a22)b11
p3:=a11(b12b22)
p4:=a22(b21b11)
p5:=(a11+a12)b22
p6:=a21a11)(b11+b12)
p7:=(a12a22)(b21+b22)

On peut voir que

AB=(p1+p4p5+p7p3+p5p2+p4p1p2+p3+p6).

Cette façon de multiplier ces deux matrices peut sembler compliquée et contre-intuitive et à première vue le gain n'est pas très important, on économise une multiplication au prix de 14 additions (ou soustraction) supplémentaires. Là où cette méthode devient plus intéressante, c'est lorsque les matrices sont de plus grande taille. Si les matrices A et B était des matrices 200×200 au-lieu de matrices 2×2, alors nous pourrions utiliser le même procédé mais en utilisant des sous-matrices de taille 100×100 à la place des scalaires. On économise alors un produit matricielle 100×100 au coût de 14 additions matricielles 100×100. Les produits matriciels 100×100 exigent environ 1003 additions et multiplications scalaires lorsqu'ils sont faits de façon standard mais les additions matricielles 100×100 ne demandent que 1002 additions. Donc le produit matriciel économisé prendrait beaucoup plus de temps de calcul que les 14 additions matricielles supplémentaires.

De plus, il est possible d'itérer ce processus. Si on veut multiplier 2 matrices de dimension 2n, on peut utiliser l'algorithme ci-dessus avec des sous-matrices de dimension 2n1×2n1 et faire chacune des 7 multiplications nécessaires en utilisant la même méthode avec des sous-matrices de dimension 2n2×2n2. On peut donc multiplier deux matrices de dimension 2n×2n en ne faisant que 7n multiplications scalaires comparativement à (2n)3=8n multiplications scalaires pour la méthode standard.

Si on veut multiplier deux très grandes matrices dont les dimensions ne sont pas des puissances de deux, on peut utiliser la même procédure simplement en complétant les matrices par des zéros et des uns sur la diagonale pour obtenir une dimension qui est puissance de 2. Il suffira ensuite de tronquer les lignes et les colonnes artificielles dans le résultat.

Résoudre des systèmes d'équations linéaires en utilisant la multiplication rapide de matrices

Pour résoudre un système d"équation linéaire Ax=b en utilisant la multiplication rapide des matrices, on commence par calculer l'inverse de la matrice A. Pour ce faire on utilise une notation par block de la matrice. Si a est une matrice de dimension 2n×2n, alors on forme les sous matrices de dimensions n×n: A11, A12, A21 et A22 de manière à ce que

A=(A11A12A21A22).

Alors l'inverse de la matrice A peut s'écrire:

A1=(A111+A111A12(A22A21A111A12)1A21A111A111A12(A22A21A111A12)1(A22A21A111A12)1A21A111(A22A21A111A12)1).

Cela nécessite de calculer 2 inverses de matrices et 5 produits matricielles tous de dimensions n×n. En effet il suffit de calculer les inverses

A111
(A22A21A111A12)1

et de faire les produits matricielle

A111A12
A21(A111A12)
(A111A12)(A22A21A111A12)1)
((A22A21A111A12)1)A21
((A22A21A111A12)1A21)A111

En calculant ces produits matricielle et ces matrices inverses en utilisant la multiplication rapide et cette méthode d'inversion de manière récursive le nombre d'opération nécessaire pour inverser une matrice de dimension n×n est de l'ordre de O(nlog2(7)).

Les méthodes de multiplication rapide et d'inversion rapide de matrice d'écrite ici ne sont pas optimales. On peut construire des méthodes plus élaborer de multiplication de matrices par exemple on peut multiplier des matrices 3×3 plus efficacement que les matrices 2×2 par un astuce similaire à celle décrite ci-dessus mais plus élaborée. Il est possible de développer ce genre d'astuce de plus en plus élaborer sur des matrices de plus en plus grande. Il est possible d'avoir des méthodes dont la complexité numérique pour une matrice n×n est de l'ordre de O(n2,376) ce qui est bien moins que le O(nlog2(7)O(n2,808). Cependant toutes ces méthodes ont des problèmes de stabilités numériques, c'est-à-dire que de petites erreurs d'arrondie peuvent avoir des conséquences désastreuses sur les résultats. Pour cette raison, ces méthodes ne sont pas utilisées. Peut-être un jour trouvera-t-on une solution à ces problèmes d'instabilités numériques.

Systèmes indéterminés et systèmes surdéterminés

Valeurs propres et vecteurs propres

Programmation linéaire

Méthode du Simplex

Dualité

Systèmes d'équations linéaires et matrices

Résolution de systèmes d'équations linéaires

Systèmes de deux équations à deux inconnues

2x+4y_3=0.

Factorisation LU d'une matrice

Certains systèmes d'équations linéaires sont plus faciles à résoudre que d'autres. Un cas particulier de système facile à résoudre est un système d'équations triangulaire tel que

a11x1+a12x2+a13x3=b1a22x2+a23x3=b2a33x3=b3.

La factorisation LU d'une matrice permet de transformer un système d'équations linéaires en deux systèmes d'équations triangulaires. En effet, si A=LU avec L une matrice triangulaire inférieure et U une matrice triangulaire supérieure (la notation LU prend son origine de l'anglais L pour lower et U pour upper) alors résoudre Ax=b est équivalent à résoudre LUx=b qui peut se faire en résolvant les deux systèmes triangulaires Lz=b et Ux=z.


Factorisation LU sans permutation

Pour alléger l'écriture, nous allons montrer comment faire une factorisation LU sur un exemple simple d'une matrice 3×3. Le lecteur devrait être capable de généraliser facilement la procédure à des matrices carrées d'autres dimensions. Soit A la matrice que l'on veut factoriser :

A=(211434228)

Nous transformerons la matrice A en une matrice triangulaire supérieure par des opérations linéaires sur les lignes, ce sera la matrice U, la matrice L pourra être récupérée simplement en prenant note des opérations effectuées. Pour faire la factorisation, nous procédons par colonne. Nous voulons mettre des zéros dans la première colonne partout sous le premier élément, ce premier élément que l'on n'annule pas est appelé le pivot. Pour mettre un zéro à la position a21, nous retranchons 2 fois la première ligne de la deuxième. Le nombre de fois qu'il faut soustraire la première ligne est bien entendu obtenu en divisant l'élément a21 par le pivot a11, nous obtenons :

(211012228).

Nous devons garder en mémoire l'opération qui a été faite de manière à pouvoir construire la matrice L, alors appelons l21 le facteur de l'opération effectuée, c'est-à-dire le nombre de fois que l'on a soustrait la première ligne à la deuxième, ici nous avons l21=2.

Continuons avec l'élément suivant sur la première colonne. Nous voulons mettre un zéro à la position a31. Cette fois il nous faudra ajouter la ligne 1 à la ligne 3 ; à l'opération précédente nous avions pris en note combien de fois nous avions soustrait la ligne 1 à la ligne 2. Pour être constant dans notre façon de noter les opération et parce que, comme nous le verrons plus loin, c'est beaucoup plus pratique, nous noterons toujours combien de fois nous soustrayons les lignes. Au lieu de noter que nous ajoutons une fois la ligne 1 à la ligne 3, nous noterons que nous soustrayons moins une fois la ligne 1 à la ligne 3, donc l31=1 et nous avons maintenant la matrice :

(211012039).

PASSONS maintenant à la deuxième colonne. Il nous faut choisir un nouveau pivot sur la deuxième colonne. Nous ne pouvons pas choisir le pivot sur la première ligne sinon nous remplirons la première colonne en annulant les entrées dans la deuxième colonne. Prenons donc l'élément à la position 2,2 pour pivot. L'opération pour mettre un zéro à la position 3,2 sera de soustraire 3 fois la deuxième ligne à la troisième ligne. Nous obtenons notre matrice triangulaire supérieure :

(211012003).

Et nous notons le facteur de l'opération l32=3. La matrice L est obtenue en mettant des zéros au-dessus de la diagonale, des un sur la diagonale et les coefficients pris en note à leur position respective sous la diagonale c'est-à-dire :

L=(100l2110l31l321)=(100210131).

Avant de démontrer pourquoi cela fonctionne, vérifions-le sur cet exemple en faisant le produit :

A=LU=(100210131)(211012003)=(211434228).


Pour voir pourquoi les matrices L et U obtenues selon la procédure décrite ci-haut sont bien des facteurs de la matrice A nous introduisons des matrices de soustraction de lignes Eij(c). Ces matrices sont obtenus en mettant des 1 sur la diagonale et l'élément c à la position i,j. Par exemple, pour les matrices 3×3 :

E21(2)=(100210001).

On peut voir que pré-multiplier une matrice par E21(2) a pour effet de soustraire deux fois la première ligne à la deuxième ligne. Et de manière générale, pré-multiplier une matrice par Eij(c) a pour effet de soustraire c fois la ligne j à la ligne i. Donc la triangularisation que l'on a faite ci-haut peut s'écrire

U=E32(3)E31(1)E21(2)A.

L'inverse d'une matrice Eij(c) est facile à déterminer. L'inverse est simplement Eij(c), en effet Eij(c)Eij(c)=I. En multipliant à gauche l'équation de U ci-haut par E32(3) on obtient:

E32(3)U=E32(3)E32(3)E31(1)E21(2)A=E31(1)E21(2)A.

Et en remultipliant successivement par E31(1) et E21(2), on obtient

E21(2)E31(1)E32(3)U=E21(2)E31(1)E31(1)E21(2)A=A.

Nous laissons au lecteur l'exercice de vérifier que :

E21(2)E31(1)E32(3)=L.

Résoudre un système d'équation linéaire par factorisation LU de la matrice

Soit à résoudre le système d'équations

2x1+x2+x3=34x1+3x2+4x3=92x1+2x2+8x3=12.

Il est plus pratique d'utiliser la notation matricielle pour écrire le système d'équation, alors dorénavant nous n'écrirons plus de système d'équation tel que ci-haut, nous l'écrirons sous la forme Ax=b, c'est-à-dire:

(211434228)(x1x2x3)=(3912).

Nous reconnaissons dans ce problème la matrice A de la section précédente. Le problème est donc équivalent à résoudre LUx=b :

(100210131)(211012003)(x1x2x3)=(3912).

Pour résoudre ce problème on commence par faire la substitution Ux=z. Le problème se résout donc en deux étapes, premièrement on résout Lz=b, c'est une descente triangulaire:

(100210131)(z1z2z3)=(3912).

La première ligne nous donne z1=3. Ce que l'on peut introduire dans la deuxième ligne qui devient 23+z2=9, d'où z2=3. On introduit ces deux valeurs dans la troisième ligne qui devient 13+33+z3=12, ce qui donne z3=6.

Deuxièmement on résout la remontée triangulaire Ux=z

(211012003)(x1x2x3)=(336).

La troisième ligne nous donne 3x3=6, c'est-à-dire x3=2. Que l'on insère dans la deuxième ligne, ce qui donne x2+22=3, donc x2=1. Finalement, on introduit x1 et x2 dans la première ligne pour avoir 2x11+2=3 et x1=1.

Les descentes et remontées triangulaires se font relativement rapidement, ce qui permet si on a plusieurs systèmes d'équations linéaire ayant la même matrice de toutes les résoudre à peu de frais une fois la matrice factorisé. Nous verrons, plusieurs situations où cela s'avère utile tout au long de ce livre.

Factorisation PLU

Factorisation LDU

Méthode de Gauss-Jordan

Méthode de Gauss-Jordan

C'est une méthode permettant la mise sous carré d'une forme quadratique.

Chaînes de Markov

Équations chimiques

Temps d'exécutions et considérations numériques

Méthodes d'ordre inférieur à O(n3)

Note : Cette section introduit des notions qui sont peu utilisées et difficilement utilisables. De plus les notions de cette sections ne serviront pas dans le reste de ce livre. Le lecteur peut donc sans crainte passer à la section suivante.


Multiplication rapide de matrices

La méthode de multiplication suivante est appelé l'algorithme de Strassen, ou multiplication rapide de matrices. Soient A et B les matrices:

A=(a11a12a21a22) et B=(b11b12b21b22).

La méthode standard pour multiplier ces deux matrices demandes 8 multiplications scalaires. Mais il est possible de faire cette multiplication matricielle avec une multiplication scalaire de moins de la manière suivante.

On pose:

p1=(a11+a22)(b11+b22)
p2:=(a21+a22)b11
p3:=a11(b12b22)
p4:=a22(b21b11)
p5:=(a11+a12)b22
p6:=a21a11)(b11+b12)
p7:=(a12a22)(b21+b22)

On peut voir que

AB=(p1+p4p5+p7p3+p5p2+p4p1p2+p3+p6).

Cette façon de multiplier ces deux matrices peut sembler compliquée et contre-intuitive et à première vue le gain n'est pas très important, on économise une multiplication au prix de 14 additions (ou soustraction) supplémentaires. Là où cette méthode devient plus intéressante, c'est lorsque les matrices sont de plus grande taille. Si les matrices A et B était des matrices 200×200 au-lieu de matrices 2×2, alors nous pourrions utiliser le même procédé mais en utilisant des sous-matrices de taille 100×100 à la place des scalaires. On économise alors un produit matricielle 100×100 au coût de 14 additions matricielles 100×100. Les produits matriciels 100×100 exigent environ 1003 additions et multiplications scalaires lorsqu'ils sont faits de façon standard mais les additions matricielles 100×100 ne demandent que 1002 additions. Donc le produit matriciel économisé prendrait beaucoup plus de temps de calcul que les 14 additions matricielles supplémentaires.

De plus, il est possible d'itérer ce processus. Si on veut multiplier 2 matrices de dimension 2n, on peut utiliser l'algorithme ci-dessus avec des sous-matrices de dimension 2n1×2n1 et faire chacune des 7 multiplications nécessaires en utilisant la même méthode avec des sous-matrices de dimension 2n2×2n2. On peut donc multiplier deux matrices de dimension 2n×2n en ne faisant que 7n multiplications scalaires comparativement à (2n)3=8n multiplications scalaires pour la méthode standard.

Si on veut multiplier deux très grandes matrices dont les dimensions ne sont pas des puissances de deux, on peut utiliser la même procédure simplement en complétant les matrices par des zéros et des uns sur la diagonale pour obtenir une dimension qui est puissance de 2. Il suffira ensuite de tronquer les lignes et les colonnes artificielles dans le résultat.

Résoudre des systèmes d'équations linéaires en utilisant la multiplication rapide de matrices

Pour résoudre un système d"équation linéaire Ax=b en utilisant la multiplication rapide de matrices, on commence par calculer l'inverse de la matrice A. Pour ce faire on utilise une notation par block de la matrice. Si a est une matrice de dimension 2n×2n, alors on forme les sous matrices de dimensions n×n: A11, A12, A21 et A22 de manière à ce que

A=(A11A12A21A22).

Alors l'inverse de la matrice A peut s'écrire:

A1=(A111+A111A12(A22A21A111A12)1A21A111A111A12(A22A21A111A12)1(A22A21A111A12)1A21A111(A22A21A111A12)1).

Cela nécessite de calculer 2 inverses de matrices et 6 produits matricielles tous de dimensions n×n. En effet il suffit de calculer les inverses

A111
(A22A21A111A12)1

et de faire les produits matricielle

A111A12
A21(A111A12)
(A111A12)((A22A21A111A12)1)
((A22A21A111A12)1)A21
((A22A21A111A12)1A21)A111
(A111A12)((A22A21A111A12)1A21)A111

En calculant ces produits matricielle et ces matrices inverses en utilisant la multiplication rapide et cette méthode d'inversion de manière récursive le nombre d'opérations nécessaire pour inverser une matrice de dimension n×n est de l'ordre de O(nlog2(7)).

Les méthodes de multiplication rapide et d'inversion rapide de matrice décrite ici ne sont pas optimales. On peut construire des méthodes plus élaborer de multiplication de matrices par exemple on peut multiplier des matrices 3×3 plus efficacement que les matrices 2×2 par un astuce similaire à celui décrit ci-haut mais plus élaborer. Il est possible de développer ce genre d'astuce de plus en plus élaborer sur des matrices de plus en plus grande. Il est possible d'avoir des méthodes dont la complexité numérique pour une matrice n×n est de l'ordre de O(n2,376) ce qui est bien moins que le O(nlog2(7))O(n2,808). Cependant toutes ces méthodes ont des problèmes de stabilités numériques, c'est-à-dire que de petites erreurs d'arrondie peuvent avoir des conséquences désastreuses sur les résultats. Pour cette raison, ces méthodes ne sont pas utilisées. Peut-être un jour trouvera-t-on une solution à ces problèmes d'instabilités numériques.

Systèmes indéterminés et systèmes surdéterminés

Valeurs propres et vecteurs propres

Programmation linéaire

Méthode du Simplex

Dualité

Liens externes