Méthodes directes

publicité
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
Téléchargement