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 :
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.
Les méthodes itératives s'approchent pas à pas de la solution recherchée et permettent de trouver une approximation de
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
x = np.random(size = c.size)
while np.square(x - old_x) > seuil:
old_x = x
x = B @ x + c
Si
La méthode de Jacobi découpe la matrice A en M et N avec
Le système à resoudre est
La formule iterative pour
Comme
Pour calculer
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.]
Pour qu'une méthode itérative du type