Algèbre linéaire avec numpy

On commence par importer l'espace de nom de la bibliothèque numpy sous le nom réduit np, et par définir une matrice M inversible.

In [20]:
import numpy as np
np.set_printoptions(precision = 4, suppress=True)

M = np.array( [[1, 2, 3],
               [2, 3, 4],
               [3, 4, 6]] )

Les opérations classiques liées à la résolution de systèmes linéaires sont quant à elles disponibles dans la bibliothèque linalg incluse dans numpy.

In [21]:
print(np.linalg.det(M)) # déterminant
-1.0
In [22]:
Mm1 = np.linalg.inv(M) # inverse
print(Mm1)
[[-2.  0.  1.]
 [ 0.  3. -2.]
 [ 1. -2.  1.]]

On peut vérifier que minv est bien l'inverse (numérique) de M: $M^{-1}\cdot M=\mathbb{I}$.

In [23]:
print(np.dot(Mm1, M))
[[ 1. -0. -0.]
 [ 0.  1.  0.]
 [ 0.  0.  1.]]

Pour résoudre le système linéaire $M\cdot X=B$, on utilise la fonction linalg.solve(). Notez que la matrice doit être carrée et inversible.

In [24]:
B = np.array([2, 2, 3])
X = np.linalg.solve(M, B)
print(X)
[-1.  0.  1.]
In [25]:
print(np.dot(M, X) == B) # on vérifie que la solution est correcte
[ True  True  True]

On peut aussi calculer les valeurs propres d'une matrice, et les vecteurs propres associés. $$ \text{det}(M-\lambda\mathbb{I})=0$$

In [26]:
valp, vecp = np.linalg.eig(M) # valeurs et vecteurs propres
print( "Valeurs propres de M :", valp)
print( "Vecteurs propres associés :")
for i in range(len(valp)):
    print(i,":",valp[i],vecp[:,i])
Valeurs propres de M : [ 10.1867  -0.4203   0.2336]
Vecteurs propres associés :
0 : 10.1866976738 [ 0.3653  0.5283  0.7665]
1 : -0.42027581011 [ 0.9269 -0.1307 -0.3517]
2 : 0.233578136297 [ 0.0856 -0.8389  0.5374]

On vérifie $MX=\lambda X $

In [27]:
for i in range(len(valp)):
    print( np.dot(M, vecp[:,i]) - valp[i] * vecp[:,i])
[-0.  0.  0.]
[ 0.  0.  0.]
[-0. -0. -0.]

On vérifie $M= UDU^{-1} $ avec $D$ diagonale

In [28]:
U = vecp
D = np.diag(valp)
Um1 = np.linalg.inv(U)
print(M,np.dot(U, np.dot(D, Um1)))
[[1 2 3]
 [2 3 4]
 [3 4 6]] [[ 1.  2.  3.]
 [ 2.  3.  4.]
 [ 3.  4.  6.]]