Home CAMA : ma11 Conditionnement d'une matrice
Post
Cancel

CAMA : ma11 Conditionnement d'une matrice

Lien de la note Hackmd

Cours du 27 / 04

Soit la matrice symétrique $A$ suivante :

1
A = np.array([[10, 7, 8, 7], [7, 5, 6, 5], [8, 6, 10, 9], [7, 5, 9, 10]])
1
2
3
4
array([[10,  7,  8,  7],
       [ 7,  5,  6,  5],
       [ 8,  6, 10,  9],
       [ 7,  5,  9, 10]])
1
lin.det(A) # calcul son determinant
1
0.9999999999999869  # on peut arrondir a 1

Construisons $b$ tel que $A{\bf x} = b$ et $\bf x = [1,1,1,1]$

1
b = A.sum(axis=1)
1
[32 23 33 31]
1
x = lin.solve(A, b)
1
array([1., 1., 1., 1.])
1
2
3
bp = [32.1, 22.9, 33.1, 30.9]
eb = lin.norm(b - bp) / lin.norm(b) 
# une erreur se mesure par rapport à la valeur de la donnée
1
0.0033319453118976702

On a une erreur de l’ordre de $0,3\%$.

Regardons la solution ${\bf x}$ de notre système matriciel perturbé:

1
xp = lin.solve(A, bp)
1
array([  9.2, -12.6,   4.5,  -1.1])
1
ex = lin.norm(x - xp) / lin.norm(x) #mesure de l'erreur
1
8.19847546803699

L’erreur est de l’ordre de 8.

1
ex / eb
1
2460.567236431514

Pourquoi ?

\(\begin{aligned} A ({\bf x} + {\bf \delta x}) &= {\bf b} + {\bf \delta b} \quad \textrm{et donc} \\ A \, {\bf \delta x} &= {\bf \delta b} \; \textrm{ puisque } A {\bf x} = {\bf b} \quad \textrm{et finalement}\\ {\bf \delta x} &= A^{-1} \, {\bf \delta b} \end{aligned}\) Comme $A$ et son inverse sont des applications linéaires :

\[||{\bf b}|| \le ||A|| \, ||{\bf x}|| \quad \textrm{et} \quad ||{\bf \delta x}|| \le ||A^{-1}|| \, ||{\bf \delta b}||\]

donc :

\[\frac{||{\bf \delta x}||}{||{\bf x}||} \le ||A^{-1}|| \, \frac{||{\bf \delta b}||}{||{\bf x}||} \le ||A^{-1}|| \, ||A|| \, \frac{||{\bf \delta b}||}{||{\bf b}||}\]
1
lin.norm(lin.inv(A)) * lin.norm(A)
1
3009.5787080586942
1
np.linalg.cond(A) # scipy n'a pas le conditionnement mais numpy l'a. 
1
2984.0927016757555 # different de 3009

Perturbons la matrice

1
2
3
np.random.seed(0)

dA = 2 * np.random.random(size = A.shape) - 1
1
2
3
4
array([[ 0.098,  0.43 ,  0.206,  0.09 ],
       [-0.153,  0.292, -0.125,  0.784],
       [ 0.927, -0.233,  0.583,  0.058],
       [ 0.136,  0.851, -0.858, -0.826]])
1
ea = lin.norm(dA) / lin.norm(A) # erreur relative sur A
1
0.06868857112100454
1
Ap = A + dA
1
2
3
4
5
array([[10.098,  7.43 ,  8.206,  7.09 ],
       [ 6.847,  5.292,  5.875,  5.784],
       [ 8.927,  5.767, 10.583,  9.058],
       [ 7.136,  5.851,  8.142,  9.174]])

1
xp = lin.solve(Ap, b)
1
array([-12.365,  15.574,  10.146,  -5.94 ])
1
ex = lin.norm(xp - x) / lin.norm(x)
1
11.432687335993894
1
ex / ea # valeur de l'erreur
1
166.44235204505293

Pour retrouver le conditionnement de $A$ dans ce cas : \(\begin{align} & (A + \Delta A) \, ({\bf x} + {\bf \delta x}) = {\bf b} \quad \textrm{et donc} \\ & A \, {\bf \delta x} + \Delta A \, ({\bf x} + {\bf \delta x}) = 0 \; \textrm{ puisque } A {\bf x} = {\bf b} \quad \textrm{et finalement}\\ & {\bf \delta x} = -A^{-1} \,\Delta A \, ({\bf x} + {\bf \delta x}) \quad \textrm{et} \\ & ||{\bf \delta x}|| \le ||A^{-1}|| \, ||\Delta A|| \, ||{\bf x} + {\bf \delta x}|| \end{align}\) Donc \(\begin{align} \frac{||{\bf \delta x}||}{||{\bf x} + {\bf \delta x}||} \le ||A^{-1}|| \, ||\Delta A|| = ||A^{-1}|| \, ||A|| \, \frac{||\Delta A||}{||A||} \end{align}\) et \(\begin{align} \frac{||{\bf \delta x}||}{||{\bf x} + {\bf \delta x}||} \le cond(A) \, \frac{||\Delta A||}{||A||} \end{align}\)

Propriétés

  • $cond(A) \ge 1$ car $Id = A\, A^{-1}$ et donc $1 \le A \, A^{-1} $
  • $cond(A) = cond(A^{-1})$
  • $\displaystyle cond_2(A) = \frac{\max_i\lambda_i}{\min_i\lambda_i}$ si la matrice est réelle
    • 2 indique qu’on utilise la norme 2
    • $\lambda_i$ sont les valeurs propres de A
      1
      2
      
      vp = lin.eigvals(A)
      vp.max() / vp.min()
      
  • si A est unitaire ou orthogonale : $cond_2(A) = 1$
  • le conditionnement n’est pas modifié par transformation unitaire

Préconditionnement

This post is licensed under CC BY 4.0 by the author.