Python Inverse D'une matrice
6 réponses
vous devriez jeter un oeil à numpy si vous faites la manipulation de matrice. Il s'agit d'un module principalement écrit en C, qui sera beaucoup plus rapide que la programmation en python pur. Voici un exemple de la façon d'inverser une matrice, et de faire d'autres manipulations de matrice.
from numpy import matrix
from numpy import linalg
A = matrix( [[1,2,3],[11,12,13],[21,22,23]]) # Creates a matrix.
x = matrix( [[1],[2],[3]] ) # Creates a matrix (like a column vector).
y = matrix( [[1,2,3]] ) # Creates a matrix (like a row vector).
print A.T # Transpose of A.
print A*x # Matrix multiplication of A and x.
print A.I # Inverse of A.
print linalg.solve(A, x) # Solve the linear equation system.
vous pouvez également jeter un oeil au module array , qui est une implémentation beaucoup plus efficace des listes lorsque vous avez à traiter avec un seul type de données.
assurez-vous que vous avez vraiment besoin d'inverser la matrice. Ce est souvent inutile et peut être numériquement instable. Quand la plupart des gens demandent comment inverser une matrice, ils veulent vraiment savoir comment résoudre Ax = b où A est une matrice et x et b sont des vecteurs. Il est plus efficace et plus précis d'utiliser le code qui résout l'équation Ax = b Pour x directement que de calculer un inverse puis de multiplier l'inverse par B. même si vous avez besoin de résoudre Ax = b Pour de nombreuses valeurs de b, ce n'est pas une bonne idée de inversez A. Si vous devez résoudre le système pour plusieurs valeurs de b, sauvegardez la factorisation Cholesky de A, mais ne l'inversez pas.
voir n'inversez pas cette matrice .
il est dommage que la matrice choisie, répétée ici encore, soit singulière ou mal conditionnée:
A = matrix( [[1,2,3],[11,12,13],[21,22,23]])
par définition, l'inverse de A lorsqu'il est multiplié par la matrice a elle-même doit donner une matrice unitaire. Le A choisi dans l'explication très louée ne fait pas cela. En fait, le simple fait de regarder l'inverse donne un indice que l'inversion n'a pas fonctionné correctement. Les termes sont très, très importants par rapport à la terminologie termes de la matrice A originale...
il est remarquable que les humains en choisissant un exemple d'une matrice parviennent si souvent à choisir une matrice singulière!
j'ai eu un problème avec la solution, donc regardé en plus loin. Sur la plate-forme ubuntu-kubuntu, le paquet debian numpy n'a pas la matrice et les sous-paquets linalg, donc en plus de l'importation de numpy, scipy doit aussi être importé.
Si les termes diagonaux de A sont multipliés par un facteur assez grand, disons 2, la matrice cessera très probablement d'être singulier ou presque singulier. So
A = matrix( [[2,2,3],[11,24,13],[21,22,46]])
ne devient ni singulier ni presque singulier et l'exemple donne des résultats significatifs... Lorsqu'il s'agit de nombres flottants, il faut être attentif aux effets des erreurs invendables d'arrondi.
Merci pour votre contribution,
OldAl.
vous pourriez calculer le déterminant de la matrice qui est récursive et puis former la matrice jointe
je pense que cela ne fonctionne que pour les matrices carrées
une autre façon de calculer cela implique gram-schmidt orthogonalisation et ensuite la transposition de la matrice, la transposition d'une matrice orthogonalisée est son inverse!
Numpy sera adapté pour la plupart des gens, mais vous pouvez également faire matrices en Sympy
essayez d'exécuter ces commandes à http://live.sympy.org /
M = Matrix([[1, 3], [-2, 3]])
M
M**-1
pour le plaisir, essayez M**(1/2)
si vous détestez numpy, sortez RPy et votre copie locale de R, et utilisez-la à la place.
(je voudrais également écho à vous faire vous avez vraiment besoin pour inverser la matrice. Dans R, par exemple, linalg.résolve et la fonction resolve() ne font pas réellement une inversion complète, puisque c'est inutile.)