4M053 - TP3 Pierre Marchand : [email protected] Février 2017 Objectifs de la séance : • Implémenter des méthodes d’inversion directe. • Comparer le temps d’exécution de ces méthodes en fonction de la taille des matrices. Méthodes directes 1 Décomposition LU Cette méthode permet de transformer une matrice carré A en un produit d’une matrice triangulaire inférieur L et d’une matrice triangulaire supérieur D. Cette décomposition permet notamment de résoudre des problèmes d’algèbre linéaire du type Ax = y, où x et y sont des vecteurs. Plus précisément, connaissant y et A, cette méthode nous permet de trouver x en multipliant à gauche par l’inverse de L puis l’inverse de U. Ce genre de problème apparaît souvent dans la discrétisation d’équations aux dérivées partielles par exemple. 1.1 Algorithme Notons a i , j le cœfficient (i , j ) de la matrice A. Nous allons tout d’abord faire une factorisation partielle de la matrice µ ¶ µ ¶µ ¶ A 1,1 A 1,2 L 1,1 0 U1,1 U1,2 A= = (1) A 2,1 A 2,2 L 2,1 I 0 S 2,2 où I est la matrice identité, les A i , j sont des sous-blocs de A, S 2,2 = A 2,2 − A 2,1 A −1 1,1 A 1,2 est appelé le complément de Shur, tandis que L 1,1 est triangulaire inférieure et U1,1 est triangulaire supérieure telles que A 1,1 = L 1,1U1,1 . Exercice 1 : 1. Vérifiez que la relation suivante est vraie. Entre autres, trouvez les expressions de L 2,1 et U1,2 . Nous avons alors le théorème suivant : Théorème 1. La matrice A admet une factorisation LU si et seulement si le bloc A 1,1 et le complément de Shur S 2,2 sont eux-mêmes factorisables. La composition LU de la matrice est déterminée par les factorisations des blocs A 1,1 = L 1,1U1,1 et S 2,2 = L 2,2U2,2 selon la formule : µ A 1,1 A 2,1 ¶ µ A 1,2 L 1,1 = A 2,2 L 2,1 ¶µ U1,1 L 2,2 0 où L 2,1 et U1,2 sont ceux de la factorisation partielle (1). 1 0 U1,2 U2,2 ¶ En d’autres termes, ce théorème nous dit que dès lors qu’on arrive à décomposer un bloc de la diagonale A 1,1 sous forme LU , nous n’avons plus qu’à calculer L 2,1 , U1,2 et S 2,2 puis on cherche la décomposition LU de S 2,2 . Exercice 2 : 1. Calculez la factorisation partielle de A avec A 1,1 = a 1,1 et L 1,1 = l 1,1 = 1. Donnez l’expression de tous les cœfficients. Écrire sur le papier un algorithme pour construire la factorisation partielle. 2. En déduire l’algorithme complet en utilisant le théorème précédent. 1.2 Implémentation Exercice 3 : 1. Définissez la fonction 1 void decomp_LU( const Matrice &M, Matrice &L , Matrice &U, ) ; qui construit dans L et U , la décomposition LU de M . 2. Remarquez que finalement, nous pouvions stocker directement les cœfficients de L et U dans la matrice A afin d’éviter de créer deux autres matrices (avec le surcoût de mémoire que cela implique). Vous pouvez donc définir une autre fonction qui construit L et U mais qui les stocke dans A. (Attention, le produit matrice vecteur n’a plus de sens une fois cette fonction appliquée.) 3. Résolvez le problème suivant : 2 −1 0 0 −1 2 −1 0 0 −1 2 −1 0 1 1 0 x = . 1 −1 2 1 4. Résolvez le système H y = b où H est une matrice de Hilbert : c’est-à-dire une matrice carrée de taille N × N de terme générale : Hi , j = 1 i + j −1 et b le vecteur de taille N où b i = 1. (On fera en sorte de pouvoir essayer ces résolutions pour différentes valeurs de N). 2 Décomposition de Cholesky Si A est symétrique définie positive, une alternative à la décomposition LU , qui utilise à son avantage les propriétés de A est la décomposition de Cholesky : A = LL T où L est une matrice triangulaire inférieure. 2.1 Algorithme Exercice 4 : p 1. Calculez la factorisation partielle de A avec A 1,1 = a 1,1 et L 1,1 = l 1,1 = a 1,1 . Donnez l’expression de tous les cœfficients. Écrire sur la papier un algorithme pour construire la factorisation partielle. 2. Déduisez en l’algorithme complet en utilisant le théorème 1 et en admettant que le complement de Shur est aussi symétrique définie positif. Pensez à utiliser la symétrique de la matrice A. 2 2.2 Implémentation Exercice 5 : 1. Définissez la fonction 1 matrice decomp_Cholesky ( const Matrice &M) ; qui renvoie la matrice L de la décomposition de Cholesky de M . Vous pouvez faire la même remarque que pour la décomposition LU et faire une fonction qui stocke les cœfficients de L dans A. 2. Résolvez le problème suivant : 2 −1 0 0 −1 2 −1 0 0 −1 2 −1 0 1 1 0 x = . 1 −1 2 1 3. Résolvez le système H y = b où H est une matrice de Hilbert : c’est-à-dire une matrice carrée de taille N × N de terme générale : Hi , j = 1 i + j −1 et b le vecteur de taille N où b i = 1. (On fera en sorte de pouvoir essayer ces résolutions pour différentes valeurs de N). 3 Comparaison Nous voulons maintenant comparer la rapidité des deux méthodes en fonction de la taille des matrices. Exercice 6 : 1. En utilisant la fonction clock de la bibliothèque standard ctime, comparez les temps d’exécution des deux méthodes. 1 2 3 4 5 6 7 8 #include <ctime > i n t main ( ) { c l o c k _ t s t a r t , end ; double msecs ; s t a r t = clock ( ) ; / * any s t u f f here . . . * / end = clock ( ) ; msecs = ( ( double ) ( end − s t a r t ) ) / CLOCKS_PER_SEC ; 2. Faites des graphes du temps d’exécution par rapport à la taille de la matrice. On fera attention à se placer en échelle logarithmique sur l’axe des abscisse afin de retrouver la complexité des algorithmes (N 3 pour les deux). Vous pourrez utiliser Python avec matplotlib ou gnuplot par exemple. 3