numpy
Algèbre linéaire avec np.linalg
Recherche…
Remarques
Depuis la version 1.8, plusieurs routines de np.linalg
peuvent fonctionner sur une «pile» de matrices. Autrement dit, la routine peut calculer les résultats pour plusieurs matrices si elles sont empilées ensemble. Par exemple, A
est interprété comme deux matrices empilées 3 par 3:
np.random.seed(123)
A = np.random.rand(2,3,3)
b = np.random.rand(2,3)
x = np.linalg.solve(A, b)
print np.dot(A[0,:,:], x[0,:])
# array([ 0.53155137, 0.53182759, 0.63440096])
print b[0,:]
# array([ 0.53155137, 0.53182759, 0.63440096])
Les documents officiels np
spécifient via des spécifications de paramètres telles a : (..., M, M) array_like
.
Résoudre des systèmes linéaires avec np.solve
Considérons les trois équations suivantes:
x0 + 2 * x1 + x2 = 4
x1 + x2 = 3
x0 + x2 = 5
Nous pouvons exprimer ce système comme une équation matricielle A * x = b
avec:
A = np.array([[1, 2, 1],
[0, 1, 1],
[1, 0, 1]])
b = np.array([4, 3, 5])
Ensuite, utilisez np.linalg.solve
pour résoudre x
:
x = np.linalg.solve(A, b)
# Out: x = array([ 1.5, -0.5, 3.5])
A
doit être un carré et une matrice complète: toutes ses lignes doivent être linéairement indépendantes. A
doit être inversible / non singulier (son déterminant n'est pas zéro). Par exemple, si une ligne de A
est un multiple d'un autre, l'appel de linalg.solve
soulèvera LinAlgError: Singular matrix
:
A = np.array([[1, 2, 1],
[2, 4, 2], # Note that this row 2 * the first row
[1, 0, 1]])
b = np.array([4,8,5])
De tels systèmes peuvent être résolus avec np.linalg.lstsq
.
Trouver la solution des moindres carrés à un système linéaire avec np.linalg.lstsq
Les moindres carrés constituent une approche standard des problèmes comportant plus d'équations que d'inconnues, également connus sous le nom de systèmes surdéterminés.
Considérons les quatre équations:
x0 + 2 * x1 + x2 = 4
x0 + x1 + 2 * x2 = 3
2 * x0 + x1 + x2 = 5
x0 + x1 + x2 = 4
Nous pouvons exprimer cela comme une multiplication matricielle A * x = b
:
A = np.array([[1, 2, 1],
[1,1,2],
[2,1,1],
[1,1,1]])
b = np.array([4,3,5,4])
Ensuite, résolvez avec np.linalg.lstsq
:
x, residuals, rank, s = np.linalg.lstsq(A,b)
x
est la solution, les residuals
la somme, rank
le rank
la matrice de l'entrée A
et s
les valeurs singulières de A
Si b
a plus d'une dimension, lstsq
résoudra le système correspondant à chaque colonne de b
:
A = np.array([[1, 2, 1],
[1,1,2],
[2,1,1],
[1,1,1]])
b = np.array([[4,3,5,4],[1,2,3,4]]).T # transpose to align dimensions
x, residuals, rank, s = np.linalg.lstsq(A,b)
print x # columns of x are solutions corresponding to columns of b
#[[ 2.05263158 1.63157895]
# [ 1.05263158 -0.36842105]
# [ 0.05263158 0.63157895]]
print residuals # also one for each column in b
#[ 0.84210526 5.26315789]
rank
et s
ne dépendent que de A
et sont donc les mêmes que ci-dessus.