Try   HackMD

CAMA : ma41 Système matriciel non linéaire

Cours du 25 / 06

Si la matrice

A dépend de
x
(noté
A(x)
), alors le système matriciel
A(x)x=b

n'est pas linéaire.

Exemple :

[1x12x1x2][x1x2]=[b1b2]

donne le système suivant non linéaire puisqu'on a des
carrés :

x1+x1x2=b12x12x22=b2

Comment résoudre un tel système ?

La méthode du point fixe

La méthode du point fixe consiste à appliquer l'algorithme itératif suivant :

xk+1=g(xk)
pour résoudre
g(x)=x
.

  • x0
    donné
  • x¯=g(x¯)
    un point fixe de
    g
  • xk+1=g(xk)
    avec
    k=0,1,2,...

Est-ce que

g(xk)k converge ?

  • Si
    x0<x¯2
    :
    limk+=x¯1
  • Si
    x0>x¯2
    :
    limk+=+

Selon le point de départ, la méthode converge ou diverge.

La méthode du point fixe pour résoudre
A(x)x=b

On doit définir une fonction

g telle que la solution de
J(x)=x
soit la solution du système matriciel non linéaire :
g(x)=A1(x)b

Inverser A est trop coûteux, on écrit notre algorithme itératif sous forme de problème matriciel linéaire à résoudre:

A(xk)xk+1=b
Si on connait
xk
on peut évaluer
A(xk)
, le système est linéaire et permet de trouver
xk+1
.
Le fonctionnement de l'algorithme va dépendre du type de la matrice
A
et de la valeur initiale
x0
.

Exemple :

[x02x1x1x02x0+x1][x0x1]=[19]
Ce système a pour solutions [1, 2] et [2, 1].

def A(x): return np.array([[x[0] - 2*x[1], x[1]] , [x[0] , x[1] + 2*x[0]]]) / 10 b = np.array([1, 9]) / 10 # avec normalisation grossière x = np.array([1, 1]) for i in range(1, 10): x = lin.solve(A(x), b)
...
x^7 =  [1.37317932 2.74635363]
x^8 =  [0.72823777 1.45647516]
x^9 =  [1.37317809 2.74635608]

La solution oscille sans converger. La méthode du point fixe a un petit rayon de convergence.

Appliquon l'inertie
µ = 0.5 # on avance de moitié vers le prochain x x = np.array([3, 2]) for i in range(1, 10): x_old = x x = lin.solve(A(x), b) x = µ * x + (1-µ) * x_old
...
x^9 =  [1.00876429 1.98253948]

La convergence est rapide (9 iterations). L'inertie augmente le rayon de convergence : plus

μ est petit plus le rayon de convergence est grand.

Pour trouver les autres solutions il faut choisir un autre point initial.

La méthode de Newton-Raphson

xk+1=xf(xn)f(xn)

La méthode de Newton est une méthode de point fixe.

xk+1=g(xk)
g(x)=xf(x)f(x)

On souhaite résoudre notre systeme non linéaire. Grâce à la formule ci-dessus, on a en 1D:

f(xk)(xk+1xk)=f(xk)
Ce qui donne en
n
dimensions:
Jf(xk)(xk+1xk)=f(xk)

avec
Jf
la matrice Jacobienne de
f
:

Jf(x)=(f1x1f1xnfnx1fnxn)
Notre système non linéaire avec
f
une fonction vectorielle:
f(x)=A(x)xb

Exemple

On reprend le système matriciel précèdent. La matrice Jacobienne de la fonciton

f est :
Jf(x)=[2x02x12x12x02x0+2x12x0+2x1]

def f(x): return A(x) @ x - b def J_f(x): return 2 * np.array([[x[0] - x[1], x[1] - x[0]], [x[0] + x[1], x[0] + x[1]]]) x = np.array([3, 2]) for i in range(30): delta = lin.solve(J_f(x), -f(x)) x = x + delta
...
x^29 =  [2.05693134 1.05693134]

On converge (moins vite) où la methode du point fixe oscille sans converger.

  • Le coût de la construction de la matrice Jacobienne peut être tres élevé.
  • Pour aller plus vite on peut recalculer la matrice toutes les 3 iterations ou plus.
  • Il s'agit d'une matrice pleine qui rend compliqué la resolution du systeme (une methode de gradient ne marchera pas)