CHAPITRE 4 RÉSOLUTION DES SYSTÈMES LINÉAIRES 1ère Partie : Méthodes directes 1-Introduction : Matrice triangulaire inférieure supérieure ⎡l11 ⎤ ⎢l l ⎥ 21 22 ⎥ L=⎢ ⎢M O ⎥ ⎢ ⎥ ⎣⎢l n1 L l n n ⎦⎥ ⎡u11 u12 K ⎢ u22 u23 U =⎢ ⎢ O ⎢ ⎣⎢ u1n ⎤ ⎥ u2 n ⎥ M ⎥ ⎥ unn ⎦⎥ lij = 0 pour j f i uij = 0 pour i f j n Propriété : le déterminant d’une matrice triangulaire A = (aij ) est det( A) = ∏ aii i =1 Exemple : soit la matrice triangulaire supérieure ⎡− 2 A = ⎢⎢ 0 ⎢⎣ 0 2⎤ 3 − 2 ⎥⎥ 0 4 ⎥⎦ 1 et ⎡ 9 b = ⎢⎢− 1 ⎢⎣ 8 Considérons la résolution du système : 4 x3 = 8 ⇒ x3 = ⎤ ⎥ ⎥ ⎥⎦ Ax = b 8 4 1 [−1 + 2 x3 ]=1 3 1 [9 − x2 − 2 x3 ]= 2 − 2 x1 + x2 + 2 x3 = 9 ⇒ x1 = −2 3 x2 − 2 x3 = − 1 ⇒ x2 = Algorithme de substitution rétrograde (Backward Substitution) : - Données U1 , b - calculer : xn = bn ann 1 for i = n −1 , 1 s = bi for j = i + 1 ,K , n s = s − ui j x j end xi = s / ui i end Dans le cas d’une matrice triangulaire inférieure, la résolution du système est obtenue par : Algorithme de substitution progressive (forward substitution) : - Données : L1 , b - Calculer : x1 = b1 / l 11 for i = 21 K n s = bi for j = 1 ,K i − 1 s = s − li j xj end x1 = si / l 11 end *On désigne par flop une opération élémentaire à virgule flottante (+,-,*,/) 2 2- Méthode d’élimination de Gauss sans pivotement : Exemple : résoudre A x = b avec ⎡− 3 2 − 1⎤ A = ⎢⎢ 6 − 6 7 ⎥⎥ ⎢⎣ 3 − 4 4 ⎥⎦ ⎡− 1 ⎤ b = ⎢⎢− 7 ⎥⎥ ⎢⎣− 6 ⎥⎦ L’algorithme de substitution de Gauss transforme le système original en : ~ Ux = b avec U une matrice triangulaire supérieure. Utilisons le processus pour éliminer la première variable : − 3 x1 + 2 x2 − 1 x3 = b1 ⇒ x1 = − 1 (b1 − 2 x2 + x3 ) 3 6 x1 − 6 x 2 + 7 x3 = b2 ⎡ 1 ⎤ ⇒ − 6 ⎢− (b1 − 2 x2 + x3 )⎥ − 6 x2 + 7 x3 = b2 ⎣ 3 ⎦ 3 x1 − 4 x2 + 4 x3 = b3 ⎡ 1 ⎤ 3 ⎢− (b1 − 2 x2 + x3 )⎥ − 4 x2 + 4 x3 = b3 ⎣ 3 ⎦ Le système original est transformé en : A1 x = b1 avec ⎡ −3 A1 = ⎢⎢ 0 ⎢⎣ 0 2 −2 −2 −1⎤ 5 ⎥⎥ 3 ⎥⎦ ⎡ −1 ⎤ et b1 = ⎢⎢ −9 ⎥⎥ ⎢⎣ −7 ⎥⎦ Et après la substitution de la deuxième variable, on trouve le système : A2 x = b2 avec ⎡ −3 A2 = ⎢⎢ 0 ⎢⎣ 0 2 −2 0 −1 ⎤ 5 ⎥⎥ − 2 ⎥⎦ ⎡ −1 ⎤ et b 2 = ⎢⎢ −9 ⎥⎥ ⎢⎣ +2 ⎥⎦ On voit bien qu’on trouve un système linéaire avec une matrice triangulaire supérieure qui peut être résolu avec l’algorithme de substitution rétrograde. 3 Algorithme d’élimination de Gauss : for i = 1 ,K , n − 1 for k = i + 1, K , n for j = i + 1 ,K , n a akj ← akj − aki ij aii end end end mki = aki est le multiplicateur de la ligne k et aii est le pivot de la variable xi , il doit être non nul. aii ~ Remarquons aussi que le vecteur b a subi des transformations b → b bk ← bk − mki bi À la fin, on trouve une matrice triangulaire supérieure. L’opérateur \ de MATLAB utilise une version robuste de l’élimination de Gauss. 4 3- Méthode de factorisation LU On cherche à décomposer la matrice originale en un produit de matrices triangulaires inférieure et supérieure : A = LU ⇒ LU x = b ⇒ Ly = b ⇒ après une substitution progressive on trouve : y = L−1 b et après une substitution rétrograde on trouve x =U −1 y L’algorithme qui sera développé est une amélioration de l’algorithme d’élimination de Gauss. Revenons à l’exemple de départ : ⎛ −3 ⎜ A=⎜ 6 ⎜ 3 ⎝ 2 −6 −4 −1⎞ ⎟ 7 ⎟ 4 ⎟⎠ ⎛ −1 ⎞ ⎜ ⎟ b = ⎜ −7 ⎟ ⎜ −6 ⎟ ⎝ ⎠ Définissons les matrices : ⎡1 M 1 = ⎢⎢2 ⎢⎣1 0 1 0 0⎤ 0⎥⎥ 1 ⎥⎦ ⎡1 M 2 = ⎢⎢0 ⎢⎣0 0 1 −1 0⎤ 0⎥⎥ 1 ⎥⎦ La matrice obtenue après l’élimination de la 1re variable est : ⎡− 3 A1 = M 1 A = ⎢⎢ 0 ⎢⎣ 0 −1⎤ 5 ⎥⎥ 3 ⎥⎦ 2 −2 −2 ← 1re ligne inchangée des 0 en dessous de la diagonale Aussi, après la 2e élimination, la matrice devient : ⎡− 3 A2 = M 2 A1 = ⎢⎢ 0 ⎢⎣ 0 inchangée 2 −2 0 −1 ⎤ 5 ⎥⎥ −2⎥⎦ ← inchangée =U 0 en dessous de la diagonale Ainsi, pour éliminer la i ème variable ⇔ mettre des 0 dans la i ème colonne à partir de la ligne i + 1. Il suffit juste de calculer les termes akj pour k et j = i + 1,...n akj ← akj − mki aij avec k = i + 1,.., n et j = i + 1,...n 5 Définissons les matrices : ⎡ 1 ⎢ M 1 = ⎢ −m21 ⎢ ⎣ −m31 0 1 0 0⎤ ⎥ 0⎥ 1 ⎦⎥ ⎡1 M 2 = ⎢⎢ 0 ⎣⎢ 0 0 1 − m32 0⎤ 0 ⎥⎥ 1 ⎦⎥ Et soit le produit : 0 ⎡ 1 ⎢ M 1 A = ⎢− m21 1 ⎢⎣− m31 0 ⎡a11 = ⎢⎢a21 − m21 a11 ⎢⎣a31 − m31 a11 0⎤ 0⎥⎥ 1 ⎥⎦ ⎡a11 ⎢a ⎢ 21 ⎢⎣a31 a12 a22 − m21 a12 a32 − m31 a12 a13 ⎤ a23 ⎥⎥ a33 ⎥⎦ a12 a22 a32 ⎤ a23 − m21 a13 ⎥⎥ a23 − m31 a13 ⎥⎦ a13 nous vérifions que : a a21 − m21 a11 = a21 − 21 a11 = 0 a11 a31 a11 = 0 a11 Ainsi, le processus d’élimination de la première variable est obtenu par la multiplication de A par M1. a31 − m31 a11 = a31 − 6 Généralisation : soit la matrice ⎡1 ⎢ ⎢0 ⎢ ⎢ M (i ) = ⎢ 0 ⎢ ⎢0 ⎢0 ⎢ ⎢⎣ ⎤ ⎥ ⎥ ⎥ ⎥ ⎥ ← (i+1)eme ligne ⎥ ⎥ ⎥ ⎥ ⎥⎦ 0 1 1 − mi +1, i − mi + 2, i − mn , i La matrice triangulaire supérieure U est donc : U = M (n −1) M (n − 2 ) ... M (2 ) M (1) A On veut obtenir la matrice triangulaire inférieure L : M (n−2 ) L O M (2 ) M (1) A = M (−n1−1) U M ( 2) M (1) A = M (−11) ... M (−n1− 2) M (−n1−1)U A = M (−11) M (−21) ....M (−n1− 2) M (−n1−1) U 14444244443 L Calculons M (−11) . Pour cela vérifions que : ⎡1 M = ⎢⎢m21 ⎢⎣m31 −1 11 0⎤ 0⎥⎥ 1 ⎥⎦ 0 1 0 En effet : ⎡1 M 11−1 × M 1 = ⎢⎢m21 ⎢⎣m31 0 1 0 0⎤ 0⎥⎥ 1 ⎥⎦ 0 ⎡ 1 ⎢− m ⎢ 21 1 ⎢⎣− m31 0 0⎤ ⎡1 0⎥⎥ = ⎢⎢0 1 ⎥⎦ ⎢⎣0 0 1 0 0⎤ 0⎥⎥ 1 ⎥⎦ d’autre part : ⎡1 M × M = ⎢⎢ m21 ⎢⎣ m31 −1 1 −1 2 0 1 0 0⎤ 0 ⎥⎥ 1 ⎥⎦ ⎡1 ⎢ ⎢0 ⎢⎣0 0 1 m32 0 ⎤ ⎡1 0 0⎤ ⎢ ⎥ 0 ⎥ = ⎢ m21 1 0 ⎥⎥ 1 ⎥⎦ ⎢⎣ m31 m32 1 ⎥⎦ 14442444 3 L ⇒ La matrice L est formée par les multiplicateurs et 1 à la diagonale : 7 l ii = 1 l ki = mki , k = i + 1,.., n Algorithme de factorisation LU for i = 1,...n − 1 for k = i + 1,...n l ki = mki = aki / aii for j = i + 1,...n ukj = akj − mki aij end end end Afin d’utiliser efficacement la mémoire, on peut aussi utiliser la matrice de A pour stocker U et L. En effet , la partie inférieure à la diagonale de la matrice obtenue après les éliminations contient des zéros, on pourra exploiter ces cases de la mémoire pour sauvegarder les multiplicateurs. Regardons l’exemple suivant : ⎡a11 ⎢a ⎢ 21 ⎢a31 ⎢ ⎣a41 a12 a13 a22 a23 a32 a33 a42 a43 ⎡a11 ⎢l ⎢ 21 ⎢l 31 ⎢ ⎢⎣l 32 a12 a13 u22 u23 l 32 u33 l 42 a11 43 ⎡a11 a14 ⎤ ⎢l a24 ⎥⎥ 21 → ⎢ ⎢ l a34 ⎥ ⎢ 31 ⎥ a44 ⎦ ⎢⎣l 32 a14 ⎤ ⎡a11 ⎥ ⎢l u24 ⎥ 21 → ⎢ ⎢l 31 u34 ⎥ ⎥ ⎢ a11 ⎣l 32 44 ⎥ ⎦ a12 a13 u22 u23 1 a32 1 a33 a142 a143 a12 a13 u22 u23 l 32 u33 l 42 l 43 a14 ⎤ ← inchangée u24 ⎥⎥ → 1 ⎥ a34 ⎥ a144 ⎥⎦ a14 ⎤ u24 ⎥⎥ u34 ⎥ ⎥ l 44 ⎦ Algorithme de factorisation LU for i = 1,...n − 1 for k = i + 1,...n l ki = aki ← aki / aii for j = i + 1,...n ukj = akj ← akj − mki aij end end end 8 REMARQUES IMPORTANTES: ¾ A la i-ième étape de la méthode, on a : • n - i divisions pour le calcul des multiplicateurs ( i = 1,.., n − 1 ) • (n - i ) 2 soustractions et multiplications (pour k , j = i + 1,.., n ) En conséquence, le nombre total de flops est : n −1 n −1 i =1 k =1 ∑ (n − i) + 2(n − i)2 =∑ k + 2k 2 = n(n − 1) n(n − 1) 2 1 1 (2n − 1) = n3 − n 2 − n +2 2 6 3 2 6 Le coût de la méthode de factorisation est de l’ordre de 2 3 n pour n assez grand. 3 ¾ Une permutation des lignes peut être utilisée pour éviter des pivots nuls (pivotement partiel). Si P est la matrice de permutation, le système original est transformé en PA x = Pb . Remarquez que l’ordre des variables xi est inchangé. Il est aussi possible de permuter des colonnes et des lignes pour avoir le plus grand pivot (pivotement complet). Toute permutation doit préserver la solution du système original. En pratique, il est plus simple de programmer (et suffisant) la permutation des lignes. ¾ Dans Matlab, on peut calculer la factorisation d’une matrice A par la commande >> [L,U,P]= lu(A); La matrice P est la matrice de permutation. Lorsque la matrice P coïncide avec la matrice identité, les matrices L et U sont les matrices recherchées (telles que LU= A) autrement LU= P A ¾ Une fois la factorisation LU obtenue, on peut résoudre facilement le système et à faible coût (comparativement à la méthode de Gauss) après la substitution rétrograde, et ce pour différents vecteurs seconds membres b c’est le cas par exemple en dynamique des systèmes linéaires. (voir exemple d’utilisation de la factorisation LU par Matlab à la page suivante) 9 Exemple d’utilisation de la factorisation LU par Matlab : >> A=[ -3 2 -1; 6 -6 7 ; 3 -4 4 ]; >> A A= -3 2 -1 6 -6 7 3 -4 4 >> [L,U,P]= lu(A); >> U U= 6.0000 -6.0000 7.0000 0 -1.0000 2.5000 0 0 -2.0000 >> P P= 0 1 0 1 0 0 0 0 1 >> L L= 1.0000 0 0 -0.5000 1.0000 0 0.5000 1.0000 1.0000 Trouvons la solution pour le second membre >> b= [-1 -7 -6]'; >> b= P*b; >> L\b; >> y= L\b; >> x= U\y x= 2 2 -1 10 4- Analyse de la précision de la solution de la méthode d’élimination de Gauss et sensibilité par rapport aux données : Définition : norme des matrices : *) **) ⎛ n A = A 1 = ma x ⎜⎜ ∑ ai j ⎝ i =1 1≤ j ≤ n ⎞ ⎟ ⎟ ⎠ (somme des colonnes) ⎛ n ⎞ max a = ⎜ ⎟ ∑ i j ∞ ⎝ j =1 ⎠ 1≤ i ≤ n A = A (somme des lignes) ***) A = A 2 = max x ≠0 Ax x 2 (= max λ , pour une matrice symétrique définie positive = max λ , avecλ les valeurs propres de AT A) Si A est symétrique et définie positive alors : A A−1 = d’où 2 = λmax et 1 λmin κ ( A) = A−1 A = λmax λmin _________________________________________________________________________ Soit x, la solution du système : Ax = b et soit δ b une perturbation de b due aux erreurs de troncature ou aux imprécisions dans les données du problèmes physiques. La solution du système sera perturbée de δ xb tel que : A( x + δ xb ) = b + δ b ⇒ Aδ xb = δ b D’après une propriété des normes : δ xb ≤ A−1 b comme A x = b ⇒ b ≤ A x 11 d’où δ xb x ≤ A δb A−1 b ce qui donne l’erreur relative de la solution pour une perturbation de b Si la perturbation sur les données est petite alors l’erreur sur la solution est petite à condition que le nombre A A −1 ne tende pas vers l’infini. Pour une matrice mal conditionnée (i.e. presque singulière) le facteur A A −1 peut être très grand. Étudions la sensibilité par rapport aux variations des coefficients de la matrice A. La solution perturbée satisfait : ( A + δ A) ( x + δ xA ) = b avec A x = b ce qui donne A δ xA + δ A ( x + δ xA ) = 0 ou encore δ xA = − A−1 δ A ( x + δ xA ) . Évaluons maintenons la norme de la perturbation : ⇒ δ xA ≤ A−1 x + δ xA δ A = A−1 A δA A Si la matrice est bien conditionnée alors A −1 A <<∝. Donc, si la perturbation sur la matrice est petite (due par exemple aux erreurs d’arrondis) on a Donc le facteur κ ( A) = A−1 A δA A < <1 ⇒ δ xA x + xA <<1 . décide de la sensibilité de la solution, c’est le nombre de conditionnement. Effet des perturbations simultanées de b et de A : On peut avoir des perturbations de la matrice et du vecteur second membre dues par exemples aux erreurs d’arrondis lors de la factorisation ou aux imprécisions sur le modèles physique/mathématique, dans ce cas on peut montrer que : 12 δx ≤ x +δ x ⎡δA δb ⎤ + ⎢ ⎥ δA ⎣ A b ⎦ 1 − κ ( A) A k ( A) ⎡ 2 1⎤ Exemple : A = ⎢ ⎥ avec δ ≥ 0 ⎣2 + δ 1⎦ detA = 2 − ( 2 + δ ) = − δ ⇒ A est singulière si δ = 0 . On peut calculer : A 1 = 4 + δ . D’autre part : 1 ⎡ − 1 + 1⎤ 3 A −1 = ⎢ d’où A −1 = +1 ⎥ 1 δ ⎣ 2 + δ − 2⎦ δ Ainsi, le nombre de conditionnement de la matrice est : ⎛3 ⎞ 12 κ ( A ) = ⎜ + 1⎟ ( 4 + δ ) = + 7 + δ δ ⎝δ ⎠ On voit que : κ ( A ) → ∞ si δ → 0 Calculons κ ( A ) selon la norme A 2 : Les valeurs propres correspondent à : det( AT A − λ I ) = 0 Si δ → 0 alors κ ( A ) → ∞ dans ce cas la matrice est mal conditionnée Calcul du conditionnement par Matlab : » Cond (A) Répondre Ax = b ⎡1 ⎤ avec b = ⎢ ⎥ ⎣ 2⎦ ⎡1+ ε ⎤ b=⎢ ⎥ ⎣ 2 ⎦ Exemple : K ( A) est une propriété de la matrice Si K ( A) est grand, la solution x est sensible aux données (b et A). Pour un K ( A) donné, un algorithme peut être plus ou moins sensible aux erreurs d’arrondis. 13 Stabilité de l’algorithme de factorisation: Soit le vecteur résidu : r = b − A x̂ , x̂ étant la solution numérique obtenue par l’algorithme de Gauss avec pivotement et substitution rétrograde La solution est exacte si le résidu est parfaitement nul. Or, à cause des erreurs d’arrondis il va rester un résidu r. Si x est la solution exacte, alors l’analyse théorique donne : x − x̂ x̂ ainsi, : erreur relative ≤ κ ( A ) r b r petit ne garantit pas une nécessairement bonne solution, cela dépend du b conditionnement. α Règles du pouce : * L’élimination de Gauss avec le pivotement partiel pour le système Ax = b donne une solution dont le résidu est petit même si κ ( A ) est élevé. ** Si A et b sont stockés à la précision ε m , la solution numérique pour Ax = b pour n’importe qu’elle variante de l’élimination de Gauss est précise à « d » chiffres significatifs d = log10 ( ε m ) − log10 (κ ( A)) . alors d = 6 − 4 = 2 il reste quand-même 2 chiffres exemple : si ε n =10−16 et κ ( A ) =1014 significatifs lorsqu’on travaille en double précision avec une matrice très mal conditionnée! Preuve : ( A + E ) x̂ = b ⇒ Ax̂ − b = r = Ex̂ ≤ E x̂ E étant la matrice d’erreur produite par l’algorithme de Gauss. Un résultat empirique suggère qu’en pratique: E ∞ ≤ ε m A ∞ . r ≤ εm A On en conclut que dépendant de A ∞ ∞ xˆ ainsi r est indépendant de κ ( A) , mais tout de même. Revenons à : 14 δx x − δx K ( A) ⎛ δA δb ⎞ ⎜ ⎟ + δA ⎜⎝ A b ⎟⎠ 1 − K ( A) A ≤ Si les perturbations sont commises par les erreurs d’arrondis dans le stockage des coefficients, δ( A) = ε m A et δb = ε m b ⇒ δx ≤ x + δx 2 ε m K ( A) ~ 2 ε m K ( A) en supposant κ ( A ) ε 1 − K ( A) ε m 1 Posons 10− d = ε m κ ( A ) ⇒ d = log10 ε m − log10 κ ( A ) La commande de MATLAB »condest donne une estimation de κ ( A) . 2ième Partie : METHODES ITERATIVES Algorithme de Jacobi • Démarrer avec une solution x ( 0 ) Boucle : k = 1, K nombre maximum d’itérations For i = 1, n n xi( k +1) = bi − ∑ aij x (jk ) j =1 j ≠i end Test de convergence x ( k +1) − x ( k ) x (k ) ≤ε Condition suffisante de convergence : aii ≥ n ∑ j =1 aij : matrice à forte dominance diagonale 15 Exemple : − 5 x1 − x2 + 2 x3 = 1 2 x1 + x2 + 7 x3 = 32 2 x1 + 6 x2 − 3x3 = 2 Ce système n’est pas à forte dominance diagonale, mais si on interchange les lignes (2) et (3) alors il respecte la condition. Dans ce cas, l’algorithme de Jacobi converge. Æ Programmer cet algorithme et tester le sur cet exemple. L’algorithme Jacobi peut être amélioré en termes de mémoire et de convergence en utilisant l’algorithme Gauss-Seidel : xi( k +1 ) = 1 aii i −1 n ⎤ ⎡ ( k +1 ) b a x aij xi( k ) ⎥ − − ⎢ i ∑ ij j ∑ j =1 j = i +1 ⎣ ⎦ nouvelles valeurs anciennes valeurs Cet algorithme converge pour n’importe quel estimé initial dans le cas de matrice à forte dominance diagonale et pour les matrices symétriques définies positives. On peut aussi réécrire l’équation ci-dessus sous la forme : Dx ( k +1 ) = b − Lx ( k +1 ) − Ux( k ) avec la décomposition : A = L + D + U L étant U respectivement la partie inférieure et supérieure et D la diagonale de A. On peut aussi réécrire l’algorithme de GS sous la forme matricielle : ( D + L ) x( k +1 ) = b − Ux ( k ) ou encore x( k +1 ) = − ( D + L )−1 Ux( k ) + ( D + L )−1 b en soustrayant de chaque membre de l’équation ci-dessus le terme ( D + L ) x( k ) , on trouve : 16 ( D + L ) ( x ( k +1 ) − x ( k ) ) = b − ( D + L + U ) x ( k ) = b − Ax ( k ) Le vecteur r ( k ) = b − Ax ( k ) représente le résidu à l’itération (k ) et x( k +1 ) − x( k ) = δx ( k ) représente la correction de la solution, d’où : P δx( k ) = r ( k ) et x( k +1 ) = x( k ) + δx( k ) La méthode de Jacobi s’écrit aussi sous la forme ci-dessus avec P =D; ou encore x ( k +1 ) = Bx ( k ) + y avec B = − D −1 ( A − D ) y = D −1 b Avec B la matrice d’itération. Pour l’algorithme de Gauss-Seidel la matrice d’itération est B = − ( D + L )−1U Si x est la solution exacte et si l’algorithme est convergeant, alors b = A−1 x et lim x ( k ) = x k → ∞ Comme: x( k +1 ) = Bx( k ) + y et que la solution exacte vérifie aussi : x = Bx + y alors après une soustraction on trouve: e( k +1 ) = x ( k +1 ) − x = B e( k ) = l’erreur entre la solution exacte et la solution de l’itération ( k ) . d’où : e( k +1 ) = B k e( o ) ce qui implique en utilisant la propriété de l’ inégalité triangulaire des normes : e( k +1 ) ≤ B k eo On pose B = ρ ( B) : le rayon spectral ( = λ max avec λ valeur propre de B ). La condition de convergence exige que e ( k ) décroît ce qui implique que : ρ ( B) < 1 . 17 Vérifions cette condition dans le cas de la méthode de Jacobi où B = D −1 ( D − A ) ⎡ ⎢ 0 ⎢ a = ⎢− 21 ⎢ a22 ⎢ a ⎢− n1 ⎣⎢ ann a12 a11 − 0 − an 2 ann a1n ⎤ ⎥ a11 ⎥ a − 2n ⎥ ann ⎥ ⎥ L 0 ⎥ ⎦⎥ L − Si λ est une valeur propre de cette matrice, alors : n ∑b j =1 ij x j = λxi i = 1, K , n avec x le vecteur propre associé qui peut être construit de telle façon que : x i = 1 et x j ≤ 1 n ∑b ⇒ j =1 n Ainsi, si ∑b j =1 ij ij x j = λxi ⇒ λ ≤ n ∑b j =1 ij n x j ≤ ∑ bij j =1 < 1 alors max λ < 1 , ce qui est le cas des matrices à forte dominance diagonale. Méthode du gradient : Revenons à la construction de la solution par la méthode de Jacobi ou Gauss-Seidel. On a vu que la solution à l’itération ( k + 1 ) dépend de la matrice P (matrice de pré-conditionnement) et du résidu r ( k ) : x ( k + 1 ) = x ( k ) + P −1 r ( k ) Plus généralement, on peut aussi considérer l’algorithme, avec P une matrice de préconditionnement à choisir de telle façon que P-1 soit facile à obtenir: 18 x ( k +1) = x ( k ) + α k P −1 r ( k ) et α k est un coefficient qui permet d’accélérer la convergence. Pour obtenir le coefficient optimal on pose la fonctionnelle dite de l’énergie associée au système: f ( x ) = Si A est symétrique, alors ∇f ( x) 1 x ⋅ Ax − x ⋅ b . 2 f ' ( x) = Ax − b (le gradient de f ) et ∇(∇f ( x)) f '' ( x) = A (dit le Hessien de A). Cherchons le coefficient α k et la direction d ( k ) qui garantissent que la fonctionnelle décroît au fil ( ) des itérations: f ( x( k +1 ) ) ≤ f x k . Or, en développant l’expression de la fonction on trouve: f ( x ( k +1) ) = f ( x k ) + α k f ' ( xk ) ⋅ d k + α k2 2 d k ⋅ f ''( xk ) ⋅ d k On a un problème de minimisation (i.e. fonction convexe) si : θ (α k ) = α k2 2 d k ⋅ f ''( xk ) ⋅ d k ≥ 0 . Ce qui est le cas si A est définie positive. D’autre part, la condition de décroissance de la fonction au cours des itérations f ( x ( k +1) ) ≤ f ( x k ) est garantie pour α k petit si : f ' ( x ( k ) ) ⋅ d ( k ) < 0 . Or : f '( x k ) = A x ( k ) − b = − r ( k ) et en posant d k = P −1 r k . Il suffit alors que P −1 soit définie positive pour satisfaire cette condition. Cherchons maintenant le coefficient α k optimal. C’est-à-dire on va fixer d ( k ) et on va faire varier α k tel que : f ( x( k +1 ) ) ≤ f ( x( k ) ) . Cela revient à chercher α qui minimise la fonction f ( x ( k ) + α d ( k ) ) = g ( α ) . Or, à l’optimum on a : g ' (α ) = f ' ( x ( k +1) ) ⋅ d k = 0 On a vu que : f ' ( x ( k +1) ) = Ax ( k +1) − b = Ax k + α k Ad k − b ⇒ f ' ( x ( k +1) ) ⋅ d k = Ax k ⋅ d k + α k d k Ad k − b ⋅ d k = 0 ⇒ ( Ax − b) ⋅ d k rk ⋅ d k αk = − k = k d ⋅ Ad k d ⋅ Ad k 19 Algorithme du Gradient : • Initialiser la solution • Boucle sur les itérations r k = b − Ax k d k = P −1 r k αk = rk ⋅ d k d k ⋅ Ad k x k +1 = x k + α k d k test de convergence end Taux de convergence de l’algorithme du Gradient : %¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ ¤¤¤¤¤¤¤ % Resolution d'un systeme linaire par des algorithmes iteratifs %¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ ¤¤¤¤¤¤¤ clc; clear all; %exemple de systeme: matrice definie positive (a diagonale dominante) A= [2 -1 0 0 ; -1 2 -1 0 ; 0 -1 2 -1 ; 0 0 -1 2]; 20 b=[-1 0 0 -2 ]; %dimension de la matrice n=4; % Algorithmes 'Jacobi' [x,iter]= jacobi(A,b,n) 'Gauss-seidel' [x,iter]= seidel(A,b,n) 'Gradient: acceleration de Gauss-seidel' [x,iter]= gradient(A,b,n) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function [x,iter]= jacobi(A,b,n); NITER= 100; eps= 0.0001; %initialisation x(1:n)=0.0; for iter=1:NITER for i=1:n; s=0.0; for j=1:n; if(i~=j) s= s-A(i,j)*x(j); end end x2(i)= (b(i)+s)/A(i,i); end norm= sqrt((x2-x)*(x2-x)'); if(norm <= eps) x= x2; return else x=x2; end end end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function [x,iter]= seidel(A,b,n); NITER= 100; eps= 0.0001; %initialisation x(1:n)=0.0; for iter=1:NITER xold= x; for i=1:n; s=0.0; for j=1:n; if(i~=j) s= s-A(i,j)*x(j); end end x(i)= (b(i)+s)/A(i,i); 21 end norm= sqrt((x-xold)*(x-xold)'); if(norm <= eps) return else end end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function [x,iter]= gradient(A,b,n); NITER= 100; eps= 0.0001; %initialisation x(1:n)=0.0; for iter=1:NITER xold= x; for i=1:n; s=0.0; for j=1:n; if(i~=j) s= s-A(i,j)*x(j); end end x(i)= (b(i)+s)/A(i,i); end % le vecteur de direction delx= x-xold; % le vecteur residu r= b'- A*x'; %Calcul du coefficient alpha num= delx*r; denom= delx*(A*delx'); alpha= num/denom; %mise à jour de la solution x= xold+ alpha*delx; %test de convergence norm= sqrt((x-xold)*(x-xold)'); if(norm <= eps) return else end end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ans = 22 Jacobi x= -1.1999 -1.3998 -1.5998 -1.7998 iter = 42 ans = Gauss-seidel x= -1.1999 -1.3999 -1.5999 -1.8000 iter = 24 ans = Gradient: acceleration de Gauss-seidel x= -1.2000 -1.4000 -1.6000 -1.8000 iter = 18 >> Méthode du gradient conjugué : Dans le cas où A est symétrique et P-1 positive un autre algorithme plus rapide est celui du gradient conjugué. Posons comme avant : 23 r k = b − Ax k z k = P −1 r k rk ⋅ d k d k ⋅ Ad k x k +1 = x k + α k d k αk = Ce qui donne : r k +1 = r k − α k Ad k . On construit la nouvelle direction par : d k +1 = P −1r k +1 + β k d k = z k +1 + β k d k . Pour obtenir β k on pose la condition que les directions sont A-orthogonales ou conjuguées, c’est-à-dire: d i . A d j = 0 pour i ≠ j . Ainsi, d k +1 . A d k = z k+1. Ad k + β k d k . Ad k = 0 Ce qui donne : βk = − z k +1 ⋅ Ad k d k ⋅ Ad k On peut prouver facilement que: r k +1.d k = 0 . En effet : r k +1.d k = (r k − α k Ad k ).d k = r k .d k − α k Ad k .d k = r k .d k − r k .d k = 0 Ce qui donne : r k +1.d k +1 = r k +1.( z k +1 + β k d k ) = r k +1.z k +1 Le dénominateur dans l’expression de β k peut être transformé en : d k ⋅ Ad k = rk ⋅ d k αk = rk ⋅ zk αk Sachant que : −α k z k +1 ⋅ Ad k = z k +1 ⋅ (r k +1 − r k ) alors l’expression de β k est aussi : βk = z k +1 ⋅ (r k +1 − r k ) zk ⋅ rk Algorithme du gradient conjugué préconditionné : • Initialiser la solution : x0 24 • Poser : r 0 = b − Ax 0 , z 0 = P −1r 0 = d 0 , • Boucle sur les itérations : k=0,1,… rk ⋅ d k rk ⋅ zk = d k ⋅ Ad k d k ⋅ Ad k x k +1 = x k + α k d k αk = r k +1 = r k − α k Ad k z k +1 = P −1 r k +1 z k +1 ⋅ Ad k z k +1 ⋅ (r k +1 − r k ) βk = − k = d ⋅ Ad k zk ⋅ rk d k +1 = z k +1 + β k d k test de convergence ; end On montre que : d k +1 = z k +1 + β k ( z k + β k −1d k −1 ) k +1 = ∑ γ i zi i =0 Les directions sont alors des combinaisons linaires des vecteurs z i . D’autre part d 0 = z0 k sup posons que : d k = ∑ δ i ( P −1 A)i .z 0 i =0 alors: d k +1 = z k +1 + β k d k = z k − α k P −1 Ad k + β k d k k +1 = z + ∑ δ 'i ( P −1 A)i .z 0 k i =0 or z est une combinaison linéaire de d k et d k −1 : k z k = d k − β k d k −1 ce qui prouve que d k +1est une combinaison linéaire des vecteurs ( P −1 A)i .z 0 pour i = 0,..., k + 1. Ce qui veut dire que les directions successives sont combinaisons linéaires des vecteurs z 0 , P −1 Az 0 , ( P −1 A) 2 z 0 ,.... qui forment le sous-espace de Krylov. Cela implique qu’après n directions on obtient la solution exacte (en faisant abstraction aux erreurs d’arrondis)! 25 Dans ce cas le taux de convergence est donné selon la relation : 26 27 28 29 30