Try   HackMD

CAMA : ma12 Méthodes itératives

Cours du 27 / 04

La simulation numérique

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →

Pour faire cette image, on transforme des équations physique en systèmes matriciels ou les inconnues sont définies en chaque point d'un maillage a définir.

Dans ce cas l'inconnue est la pression et le maillage est une boîte imaginaire comprenant l'avion et l'air qui circule autour.
Si la boîte est un cube avec 1000 points dans chaque direction, on a 1 milliard de points et une matrice a 1 trillion d'éléments :

[a11a12a1,109a21a22a2,109a109,1an2a109,109][p1p2p109]=[f1f2f109]
Cela prendrait 300 000 ans à inverser la matrice.

Inverser une matrice ou résoudre par une méthode directe n'est pas la bonne solution pour résoudre un grand système matriciel.

Méthodes itératives

Les méthodes itératives s'approchent pas à pas de la solution recherchée et permettent de trouver une approximation de

x dans
Ax=b
.

On arrête le calcul lorsqu'on est à une distance choisie de la solution, appelée l'erreur.

On cherchera jamais à avoir une erreur plus petite que notre précision maximale.

On a une formule

xt+1=Bxt+c ou en Python:

x = np.random(size = c.size) while np.square(x - old_x) > seuil: old_x = x x = B @ x + c

Si

x converge on a atteint un point fixe, c.a.d
xt+1=xt
et donc

xt=Bxt+cc.a.d.(IdB)xt=c

Méthode de Jacobi

La méthode de Jacobi découpe la matrice A en M et N avec

  • M
    : matrice diagonale des éléments de la diagonale de
    A
  • N=MA
    (donc 0 sur la diagonale et l'opposé des éléments de
    A
    ailleurs)

Le système à resoudre est

(MN)x=b.

La formule iterative pour

k+1 est :
Mxk+1=Nxk+b

Comme
M
est une matrice diagonale :

a11x1k+1=a12x2ka13x3ka1nxnk+b1a22x2k+1=a21x1ka23x3ka2nxnk+b2a33x3k+1=a31x1ka32x3ka3nxnk+b3annxnk+1=an1x1kan2x3kan1,n1xn1k+bn
Pour calculer
xik+1
il faut diviser par
aii
donc il faut que
A
n'ait pas pas de zéro sur sa diagonale
.

A = np.random.randint(10, size=(4,4)) b = A.sum(axis=1) # la solution est [1,1,1,1]
A:
 [[2 2 6 1]
 [3 9 6 1]
 [0 1 9 0]
 [0 9 3 4]] 
b:
 [11 19 10 16] 
M = np.diag(A) # vecteur N = np.diag(M) - A # np.diag d'une matrice donne un vecteur, np.diag d'un vecteur donne une matrice
M:
 [[2 0 0 0]
 [0 9 0 0]
 [0 0 9 0]
 [0 0 0 4]]
N:
 [[ 0 -2 -6 -1]
 [-3  0 -6 -1]
 [ 0 -1  0  0]
 [ 0 -9 -3  0]]
x = np.random.random(4) for i in range(20): x = (N @ x + b) / M
...
x_16 = [-4.194 -1.298  0.76  -4.026]
x_17 = [6.531 3.45  1.255 6.35 ]
x_18 = [-4.891 -1.608  0.728 -4.704]
x_19 = [7.277 3.779 1.29  7.073]

Ca ne converge pas.

2e essai :

A = np.random.randint(10, size=(4,4)) A = A + np.diag(A.sum(axis=0)) b = A.sum(axis=1) # la solution est [1,1,1,1]
A:
 [[24  2  4  8]
 [ 0 24  9  3]
 [ 4  6 16  5]
 [ 6  2  1 32]] 
b:
 [38 36 31 41] 
M = np.diag(A) # vecteur N = np.diag(M) - A # np.diag d'une matrice donne un vecteur, np.diag d'un vecteur donne une matrice
M:
 [[24  0  0  0]
 [ 0 24  0  0]
 [ 0  0 16  0]
 [ 0  0  0 32]]
N:
 [[ 0 -2 -4 -8]
 [ 0  0 -9 -3]
 [-4 -6  0 -5]
 [-6 -2 -1  0]]
x = np.random.random(4) for i in range(20): x = (N @ x + b) / M
...
x_17 = [1. 1. 1. 1.]
x_18 = [1. 1. 1. 1.]
x_19 = [1. 1. 1. 1.]

Pourquoi le 2e cas marche ?

Pour qu'une méthode itérative du type

x=Bx+c converge il faut au choix :

  • ρ(B)<1
    • ρ
      : le rayon spectral (la plus grande valeur propre en valeur absolue)
  • ||B||<1
    où :
    ||B||=supv||Bv||||v||=supvt.q.||v||=1||Bv||=supvt.q.||v||1||Bv||

Cas de la méthode de Jacobi

  • On respecte ces conditions si
    A
    est a diagonale dominante, c.a.d. que chaque élément de la diagonale est plus grand que tous les autres de sa ligne et colonne.
  • Jacobi converge aussi si
    A
    est symétrique, réelle et définie positive (
    x,xTAx>0
    ).