Vous êtes sur la page 1sur 8

TP3 - Méthodes itératives de

résolution de systèmes linéaires


Ma 313 – 04/11/2021

Renaud Vallette - 3PA2


Introduction :
Le but de ce TP est d’éprouver l’efficacité de différentes méthodes itératives de résolution de
systèmes linéaires de forme 𝐴𝑥 = 𝑏. Pour 3 systèmes distincts, nous comparerons les méthodes de
Jacobi, Gauss-Seidel et la méthode de relaxation pour un paramètre 𝜔 donné.

Les méthodes itératives que nous allons étudier consistent à décomposer la matrice 𝐴 en 3 matrices
𝐷, 𝐸, et 𝐹 de sorte que 𝐴 = 𝐷 − 𝐸 − 𝐹. On pose ensuite deux matrices 𝑀 et 𝑁 telles que 𝐴 = 𝑀 − 𝑁
(la valeur des matrices 𝑀 et 𝑁 varient selon la méthode utilisée).
On a alors :

𝐴𝑥 = 𝑏
(𝑀 − 𝑁)𝑥 = 𝑏

𝑀𝑥 = 𝑁𝑥 + 𝑏

On construit une suite de vecteurs 𝑥 (𝑘) ∈ ℝ𝑛 par la relation suivante :

𝑀𝑥 (𝑘+1) = 𝑁𝑥 (𝑘) + 𝑏

Avec 𝑥 (0) un vecteur initial choisi (nous prendrons ici le vecteur nul). On résout donc ces systèmes dont
les 𝑥 (𝑘+1) sont les solutions. A chaque nouvelle résolution, nous évaluerons l’erreur relative entre la
solution trouvée par la méthode itérative et la solution trouvée par la méthode directe numpy.solve.
La méthode itérative sera arrêtée pour une erreur relative inférieure à 10−10 ou au bout de 100
répétitions.

Méthode de Jacobi :

On pose 𝑀 = 𝐷 et 𝑁 = 𝐸 − 𝐹

Méthode de Gauss-Seidel :

On pose 𝑀 = 𝐷 − 𝐸 et 𝑁 = 𝐹

Méthode de la relaxation :
1 1
On pose 𝑀 = 𝜔
𝐷 − 𝐸 et 𝑁 = (𝜔 − 1) 𝐷 + 𝐹 , 𝜔 ∈ [0,2]

Il est possible d’étudier la convergence de ces méthodes en calculant le rayon spectral de la matrice
d’itération propre à chaque méthode, cette matrice étant donnée par 𝐵 = 𝑀−1 𝑁. Cette étude
préalable permet de ne pas se lancer dans une résolution d’un système complexe avec une méthode
divergente qui n’apportera pas de résultat.

1
Programmation de la méthode de Jacobi
On suit la méthode décrite en introduction : on commence par définir les matrice 𝑀 et 𝑁 selon la
méthode de Jacobi, puis on résout l’un après l’autre les systèmes dont les solutions sont les vecteurs
𝑥 (𝑘+1) avec la fonction numpy.solve jusqu’à ce que l’erreur sur la solution soit suffisamment petite ou
que le nombre d’itérations dépasse 100.

def jacobi(A,b):
n = A.shape
M = np.zeros(n)
N = np.zeros(n)
M = np.diag(np.diag(A))
N = M-A
x = np.zeros((n[0],1))
err = []
it = []
for i in range(100):
it.append(i)
x = np.linalg.solve(M,N@x+b)
erreur = np.linalg.norm(A@x-b)
err.append(erreur)
if erreur <= 10**(-10):
break
return it,err

La fonction retourne deux listes, l’une contenant le numéro de chaque itération, et l’autre les erreurs
respectives qui correspondent à ces itérations. Elles nous permettront de tracer le graphique des
erreurs en fonction du nombre d’itérations.

Programmation de la méthode de Gauss-Seidel


On procède pour Gauss-Seidel de la même manière que pour Jacobi, la seule différence étant la
définition des matrices 𝑀 et 𝑁.

def gauss_seidel(A,b):
n = A.shape
M = np.zeros(n)
N = np.zeros(n)
M = A - np.triu(A,1)
N = -np.triu(A,1)
x = np.zeros((n[0],1))
err = []
it = []
for i in range(100):
it.append(i)

2
x = np.linalg.solve(M,N@x+b)
erreur = np.linalg.norm(A@x-b)
err.append(erreur)
if erreur <= 10**(-10):
break
return it,err

De la même manière, on récupère en sortie deux listes contenant le nombre d’itérations et les erreurs
successives.

Programmation de la méthode de relaxation


Là encore, la seule différence réside dans la définition de 𝑀 et 𝑁. La fonction prend ici un paramètre
supplémentaire 𝜔, caractéristique de la méthode de relaxation. On pose dans ce TP 𝜔 = 1,35.

def relaxation(A,b,w):
n = A.shape
M = np.zeros(n)
N = np.zeros(n)
M = (1/w)*(np.diag(np.diag(A)))+np.tril(A,-1)
N = ((1/w)-1)*(np.diag(np.diag(A)))-np.triu(A,1)
x = np.zeros((n[0],1))
err = []
it = []
for i in range(100):
it.append(i)
x = np.linalg.solve(M,N@x+b)
erreur = np.linalg.norm(A@x-b)
err.append(erreur)
if erreur <= 10**(-10):
break
return it,err

Une fois de plus, la fonction renvoie les itérations et les erreurs correspondantes dans deux listes.

3
Premier système
Le premier système, à 100 équations et 100 inconnues, est décrit par les matrices 𝐴 et 𝑏 données par
les expressions suivantes :
1
𝑃𝑜𝑢𝑟 𝑖 ≠ 𝑗, 𝑎𝑖,𝑗 =
{ 13 + (3𝑖 − 4𝑗)2
𝑃𝑜𝑢𝑟 𝑖 = 𝑗, 𝑎𝑖,𝑗 = 1
𝑖
𝑏𝑖 = cos ( )
9
Pour la résolution de ce système, on comparera les méthodes de Jacobi et de Gauss-Seidel. Grâce aux
sorties des fonctions vues plus haut, on peut tracer l’évolution des erreurs relatives sur la solution en
fonction du nombre d’itérations, et ainsi observer la vitesse de convergence (ou la divergence) des
méthodes.

On obtient pour ce premier système le graphique suivant :

On peut observer que les deux méthodes convergent vers la solution. La méthode de Jacobi s’arrête
avec une erreur relative sur la solution de 7.979 × 10−11 au bout de 14 itérations, alors que la
méthode de Gauss-Seidel s’arrête après 6 itérations seulement en donnant une erreur sur la solution
de 1.885 × 10−12. La méthode de Gauss-Seidel est donc bien plus efficace sur le système 1 puisqu’elle
est près de 42 fois plus précise et plus de 2 fois plus rapide.

4
Deuxième système
Le deuxième système, de même taille que le premier, n’est différent du premier que par la définition
de sa matrice 𝐴 :
1
𝑎𝑖,𝑗 =
1 + 3|𝑖 − 𝑗|
On compare là aussi les méthodes de Jacobi et Gauss-Seidel en se basant sur les mêmes données. Le
nouveau graphique donne :

On remarque que l’erreur sur la solution donnée par la méthode de Jacobi augmente au fur et à mesure
du temps jusqu’à la 100𝑒 itération : elle diverge. Cette méthode est donc inappropriée pour la
résolution de ce système. La méthode de Gauss-Seidel, elle, donne une solution satisfaisante de
3.923 × 10−11 après 35 itérations. Ici encore donc, la méthode de Gauss-Seidel est plus appropriée à
la résolution.

5
Troisième système
Le troisième système fait intervenir une matrice 𝐴 tri-diagonale de la forme :

𝛼=4
Avec {𝛽 = −1
𝛾 = −2

On comparera cette fois-ci les méthodes de Jacobi, Gauss-Seidel, et la méthode de relaxation pour un
paramètre 𝜔 = 1,35. Le graphique des erreurs en fonction du nombre d’itérations est le suivant :

Toutes les méthodes convergent pour ce système. La méthode de relaxation est la plus efficace avec
une erreur finale de 8.791 × 10−11 obtenue après 25 itérations. Puis vient la méthode de Gauss-
Seidel, qui donne une erreur de 6.209 × 10−11 après 35 itérations, et enfin la méthode de Jacobi qui,
au bout de 84 itérations, fournit une erreur sur la solution de 8.474 × 10−11 .

6
Conclusion
Pour les systèmes rencontrés, il semble que la méthode de Gauss-Seidel soit la plus efficace. La
méthode de la relaxation (équivalente à celle de Gauss-Seidel pour 𝜔 = 1), avec un paramètre
adéquat, semble être efficace également.

Pour tenter de vérifier si la méthode de Gauss-Seidel est toujours plus efficace que celle de Jacobi, j’ai
essayé de répéter le raisonnement de ce TP sur une série de systèmes aléatoires. J’ai voulu résoudre
différents systèmes aléatoires plusieurs fois avec les méthodes de Jacobi et Gauss-Seidel, et faire une
moyenne pour chaque système aléatoire de l’erreur finale et du nombre d’itérations nécessaire.

Malheureusement, pour la très grande majorité des systèmes, les méthodes étaient divergentes et
donc les erreurs très élevées. Je n’ai donc pas pu obtenir de résultat exploitable, ce qui confirme que
pour de réelles applications, calculer le rayon spectral de la matrice d’itération afin d’étudier
préalablement la convergence est essentiel. On s’évite ainsi de longs calculs infructueux.

Vous aimerez peut-être aussi