DÉCOMPOSITION LU D`UNE MATRICE
Transcription
DÉCOMPOSITION LU D`UNE MATRICE
Informatique pour tous Décomposition LU d’une matrice DÉCOMPOSITION LU D’UNE MATRICE Informatique pour tous Décomposition LU d’une matrice I-Un peu de théorie DÉCOMPOSITION LU D’UNE MATRICE I-Un peu de théorie Informatique pour tous Décomposition LU d’une matrice I-Un peu de théorie 1) Décomposer, pour quoi faire ? DÉCOMPOSITION LU D’UNE MATRICE I-Un peu de théorie 1) Décomposer, pour quoi faire ? Informatique pour tous Décomposition LU d’une matrice I-Un peu de théorie 1) Décomposer, pour quoi faire ? La factorisation LU d'une matrice An×n est une méthode de décomposition très importante dans le domaine de l'analyse numérique. Sa définition est simple, mais ses applications sont très nombreuses et très utiles, nous verrons pourquoi plus tard. Informatique pour tous Décomposition LU d’une matrice I-Un peu de théorie 1) Décomposer, pour quoi faire ? La factorisation LU d'une matrice An×n est une méthode de décomposition très importante dans le domaine de l'analyse numérique. Sa définition est simple, mais ses applications sont très nombreuses et très utiles, nous verrons pourquoi plus tard. Cependant, cette méthode n’est pas implémentée dans numpy.linalg (alors qu’elle est utilisée pour réaliser la fonction solve qui résout les systèmes d’équations linéaires !) Informatique pour tous Décomposition LU d’une matrice I-Un peu de théorie 1) Décomposer, pour quoi faire ? La factorisation LU d'une matrice An×n est une méthode de décomposition très importante dans le domaine de l'analyse numérique. Sa définition est simple, mais ses applications sont très nombreuses et très utiles, nous verrons pourquoi plus tard. Cependant, cette méthode n’est pas implémentée dans numpy.linalg (alors qu’elle est utilisée pour réaliser la fonction solve qui résout les systèmes d’équations linéaires !) Nous allons donc créer une fonction decomp_LU() pour combler ce manque. Informatique pour tous Décomposition LU d’une matrice I-Un peu de théorie 1) Décomposer, pour quoi faire ? La factorisation LU d'une matrice An×n est une méthode de décomposition très importante dans le domaine de l'analyse numérique. Sa définition est simple, mais ses applications sont très nombreuses et très utiles, nous verrons pourquoi plus tard. Cependant, cette méthode n’est pas implémentée dans numpy.linalg (alors qu’elle est utilisée pour réaliser la fonction solve qui résout les systèmes d’équations linéaires !) Nous allons donc créer une fonction decomp_LU() pour combler ce manque. Pour être honnête, cette fonction existe dans la librairie scipy.linalg, on pourra l’utiliser pour contrôler nos résultats.. Informatique pour tous Décomposition LU d’une matrice I-Un peu de théorie 1) Décomposer, pour quoi faire ? 2) Définition DÉCOMPOSITION LU D’UNE MATRICE I-Un peu de théorie 1) Décomposer, pour quoi faire ? 2) Définition Informatique pour tous Décomposition LU d’une matrice I-Un peu de théorie 1) Décomposer, pour quoi faire ? 2) Définition La factorisation LU consiste à écrire une matrice inversible A comme le produit de deux autres matrices L et U : A = L×U. Informatique pour tous Décomposition LU d’une matrice I-Un peu de théorie 1) Décomposer, pour quoi faire ? 2) Définition La factorisation LU consiste à écrire une matrice inversible A comme le produit de deux autres matrices L et U : A = L×U. L est une matrice triangulaire inférieure ayant des 1 sur la diagonale 0 1 l2,1 1 L = l3,1 l3,2 ⋮ ⋮ l n ,1 ln ,2 0 ... 0 ... 1 ... ⋱ ⋮ ln ,3 ⋯ 0 0 0 ⋮ 1 Informatique pour tous Décomposition LU d’une matrice I-Un peu de théorie 1) Décomposer, pour quoi faire ? 2) Définition La factorisation LU consiste à écrire une matrice inversible A comme le produit de deux autres matrices L et U : A = L×U L est une matrice triangulaire inférieure ayant des 1 sur la diagonale et U une matrice triangulaire supérieure. 0 1 l2,1 1 L = l3,1 l3,2 ⋮ ⋮ l n ,1 ln ,2 0 ... 0 ... 1 ... ⋱ ⋮ ln ,3 ⋯ 0 0 0 ⋮ 1 u1,1 u1,2 ... u1,n −1 u1,n 0 u ... u u 2,2 2, n −1 2, n 0 ... u3,n −1 u3,n U = 0 ⋮ ⋮ ⋱ ⋮ ⋮ 0 0 0 ⋯ u n , n Informatique pour tous Décomposition LU d’une matrice I-Un peu de théorie 1) Décomposer, pour quoi faire ? 2) Définition Par exemple, la matrice A suivante : se factorise en 2 −1 0 A = −1 2 −1 0 −1 2 0 0 2 −1 0 1 A = −1/ 2 1 0 ⋅ 0 3 / 2 −1 0 −2 / 3 1 0 0 4 / 3 L U Informatique pour tous Décomposition LU d’une matrice I-Un peu de théorie 1) Décomposer, pour quoi faire ? 2) Définition Par exemple, la matrice A suivante : se factorise en 2 −1 0 A = −1 2 −1 0 −1 2 0 0 2 −1 0 1 A = −1/ 2 1 0 ⋅ 0 3 / 2 −1 0 −2 / 3 1 0 0 4 / 3 L U Travail demandé : Calculer à la main le produit des deux matrices L et U Informatique pour tous Décomposition LU d’une matrice I-Un peu de théorie 1) Décomposer, pour quoi faire ? 2) Définition 3) Calcul DÉCOMPOSITION LU D’UNE MATRICE I-Un peu de théorie 1) Décomposer, pour quoi faire ? 2) Définition 3) Calcul Informatique pour tous Décomposition LU d’une matrice I-Un peu de théorie 1) Décomposer, pour quoi faire ? 2) Définition 3) Calcul On sait que la méthode de Gauss passe par une triangularisation de la matrice A. On peut donc réutiliser la technique mise en œuvre pour cela. Informatique pour tous Décomposition LU d’une matrice I-Un peu de théorie 1) Décomposer, pour quoi faire ? 2) Définition 3) Calcul On sait que la méthode de Gauss passe par une triangularisation de la matrice A. On peut donc réutiliser la technique mise en œuvre pour cela. Pour éliminer la première « sous »-colonne de A, on transvecte toutes les lignes Li pour i compris entre 2 et n. Informatique pour tous Décomposition LU d’une matrice I-Un peu de théorie 1) Décomposer, pour quoi faire ? 2) Définition 3) Calcul On sait que la méthode de Gauss passe par une triangularisation de la matrice A. On peut donc réutiliser la technique mise en œuvre pour cela. Pour éliminer la première « sous »-colonne de A, on transvecte toutes les lignes Li pour i compris entre 2 et n. Pour la ligne i, on fait la transvection Li ← Li − µi1L1 avec µi1 = ai,1 / a1,1 . Informatique pour tous Décomposition LU d’une matrice I-Un peu de théorie 1) Décomposer, pour quoi faire ? 2) Définition 3) Calcul On sait que la méthode de Gauss passe par une triangularisation de la matrice A. On peut donc réutiliser la technique mise en œuvre pour cela. Pour éliminer la première « sous »-colonne de A, on transvecte toutes les lignes Li pour i compris entre 2 et n. Pour la ligne i, on fait la transvection Li ← Li − µi1L1 avec µi1 = ai,1 / a1,1 . On peut alors écrire cette transformations sous une forme matricielle 0 0 ... 1 ⋮ ⋮ ... ⋮ Ei1 A = −µi1 0 1 ... ⋮ ⋱ ⋮ ⋮ 0 0 0 ⋯ 0 a1,1 ⋮ ⋮ 0 ai ,1 ⋮ ⋮ 1 an ,1 a1,2 ⋮ ... ... a1,n −1 ⋮ ai ,2 ... ai ,n −1 ⋮ ⋱ ⋮ an ,2 ⋯ an ,n −1 a1,n ⋮ ai ,n ⋮ an ,n Informatique pour tous Décomposition LU d’une matrice I-Un peu de théorie 1) Décomposer, pour quoi faire ? 2) Définition 3) Calcul En faisant de même pour toutes les lignes pour la sous colonne 1 puis pour toutes les sous colonnes, on obtient : Enn ⋯ Eij ⋯ En1 ⋯ E31 E21 A = U Informatique pour tous Décomposition LU d’une matrice I-Un peu de théorie 1) Décomposer, pour quoi faire ? 2) Définition 3) Calcul En faisant de même pour toutes les lignes pour la sous colonne 1 puis pour toutes les sous colonnes, on obtient : Enn ⋯ Eij ⋯ En1 ⋯ E31 E21 A = U où toutes les matrices Eij ont des 1 sur la diagonale et un seul coefficient non nul ailleurs, sous la diagonale. Informatique pour tous Décomposition LU d’une matrice I-Un peu de théorie 1) Décomposer, pour quoi faire ? 2) Définition 3) Calcul En faisant de même pour toutes les lignes pour la sous colonne 1 puis pour toutes les sous colonnes, on obtient : Enn ⋯ Eij ⋯ En1 ⋯ E31 E21 A = U où toutes les matrices Eij ont des 1 sur la diagonale et un seul coefficient non nul ailleurs, sous la diagonale. La matrice E = Enn…Eij…En1…E31E21 est donc triangulaire inférieure avec des 1 sur la diagonale ainsi que son inverse L = E−1. Informatique pour tous Décomposition LU d’une matrice I-Un peu de théorie 1) Décomposer, pour quoi faire ? 2) Définition 3) Calcul En faisant de même pour toutes les lignes pour la sous colonne 1 puis pour toutes les sous colonnes, on obtient : Enn ⋯ Eij ⋯ En1 ⋯ E31 E21 A = U où toutes les matrices Eij ont des 1 sur la diagonale et un seul coefficient non nul ailleurs, sous la diagonale. La matrice E = Enn…Eij…En1…E31E21 est donc triangulaire inférieure avec des 1 sur la diagonale ainsi que son inverse L = E−1. On obtient bien A = E−1 U = LU. Informatique pour tous Décomposition LU d’une matrice I-Un peu de théorie 1) Décomposer, pour quoi faire ? 2) Définition 3) Calcul En faisant de même pour toutes les lignes pour la sous colonne 1 puis pour toutes les sous colonnes, on obtient : Enn ⋯ Eij ⋯ En1 ⋯ E31 E21 A = U où toutes les matrices Eij ont des 1 sur la diagonale et un seul coefficient non nul ailleurs, sous la diagonale. La matrice E = Enn…Eij…En1…E31E21 est donc triangulaire inférieure avec des 1 sur la diagonale ainsi que son inverse L = E−1. On obtient bien A = E−1 U = LU. On constate que les déterminations des coefficients de L et de U sont liées : cela va se retrouver dans l’algorithme. Informatique pour tous Décomposition LU d’une matrice I-Un peu de théorie 1) Décomposer, pour quoi faire ? 2) Définition 3) Calcul 4) Un exemple d’application DÉCOMPOSITION LU D’UNE MATRICE I-Un peu de théorie 1) Décomposer, pour quoi faire ? 2) Définition 3) Calcul 4) Un exemple d’application Informatique pour tous Décomposition LU d’une matrice I-Un peu de théorie 1) Décomposer, pour quoi faire ? 2) Définition 3) Calcul 4) Un exemple d’application Un système de n équations à n inconnues peut s’écrire sous la forme matricielle AX = B. Informatique pour tous Décomposition LU d’une matrice I-Un peu de théorie 1) Décomposer, pour quoi faire ? 2) Définition 3) Calcul 4) Un exemple d’application Un système de n équations à n inconnues peut s’écrire sous la forme matricielle AX = B. On peut le résoudre par la méthode de Gauss. On a vu que sa complexité est en O(n3). Informatique pour tous Décomposition LU d’une matrice I-Un peu de théorie 1) Décomposer, pour quoi faire ? 2) Définition 3) Calcul 4) Un exemple d’application Un système de n équations à n inconnues peut s’écrire sous la forme matricielle AX = B. On peut le résoudre par la méthode de Gauss. On a vu que sa complexité est en O(n3). Supposons maintenant que nous connaissons la factorisation LU de la matrice A. Alors, le système AX = B peut se réécrire LUX = B. Informatique pour tous Décomposition LU d’une matrice I-Un peu de théorie 1) Décomposer, pour quoi faire ? 2) Définition 3) Calcul 4) Un exemple d’application Un système de n équations à n inconnues peut s’écrire sous la forme matricielle AX = B. On peut le résoudre par la méthode de Gauss. On a vu que sa complexité est en O(n3). Supposons maintenant que nous connaissons la factorisation LU de la matrice A. Alors, le système AX = B peut se réécrire LUX = B. Si l’on pose Z = UX, on doit résoudre les équations LZ = B (où l’inconnue est Z) puis UX = Z où l’inconnue est X. Informatique pour tous Décomposition LU d’une matrice I-Un peu de théorie 1) Décomposer, pour quoi faire ? 2) Définition 3) Calcul 4) Un exemple d’application Un système de n équations à n inconnues peut s’écrire sous la forme matricielle AX = B. On peut le résoudre par la méthode de Gauss. On a vu que sa complexité est en O(n3). Supposons maintenant que nous connaissons la factorisation LU de la matrice A. Alors, le système AX = B peut se réécrire LUX = B. Si l’on pose Z = UX, on doit résoudre les équations LZ = B (où l’inconnue est Z) puis UX = Z où l’inconnue est X. Deux équations au lieu d’une, cela paraît plus compliqué mais ici, les matrices L et U sont triangulaires et l’on sait que dans ce cas la résolution est rapide. Informatique pour tous Décomposition LU d’une matrice I-Un peu de théorie 1) Décomposer, pour quoi faire ? 2) Définition 3) Calcul 4) Un exemple d’application La méthode trouve son intérêt lorsque l’on doit résoudre l’équation AX = B pour plusieurs valeurs de B. Informatique pour tous Décomposition LU d’une matrice I-Un peu de théorie 1) Décomposer, pour quoi faire ? 2) Définition 3) Calcul 4) Un exemple d’application La méthode trouve son intérêt lorsque l’on doit résoudre l’équation AX = B pour plusieurs valeurs de B. La méthode de Gauss doit recommencer à zéro pour chaque valeur de B alors que, une fois la décomposition LU de A réalisée, on peut la réutiliser pour toutes les valeurs de B. La résolution des différentes équations est alors plus rapide (voir le calcul de complexité de l’algorithme). Informatique pour tous I-Un peu de théorie 1) Décomposer, pour quoi faire ? 2) Définition 3) Calcul 4) Un exemple d’application Décomposition LU d’une matrice II-Algorithme 1) Décomposition LU DÉCOMPOSITION LU D’UNE MATRICE I-Un peu de théorie 1) Décomposer, pour quoi faire ? 2) Définition 3) Calcul 4) Un exemple d’application II-Algorithme 1) Décomposition LU Informatique pour tous Décomposition LU d’une matrice I-Un peu de théorie 1) Décomposer, pour quoi faire ? 2) Définition 3) Calcul 4) Un exemple d’application II-Algorithme 1) Décomposition LU L’algorithme proposé est le suivant (indices « à la matheux ») : u1,1 = a1,1 Pour j de 2 à n u1,j = a1,j lj,1 = aj,1/a1,1 # la première ligne de U est la première ligne de A # la première colonne de L est formée des pivots µi,1 Pour i de 2 à n − 1 ui ,i = ai ,i − ∑ k =1 li ,k uk ,i i −1 Pour j de i + 1 à n ui , j = ai , j − ∑ k =1 li ,k uk , j # on fabrique les coefficients de U et L en dehors de la diagonale 1 i −1 l j ,i = a j ,i − ∑ k =1 l j ,k uk ,i ui , i n −1 # il reste à fabriquer le coefficient un,n = an ,n − ∑ k =1 ln ,k uk , n ( un , n # on fabrique les coefficients de la diagonale de U sauf un,n i −1 ) Informatique pour tous Décomposition LU d’une matrice I-Un peu de théorie 1) Décomposer, pour quoi faire ? 2) Définition 3) Calcul 4) Un exemple d’application II-Algorithme 1) Décomposition LU L’algorithme proposé est le suivant (indices « à la matheux ») : u1,1 = a1,1 Pour j de 2 à n u1,j = a1,j lj,1 = aj,1/a1,1 # la première ligne de U est la première ligne de A # la première colonne de L est formée des pivots µi,1 Pour i de 2 à n − 1 ui ,i = ai ,i − ∑ k =1 li ,k uk ,i i −1 Pour j de i + 1 à n ui , j = ai , j − ∑ k =1 li ,k uk , j # on fabrique les coefficients de U et L en dehors de la diagonale 1 i −1 l j ,i = a j ,i − ∑ k =1 l j ,k uk ,i ui , i n −1 # il reste à fabriquer le coefficient un,n = an ,n − ∑ k =1 ln ,k uk , n ( un , n # on fabrique les coefficients de la diagonale de U sauf un,n i −1 ) Travail demandé : Implémenter en Python une fonction decomp_LU(A) qui renvoie les matrices L et U de la décomposition de A (attention aux indices). Vérifier avec l’exemple donné précédemment. On pourra utiliser la fonction sum qui s’applique aux éléments d’une liste. solution possible ou encore Informatique pour tous I-Un peu de théorie 1) Décomposer, pour quoi faire ? 2) Définition 3) Calcul 4) Un exemple d’application Décomposition LU d’une matrice II-Algorithme 1) Décomposition LU 2) Matrice de permutation DÉCOMPOSITION LU D’UNE MATRICE I-Un peu de théorie 1) Décomposer, pour quoi faire ? 2) Définition 3) Calcul 4) Un exemple d’application II-Algorithme 1) Décomposition LU 2) Matrice de permutation Informatique pour tous I-Un peu de théorie 1) Décomposer, pour quoi faire ? 2) Définition 3) Calcul 4) Un exemple d’application Décomposition LU d’une matrice II-Algorithme 1) Décomposition LU 2) Matrice de permutation Le calcul précédent supposait implicitement que tous les pivots étaient non nuls ou pas trop petits pour que le calcul de leur inverse soit possible ou correct numériquement lorsqu’il est effectué par la machine. Informatique pour tous I-Un peu de théorie 1) Décomposer, pour quoi faire ? 2) Définition 3) Calcul 4) Un exemple d’application Décomposition LU d’une matrice II-Algorithme 1) Décomposition LU 2) Matrice de permutation Le calcul précédent supposait implicitement que tous les pivots étaient non nuls ou pas trop petits pour que le calcul de leur inverse soit possible ou correct numériquement lorsqu’il est effectué par la machine. On a vu qu’une méthode utilisée pour pallier ce défaut est celle du « pivot partiel », consistant à permuter les lignes pour obtenir le plus grand pivot (en valeur absolue) de la colonne traitée. Informatique pour tous I-Un peu de théorie 1) Décomposer, pour quoi faire ? 2) Définition 3) Calcul 4) Un exemple d’application Décomposition LU d’une matrice II-Algorithme 1) Décomposition LU 2) Matrice de permutation Le calcul précédent supposait implicitement que tous les pivots étaient non nuls ou pas trop petits pour que le calcul de leur inverse soit possible ou correct numériquement lorsqu’il est effectué par la machine. On a vu qu’une méthode utilisée pour pallier ce défaut est celle du « pivot partiel », consistant à permuter les lignes pour obtenir le plus grand pivot (en valeur absolue) de la colonne traitée. On peut traduire cette méthode sous forme du produit de matrices PA où P est une matrice de permutation. Informatique pour tous I-Un peu de théorie 1) Décomposer, pour quoi faire ? 2) Définition 3) Calcul 4) Un exemple d’application Décomposition LU d’une matrice II-Algorithme 1) Décomposition LU 2) Matrice de permutation Le calcul précédent supposait implicitement que tous les pivots étaient non nuls ou pas trop petits pour que le calcul de leur inverse soit possible ou correct numériquement lorsqu’il est effectué par la machine. On a vu qu’une méthode utilisée pour pallier ce défaut est celle du « pivot partiel », consistant à permuter les lignes pour obtenir le plus grand pivot (en valeur absolue) de la sous-colonne traitée. On peut traduire cette méthode sous forme du produit de matrices PA où P est une matrice de permutation. Une matrice de permutation est issue de la matrice identité dans laquelle des lignes ont été permutées. Elle vérifie donc les propriétés suivantes : 0 1 0 0 • les coefficients sont 0 ou 1 ; 0 0 1 0 • il y a un et un seul 1 par ligne ; exemple : 1 0 0 0 • il y a un et un seul 1 par colonne. 0 0 0 1 Informatique pour tous I-Un peu de théorie 1) Décomposer, pour quoi faire ? 2) Définition 3) Calcul 4) Un exemple d’application Décomposition LU d’une matrice II-Algorithme 1) Décomposition LU 2) Matrice de permutation Dans le cas de la recherche des pivots partiels, les 1 indiquent la position du maximum (en valeur absolue) de la colonne partielle, avant chaque permutation. Informatique pour tous I-Un peu de théorie 1) Décomposer, pour quoi faire ? 2) Définition 3) Calcul 4) Un exemple d’application Décomposition LU d’une matrice II-Algorithme 1) Décomposition LU 2) Matrice de permutation Dans le cas de la recherche des pivots partiels, les 1 indiquent la position du maximum (en valeur absolue) de la colonne partielle, avant chaque permutation. 2 −5 1 3 4 7 8 2 Par exemple, la matrice de permutation de la matrice A ci-contre : A = 3 1 1 6 4 1 7 9 0 1 0 0 1 0 0 0 est la matrice P suivante : P = 0 0 0 1 0 0 1 0 Travail demandé : Calculer à la main le produit PA. Que doit-on vérifier ? Informatique pour tous Décomposition LU d’une matrice I-Un peu de théorie 1) Décomposer, pour quoi faire ? 2) Définition 3) Calcul 4) Un exemple d’application II-Algorithme 1) Décomposition LU 2) Matrice de permutation Dans le cas de la recherche des pivots partiels, les 1 indiquent la position du maximum (en valeur absolue) de la colonne partielle, avant chaque permutation. 2 −5 1 3 4 7 8 2 Par exemple, la matrice de permutation de la matrice A ci-contre : A = 3 1 1 6 4 1 7 9 0 1 0 0 1 0 0 0 est la matrice P suivante : P = 0 0 0 1 0 0 1 0 Travail demandé : Calculer à la main le produit PA. Que doit-on vérifier ? 4 7 2 −5 Réponse : PA = 4 1 3 1 8 2 1 3 Les éléments de la diagonale sont les pivots partiels. 7 9 1 6 Informatique pour tous I-Un peu de théorie 1) Décomposer, pour quoi faire ? 2) Définition 3) Calcul 4) Un exemple d’application Décomposition LU d’une matrice II-Algorithme 1) Décomposition LU 2) Matrice de permutation Dans le cas de la recherche des pivots partiels, les 1 indiquent la position du maximum (en valeur absolue) de la colonne partielle, avant chaque permutation. 2 −5 1 3 4 7 8 2 Par exemple, la matrice de permutation de la matrice A ci-contre : A = 3 1 1 6 4 1 7 9 0 1 0 0 1 0 0 0 est la matrice P suivante : P = 0 0 0 1 0 0 1 0 Travail demandé : Calculer à la main le produit PA. Que doit-on vérifier ? Calculer de même le produit AP. Que constate-t-on ? Informatique pour tous I-Un peu de théorie 1) Décomposer, pour quoi faire ? 2) Définition 3) Calcul 4) Un exemple d’application Décomposition LU d’une matrice II-Algorithme 1) Décomposition LU 2) Matrice de permutation Dans le cas de la recherche des pivots partiels, les 1 indiquent la position du maximum (en valeur absolue) de la colonne partielle, avant chaque permutation. 2 −5 1 3 4 7 8 2 Par exemple, la matrice de permutation de la matrice A ci-contre : A = 3 1 1 6 4 1 7 9 0 1 0 0 1 0 0 0 est la matrice P suivante : P = 0 0 0 1 0 0 1 0 Travail demandé : Calculer à la main le produit PA. Que doit-on vérifier ? Calculer de même le produit AP. Que constate-t-on ? −5 2 3 1 7 4 2 8 Réponse : AP = Les colonnes de la matrices A ont été permutées en suivant l’ordre 1 3 6 1 1 ← 2, 2 ← 1, 3 ← 4, 4 ← 3 indiqué par la position des 1 de la matrice P. 1 4 9 7 Informatique pour tous I-Un peu de théorie 1) Décomposer, pour quoi faire ? 2) Définition 3) Calcul 4) Un exemple d’application Décomposition LU d’une matrice II-Algorithme 1) Décomposition LU 2) Matrice de permutation Travail demandé : En s’inspirant de l’algorithme vu en cours (et rappelé ci-dessous) de la recherche du pivot partiel puis de l’échange de ligne, définir une fonction mat_permut(M) qui renvoie la matrice de permutation de la matrice M. On devra créer une matrice identité dont on permutera ensuite les lignes. Si l’on utilise pour cela la fonction numpy.eye(n), on prendra garde que l’affectation T1 = T2 (où T1 et T2 sont des tableaux numpy) ne crée pas un nouvel objet. Toute modification ultérieure de l’un affectera donc aussi l’autre. n = len(M) j = i for k in range(i+1, n): if abs(M[k][i]) > abs(M[j][i]): j = k if j != i : M[i][k], M[j][k] = M[j][k], M[i][k] solution possible Informatique pour tous I-Un peu de théorie 1) Décomposer, pour quoi faire ? 2) Définition 3) Calcul 4) Un exemple d’application Décomposition LU d’une matrice II-Algorithme 1) Décomposition LU 2) Matrice de permutation 3) Résolution de AX = B DÉCOMPOSITION LU D’UNE MATRICE I-Un peu de théorie 1) Décomposer, pour quoi faire ? 2) Définition 3) Calcul 4) Un exemple d’application II-Algorithme 1) Décomposition LU 2) Matrice de permutation 3) Résolution de AX = B Informatique pour tous I-Un peu de théorie 1) Décomposer, pour quoi faire ? 2) Définition 3) Calcul 4) Un exemple d’application Décomposition LU d’une matrice II-Algorithme 1) Décomposition LU 2) Matrice de permutation 3) Résolution de AX = B Comme on l’a vu, la résolution de l’équation matricielle AX = B (où X est l’inconnue) conduit à résoudre successivement LZ = B (inconnue Z) puis UX = Z (inconnue X). Informatique pour tous Décomposition LU d’une matrice I-Un peu de théorie 1) Décomposer, pour quoi faire ? 2) Définition 3) Calcul 4) Un exemple d’application II-Algorithme 1) Décomposition LU 2) Matrice de permutation 3) Résolution de AX = B Comme on l’a vu, la résolution de l’équation matricielle AX = B (où X est l’inconnue) conduit à résoudre successivement LZ = B (inconnue Z) puis UX = Z (inconnue X). Comme L est triangulaire inférieure (avec des 1 sur la diagonale) l’algorithme de détermination de Z est simple (indice à la matheux) : z1 = b1 Pour i de 2 à n zi = bi − ∑ j =1 Li , j z j C’est une « substitution avant ». i −1 Informatique pour tous Décomposition LU d’une matrice I-Un peu de théorie 1) Décomposer, pour quoi faire ? 2) Définition 3) Calcul 4) Un exemple d’application II-Algorithme 1) Décomposition LU 2) Matrice de permutation 3) Résolution de AX = B Comme on l’a vu, la résolution de l’équation matricielle AX = B (où X est l’inconnue) conduit à résoudre successivement LZ = B (inconnue Z) puis UX = Z (inconnue X). Comme L est triangulaire inférieure (avec des 1 sur la diagonale) l’algorithme de détermination de Z est simple (indice à la matheux) : z1 = b1 Pour i de 2 à n zi = bi − ∑ j =1 Li , j z j i −1 C’est une « substitution avant ». Pour UX = Z, on retrouve la fin de l’algorithme de Gauss puisque U est triangulaire supérieure : xn = z n Pour i de n − 1 à 1 xi = zi − ∑ j =1+1U i , j x j / U i ,i ( C’est une « substitution arrière ». n ) Informatique pour tous I-Un peu de théorie 1) Décomposer, pour quoi faire ? 2) Définition 3) Calcul 4) Un exemple d’application Décomposition LU d’une matrice II-Algorithme 1) Décomposition LU 2) Matrice de permutation 3) Résolution de AX = B Travail demandé : Évaluer la complexité de cette résolution, si la décomposition LU de la matrice A est déjà effectuée. Informatique pour tous I-Un peu de théorie 1) Décomposer, pour quoi faire ? 2) Définition 3) Calcul 4) Un exemple d’application Décomposition LU d’une matrice II-Algorithme 1) Décomposition LU 2) Matrice de permutation 3) Résolution de AX = B Travail demandé : Évaluer la complexité de cette résolution, si la décomposition LU de la matrice A est déjà effectuée. Réponse : Comptons le nombre d'opération des deux algorithmes. Pour la substitution avant, on a i−1 multiplications à l’itération i. Ainsi, le nombre total est ∑ i =1 ( i − 1) = n n ( n − 1) . 2 Pour la susbtitution arrière, on a n − (i+1) opérations à l’itération i . Comme i varie de n − 1 à 1 , on en a au total n ( n + 1) ∑ ( n − i + 1) = 2 . n −1 i =1 Conclusion, la complexité de ces deux algorithme est en O(n2). Si l’on résout AX = B pour plusieurs matrice B successivement, la résolution par cette méthode sera plus rapide que la méthode de Gauss, la décomposition LU (qui est de complexité O(n3) n’étant faite qu’une seule fois. Informatique pour tous I-Un peu de théorie 1) Décomposer, pour quoi faire ? 2) Définition 3) Calcul 4) Un exemple d’application Décomposition LU d’une matrice II-Algorithme 1) Décomposition LU 2) Matrice de permutation 3) Résolution de AX = B Travail demandé : Implémenter une fonction resol_LU(A,B) où A et B sont les matrices de l’équation AX = B, cette fonction exploitant la décomposition LU de A. Vérifier son fonctionnement sur le système suivant : 2 x − 5 y + z + 3 t = 5 4 x + 7 y + 8 z + 2t = 10 3 x + y + z + 6t = 2 4 x + y + 7 z + 9t = 6 solution possible Informatique pour tous I-Un peu de théorie 1) Décomposer, pour quoi faire ? 2) Définition 3) Calcul 4) Un exemple d’application Décomposition LU d’une matrice II-Algorithme 1) Décomposition LU 2) Matrice de permutation 3) Résolution de AX = B Complément possible: Comparer « expérimentalement » la vitesse d’exécution de la résolution de AX = B par la méthode de la décomposition LU et la méthode de Gauss dont on rappelle l’algorithme ci-dessous (pour une matrice déjà permutée) : def transvection_ligne(M, i, j, mu): n = len(M) nt = np.size(M) if n == nt : M[j] += mu * M[i] else : for k in range(n): M[j][k] += mu * M[i][k] script def resol_Gauss(A0, B0): A, B = np.copy(A0), np.copy(B0) n = len(A) assert len(A[0]) == n # Mise sous forme triangulaire for i in range(n): for j in range(i+1, n): r = A[j][i] / float(A[i][i]) transvection_ligne(A, i, j, -r) transvection_ligne(B, i, j, -r) # Phase de remontée X = [0.] * n for i in range(n-1, -1, -1): X[i] = (B[i]-sum(A[i][j]*X[j] for j in range(i+1,n))) / A[i][i] return X Informatique pour tous I-Un peu de théorie 1) Décomposer, pour quoi faire ? 2) Définition 3) Calcul 4) Un exemple d’application Décomposition LU d’une matrice II-Algorithme 1) Décomposition LU 2) Matrice de permutation 3) Résolution de AX = B Complément possible: Comparer « expérimentalement » la vitesse d’exécution de la résolution de AX = B par la méthode de la décomposition LU et la méthode de Gauss dont on rappelle l’algorithme cidessous (pour une matrice déjà permutée): Pour mesurer la durée d’un algorithme, on peut utiliser la méthode time() de la bibliothèque time, qui renvoie une date en seconde. Par exemple : import time debut = time.time() resol_LU(A, B) fin = time.time() duree = fin - debut Informatique pour tous I-Un peu de théorie 1) Décomposer, pour quoi faire ? 2) Définition 3) Calcul 4) Un exemple d’application Décomposition LU d’une matrice II-Algorithme 1) Décomposition LU 2) Matrice de permutation 3) Résolution de AX = B 4) Compléments mathématiques DÉCOMPOSITION LU D’UNE MATRICE I-Un peu de théorie 1) Décomposer, pour quoi faire ? 2) Définition 3) Calcul 4) Un exemple d’application II-Algorithme 1) Décomposition LU 2) Matrice de permutation 3) Résolution de AX = B 4) Compléments mathématiques Informatique pour tous I-Un peu de théorie 1) Décomposer, pour quoi faire ? 2) Définition 3) Calcul 4) Un exemple d’application Décomposition LU d’une matrice II-Algorithme 1) Décomposition LU 2) Matrice de permutation 3) Résolution de AX = B 4) Compléments mathématiques Existence, unicité Pour toute matrice carrée, il existe une décomposition PLU. La décomposition LU existe si et seulement si toutes les sous matrices principales d'ordre 1 à n−1 sont inversibles. Si toutes les sous matrices principales d'ordre 1 à n sont inversibles, elle est unique . Applications Outre la résolution des systèmes d’équations linéaires, la décomposition LU est utilisée pour calculer : • l’inverse d’une matrice : les programmes informatiques qui implémentent ce type de calcul utilisent généralement cette méthode. • le déterminant d’une matrice : si A est sous forme LU ou PLU, son déterminant se calcule facilement : det(A) = det(P)⋅det(L) ⋅ det(U). Les trois déterminants de ce produit sont très simples à calculer (matrices triangulaires ou de permutations). Informatique pour tous Décomposition LU d’une matrice Informatique pour tous Décomposition LU d’une matrice Informatique pour tous Décomposition LU d’une matrice def decomp_LU(A): n = len(A) U = np.zeros((n,n)) L = np.eye(n) # le nombre de lignes de la matrice A # créer une matrice n × n remplie de 0 # créer une matrice identité n × n U[0][0] = A[0][0] for i in range(1 , n) : U[0][i] = A[0][i] L[i][0] = A[i][0]/A[0][0] # la première ligne de U est la première ligne de A # la première colonne de L est formée des coefficients mi,1 for i in range(1, n-1): U[i][i] = A[i][i] - sum(L[i][k] * U[k][i] for k in range(i)) # on fabrique les coefficients de la diagonale de U sauf un,n for j in range(i+1,n): # on fabrique les coefficients de U et L en dehors de la diagonale U[i][j] = A[i][j]- sum(L[i][k] * U[k][j] for k in range(i)) L[j][i] = A[j][i]- sum(L[j][k] * U[k][i] for k in range(i)) L[j][i] = L[j][i]/U[i,i] U[n-1][n-1] = A[n-1][n-1] - sum(L[n-1][k] * U[k][n-1] for k in range(n-1)) # il reste à fabriquer le coefficient un,n (ln,n vaut 1 on le sait d'avance) return L,U Informatique pour tous Décomposition LU d’une matrice def decomp_LU2(A): n = len(A) U = np.zeros((n,n)) L = np.eye(n) U[0][0] = A[0][0] for i in range(1 , n) : U[0][i] = A[0][i] L[i][0] = A[i][0]/A[0][0] for i in range(1, n-1): U[i][i] = A[i][i] # le nombre de lignes de la matrice A # créer une matrice n × n remplie de 0 # créer une matrice identité n × n # la première ligne de U est la première ligne de A # la première colonne de L est formée des coefficients mi,1 # on fabrique les coefficients de la diagonale de U sauf un,n for k in range(i) : U[i][i] -= L[i][k] * U[k][i] for j in range(i+1,n): # on fabrique les coefficients de U et L en dehors de la diagonale U[i][j] = A[i][j] L[j][i] = A[j][i] for k in range(i): U[i][j] -= L[i][k] * U[k][j] L[j][i] -= L[j][k] * U[k][i] L[j][i] = L[j][i]/U[i,i] U[n-1][n-1] = A[n-1][n-1] # il reste à fabriquer le coefficient un,n (ln,n vaut 1 on le sait d'avance) for k in range(n-1) : U[n-1][n-1] -= L[n-1][k] * U[k][n-1] return L,U Informatique pour tous def mat_permut(M): n = len(M) permut = np.eye(n) Décomposition LU d’une matrice # créer une matrice identité n × n # il faut réarranger la matrice identité de façon que le plus grand élément de chaque sous-colonne de M # est placée sur la diagonale de M for i in range(n) : j=i for k in range(i+1,n): if abs(M[k][i]) > abs(M[j][i]): j=k if j != i: #attention, les égalités simples ne créeent pas un nouvel objet L = np.copy(permut[j]) permut[j] = np.copy(permut[i]) permut[i] = np.copy(L) return permut Informatique pour tous def subst_avant(L,B) : n = len(L) Z = [0.] * n Z[0] = B[0] for i in range(1,n): Z[i] = B[i] - sum(L[i][j] * Z[j] for j in range(i)) return Z def subst_arriere(U,Z) : n = len(U) X = [0.] * n for i in range(n-1, -1, -1): X[i] = (Z[i]-sum(U[i][j]*X[j] for j in range(i+1,n))) / U[i][i] return X def resol_LU(A0,B0) : A, B = np.copy(A0), np.copy(B0) LU=decomp_LU(A) L = LU[0] U = LU[1] Y = subst_avant(L,B) return subst_arriere(U,Y) Décomposition LU d’une matrice Informatique pour tous def transvection_ligne(M, i, j, mu) : """ L_i < − L_i + mu.L_j """ n = len(M) # le nombre de ligne nt = np.size(M) if n == nt : #cas d’une matrice colonne M[j] += mu * M[i] else : for k in range(n): M[j][k] += mu * M[i][k] def resol_Gauss(A0, B0) : """Résolution de A0.X=B0; A0 doit être inversible""" A, B = np.copy(A0), np.copy(B0) n = len(A) assert len(A[0]) == n # Mise sous forme triangulaire for i in range(n) : for j in range(i+1, n) : r = A[j][i] / float(A[i][i]) transvection_ligne(A, i, j, -r) transvection_ligne(B, i, j, -r) # Phase de remontée X = [0.] * n for i in range(n-1, -1, -1): X[i] = (B[i]-sum(A[i][j]*X[j] for j in range(i+1,n))) / A[i][i] return X Décomposition LU d’une matrice