1 CHAPITRE 4 RÉSOLUTION DES SYSTÈMES LINÉAIRES 1 Partie

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