METHODES ITERATIVES EN ALGEBRE LINEAIRE

publicité
IPT_TP_méthodes itératives en algèbre linéaire_PCSI
METHODES ITERATIVES
EN ALGEBRE LINEAIRE
Exercice 1
On désire résoudre le système linéaire AX = B où A est une matrice carrée de taille n et B un vecteur colonne.
On s'inspire des méthodes de points fixes en une variable.
On écrit A = P − A1 avec P inversible. On a alors,
−1
−1
−1
AX = B PX = A1X + B d'où X = P (A1X + B) = P A1X + P B
−1
−1
Ainsi le vecteur X inconnu est point fixe de l'application X # P A1X + P B qui est affine mais vectorielle.
 X0 donné
On va donc utiliser la suite récurrente 
 Xk+1 = P− 1A1Xk + P− 1B
En dimension 1, on sait que la suite récurrente affine uk + 1 = axk + b converge vers le point fixe de ax + b ssi |a| < 1.
Pour une matrice A, il existe des directions privilégiées, c.a.d des vecteurs X non nuls tels que AX = λX, λ étant donc le
facteur d'amplification ou de réduction dans la direction du vecteur X (on dit que X est un vecteur propre de A et que λ
est une valeur propre de A). Si on travaille sur , toute matrice complexe possède n valeurs propres.
On note ρ(A) le maximum des modules des valeurs propres complexes de A (facteur d'amplification maximal). Ce réel
positif s'appelle le rayon spectral de A.
−1
−1
Ici, pour qu'il y ait convergence de la suite récurrente Xk+1 = P A1Xk + P B, il faut et il suffit que les n valeurs
−1
−1
propres de P A1 soient toutes de module < 1, c.a.d ρ(P A1) < 1. Dans ce cas, la méthode converge vers l'unique point
fixe qui est la solution recherchée du système AX = B.
On prouve par récurrence la formule
−1
−1
−1
−1
−1
Xk = (P A1)k X0 + ((P A1)k − 1 + (P A1)k − 2 + ... + (P A1) + I) (P B)
−1
−1
−1
Quand ρ(P A1) < 1, la suite ((P A1)k) converge vers 0, ce qui signifie que les n2 composantes de la matrice (P A1)k
−1
−1
convergent toutes vers 0. Il reste (noter que P A1 = In − P A),
lim
k@+∞
−1
−1
−1
−1
−1
Xk = ((I + (P A1) + (P A1)2 + ... + ((P A1)k + ... )(P B) = (I − P Α1)
−1
−1
−1
(P B) = A B = X∞
en notant X∞ la solution exacte. On définit ek = Xk − X∞ qui représente l'écart entre la solution approchée au rang k et la
−1
−1
solution exacte. On a ek + 1 = (P A1) ek . La suite (ek) est "géométrique", de" raison" P A1 d'où
−1
ek = (P A1)k (X - X∞)
qui tend vers 0.
Pour le test d'arrêt, on ne connaît pas X∞ mais on a
A ek = A(Xk − X∞) = AXk − B
On peut donc prendre comme test d'arrêt
||AXk − B||2
n
où ||-||2 désigne la norme euclidienne sur .
calcul de ρ(A) : utiliser np.linalg.eigvals(A) qui renvoie la liste des valeurs propres
calcul de ||X||2 : np.linalg.norm(X, 2)
>>>
Ecrire une fonction rayon_spectral(M) qui calcule ρ(M) (utiliser max(liste) pour calculer le maximum des termes d'une
liste).
On décrit maintenant trois méthodes correspondant à des choix de P différents et on donne des critères de convergence,
−1
c.a.d des critère qui garantissent que ρ(P A1) < 1.
On écrit la matrice A sous la forme A = D − U − L où D est la diagonale de A, − U la matrice triangulaire supérieure
extraite de A et nulle sur la diagonale et − L la matrice triangulaire inférieure extraite de A et nulle sur la diagonale.
- page 1 -
IPT_TP_méthodes itératives en algèbre linéaire_PCSI
Plus la matrice P intègre une part significative de A et plus la méthode a de chance d'être efficace. Dans le cas limite où
−1
P = A et A1 = 0, on a en une seule itération X1 = A B = X∞ .
Méthode de Jacobi
Dans cette méthode, on choisit P = D et A1 = − L − U en supposant tous les ai,i non nuls
−1
−1
La méthode s'écrit Xk+1 = D ( − L − U)Xk + D B
ce qui donne en terme de composantes, les relations de récurrence :
xi(k+1) =
1
(b − ∑ a x (k) )
ai,i i j ≠ i i, j j
Noter que la programmation nécessite deux vecteurs de longueur n car il faut avoir calculé tous les xi(k+1) avant de
pouvoir remplacer Xk par Xk + 1 .
La méthode converge si A est à diagonale strictement dominante : cela signifie que
|ai,i| >
∑ |ai , j|
j≠i
>>>
Ecrire une fonction jacobi(A, B, nb_iter, precision) où A est une matrice carrée inversible, B un vecteur colonne de
même taille; nb_iter fixe le nombre maximal d'itérations et precision est utilisé dans le test d'arrêt sous la forme
||AXk − B||2 ≤ 10− precision
−1
−1
On commencera par convertir A et B en tableaux numpy puis on calculera la matrice D A1 = In − D A.
On affichera le rayon spectral ainsi que le nombre d'itérations effectuées et l'écart final.
Pour gagner du temps, on pourra utiliser la fonction sum(liste) qui retourne la somme des termes de la liste.
>>>
Tester sur les matrices
• A1 = [[3, −1] , [1, 2]] (à diagonale strictement dominante), B1 = [1,5]
• A2 = [[1, −2] , [−2, 5]] (diagonale non dominante mais symétrique), B2 = [1,−1]
Méthode de Gauss-Seidel
Dans cette méthode, on choisit P = D + L , A1 = − U en supposant tous les ai,i non nuls
−1
La méthode s'écrit Xk+1 = − (D + L) (− UXk + B)
ce qui donne en terme de composantes, les relations de récurrence :
xi(k+1)
1
=
(b −
ai,i i
i−1
∑
n
ai, j xj(k + 1)
j=1
−
∑
ai, j xj(k) )
j=i+1
La différence avec la méthode de Jacobi, c'est que les nouvelles composantes sont immédiatement intégrées dans le
calcul des composantes suivantes. Du point de vue de la programmation, un seul vecteur de taille n suffit pour stocker
toutes les composantes dont on a besoin.
La méthode converge si A est à diagonale strictement dominante mais aussi lorsque A est symétrique et que ses valeurs
propres sont toutes réelles et > 0.
Et si la matrice A ne satisfait aucune de ces deux conditions ? Du moment que A est inversible, on peut s'en sortir en
remarquant que
AX = B (ATA)X = ATB
et ATA est une matrice symétrique dont on sait prouver que les valeurs propres sont toutes réelles > 0.
>>>
Ecrire une fonction Gauss_Seidel(A, B, nb_iter, precision) sur le même modèle que Jacobi.
>>>
Tester sur les matrices A1 et A2 puis comparer avec les systèmes équivalents de matrices respectives A1TA1 et A2TA2.
Méthode de relaxation
C'est une généralisation de la méthode de Gauss-Seidel. On rajoute un paramètre ω qu'on va chercher à ajuster pour
−1
diminuer le rayon spectral de P A1 et ainsi accélérer la convergence. On choisit cette fois,
1
1
1
1−ω
P = D + L , A1 = D + L − A = D + L − (L + U + D) =
D−U
ω
ω
ω
ω
Pour ω = 1, c'est la méthode de Gauss-Seidel.
La méthode s'écrit
- page 2 -
IPT_TP_méthodes itératives en algèbre linéaire_PCSI
Xk+1 = (
1
−1 1 − ω
−1
D + L) ((
D − U)Xk + B) = (D + ωL) ((1 − ω)D − ωU)Xk + ωB)
ω
ω
ce qui donne en terme de composantes, les relations de récurrence :
i−1
xi(k+1) =
n
1
( − ω ∑ ai, j xj(k + 1) − ω ∑ ai, j xj(k) + ai, i xi(k) + ωbi)
ai,i
j=1
j=i
La méthode converge
• si A est à diagonale strictement dominante et 0< ω ≤ 1
• si A est symétrique à valeurs propres réelles > 0 (donc si A est de la forme BTB, B inversible) et 0< ω < 2
>>>
Ecrire une fonction relaxation(A, B, w, nb_iter, precision) qui implémente la méthode de relaxation.
>>>
Tester sur les matrices
• A2, B2 et ω = 1,4
• A3 = [[4, 5, 9] , [7, 1, 6] , [5, 2, 9]] , B3 = [4, 9, 3] , ω = 1
• A3TA3 , A3TB et ω = 1
Recherche du paramètre ω optimal
On suppose que A est de la forme BTB, B inversible de sorte que la méthode de relaxation converge pour 0 < ω < 2.
1
−1
−1
On veut tracer la courbe ω # ρ(P A1) = ρ(In − P A) où P = D + L .
ω
>>>
Ecrire une fonction w_optimal(A, N) qui réalise un échantillonnage de N points ω dans ]0,2[ et calcule le rayon spectral
−1
correspondant ρ(In − P A).
(si A est bien de la forme voulue, on doit trouver ρ < 1 mais le calcul est possible pour A quelconque tant que P est
inversible).
−1
Faire le tracé de la courbe ω # ρ(P A1).
>>>
Tester sur la matrice A2 et expliquer pourquoi on avait proposé la valeur ω = 1,4 plus haut.
Tester sur A3TA3 et trouver une valeur approchée du ω optimal. Appeler la fonction relaxation pour A3TA3 avec cette
valeur de ω et constater l'amélioration de la convergence.
Exercice 2
Etant donné une matrice carrée A dans Mn() ou Mn(), on cherche B tel que B2 = A (B est une racine carrée de A).
L'existence et l'unicité de B ne sont pas garanties. C'est le cas cependant, si on suppose qu'on a les deux conditions :
• A et B sont symétriques
• les valeurs propres de A et B sont toutes strictement positives.
C'est le cas quand A est de la forme CTC avec C inversible (et on peut même supposer C triangulaire supérieure).
On suppose désormais que A est de cette forme. On veut déterminer B par une méthode itérative.
On s'inspire de la méthode utilisée dans pour trouver la racine carrée d'un réel positif a : xn + 1 =
1
a
(x + ) (c'est la
2 n xn
méthode de Newton attachée à la fonction f (x) = x2 − a).
On considère donc la suite de matrices définie par la relation de récurrence :
1
X0 = In , Xk + 1 = (Xk + AXk− 1)
2
On prouve qu'elle converge bien vers l'unique racine carrée de A qui est symétrique à valeurs propres > 0.
>>>
Ecrire une fonction rac_carree(A, N, precision) qui calcule une approximation de B avec au plus N itérations et un test
d'arrêt de la forme ||A − Xk2||2 ≤ 10− precision.
Afficher l'écart final ||A − Xk2||2 au moment où on stoppe les itérations.
- page 3 -
Téléchargement
Study collections