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.
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.
print(np.linalg.det(M)) # déterminant
Mm1 = np.linalg.inv(M) # inverse
print(Mm1)
On peut vérifier que minv est bien l'inverse (numérique) de M: $M^{-1}\cdot M=\mathbb{I}$.
print(np.dot(Mm1, M))
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.
B = np.array([2, 2, 3])
X = np.linalg.solve(M, B)
print(X)
print(np.dot(M, X) == B) # on vérifie que la solution est correcte
On peut aussi calculer les valeurs propres d'une matrice, et les vecteurs propres associés. $$ \text{det}(M-\lambda\mathbb{I})=0$$
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])
On vérifie $MX=\lambda X $
for i in range(len(valp)):
print( np.dot(M, vecp[:,i]) - valp[i] * vecp[:,i])
On vérifie $M= UDU^{-1} $ avec $D$ diagonale
U = vecp
D = np.diag(valp)
Um1 = np.linalg.inv(U)
print(M,np.dot(U, np.dot(D, Um1)))