On va augmenter le rayon de convergence la méthode Jacobi amméliorée faite en TD à savoir la méthode de Gauss-Seidel.
On étudiera sa convergence dans différents cas.
Lorsqu'on calcul le x suivant avec Jacobi on ne profite pas du fait que N est triangulaire
et donc qu'on connait la nouvelle valeur de lorsqu'on calcule . Avec Gauss-Seidel
on utilise toujours la dernière valeur calculée ce qui accélère la convergence.
Pour résumer Gauss-Seidel d'un point de vu matriciel on a :
D = np.diag(np.diag(A))
L = np.tril(A, -1)
U = np.triu(A, 1)
et une itération est donnée par la formule suivante :
ou
c.a.d.
Notons que je peux mettre à droite du signe égal si je résoud mon système ligne par ligne en commencant par le haut puisque dans ce cas les utilisés sont connus. C'est ce qu'on a fait lors du dernier TP.
Comme on a fait avec Jacobi, on introduit de l'inertie avec :
Vérifiez que l'on arrive à l'écriture matricielle suivante :
Écrit ainsi on voit que cette méthode consiste à avoir les éléments de la diagonale des 2 cotés de l'égalité. On peut interpréter cela comme un avantage lié à un gain d'information lors des opérations matrice vecteur.
On écrira deux fonctions :
solve_triangular(L,b)
qui retourne la solution de L x = b lorsque L est triangulaire inférieuregauss_seidel_r(A, b, x0, w, n)
qui fait n
iteration de Gauss-Seidel avec w
donné en argument à partirx0
.Comme toujours, attention à limiter les for
et à faire le plus possible d'opérations vectorielles et matricielles.
L'algorithme de Wikipedia est difficile alire, lent et il s'agit de Jacobi avec relaxation et non Gauss-Seidel avec relaxation, il est tout ce qu'il ne faut pas faire.
Est-ce que la méthode de Gauss-Seidel non relaxée converge dans ce cas ?
Trouver un seed
qui permet de générer un cas qui ne converge pas avec Gauss-Seidel de base mais qui
converge avec la relaxation ().
Tracer les courbes de convergence pour le cas retenu avec et sans relaxation.
Toujours dans notre cas retenu,
indiquer quel est l'intervale de
valeurs de qui garantit la convergence pour notre système matriciel A x = b avec toujours le même x0
et un nombre d'itérations à déterminer.
Trouver la valeur optimiale de pour converger le plus rapidement pour ce cas.
La précision demandée pour l'intervale et la valeur optimale est de .
Il semble que soit la limite de la convergence.
Trouver la valeur optimale de doit bien sûr pouvoir être fait rapidement. Pour certains problèmes particulier on connait la formule qui donne le optimal, sinon il faut utiliser des heuristiques sans garanties.