una matriz inversa como calcular python algorithm matrix linear-algebra matrix-inverse

como calcular la inversa de una matriz en python



Python inverso de una matriz (6)

¿Cómo obtengo el inverso de una matriz en python? Lo he implementado yo mismo, pero es puro python, y sospecho que hay módulos más rápidos para hacerlo.


Asegúrate de que realmente necesites invertir la matriz. Esto a menudo es innecesario y puede ser numéricamente inestable. Cuando la mayoría de la gente pregunta cómo invertir una matriz, realmente quieren saber cómo resolver Ax = b, donde A es una matriz yx y b son vectores. Es más eficiente y más preciso usar código que resuelve la ecuación Ax = b para x directamente que para calcular A inverso y luego multiplicar lo inverso por B. Incluso si necesita resolver Ax = b para muchos valores b, no es una buena idea para invertir A. Si tiene que resolver el sistema para múltiples valores b, guarde la factorización de Cholesky de A, pero no la invierta.

Ver No invertir esa matriz .


Deberías echarle un vistazo a numpy si haces la manipulación de la matriz. Este es un módulo escrito principalmente en C, que será mucho más rápido que la programación en python puro. Aquí hay un ejemplo de cómo invertir una matriz y hacer otra manipulación de la matriz.

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.

También puede echarle un vistazo al módulo de array , que es una implementación de listas mucho más eficiente cuando tiene que tratar con un solo tipo de datos.


Es una pena que la matriz elegida, repetida aquí de nuevo, esté singular o mal condicionada:

A = matrix( [[1,2,3],[11,12,13],[21,22,23]])

Por definición, el inverso de A cuando se multiplica por la matriz A en sí misma debe dar una matriz de unidad. La A elegida en la explicación tan alabada no hace eso. De hecho, el simple hecho de observar lo inverso da una pista de que la inversión no funcionó correctamente. Mire la magnitud de los términos individuales: son muy, muy grandes en comparación con los términos de la matriz A original ...

¡Es notable que los humanos al elegir un ejemplo de matriz a menudo se las arreglan para elegir una matriz singular!

Tuve un problema con la solución, así que investigué más. En la plataforma ubuntu-kubuntu, el paquete de Debian numpy no tiene la matriz y los subpaquetes linalg, por lo que además de la importación de numpy, scipy necesita ser importado también.

Si los términos diagonales de A se multiplican por un factor lo suficientemente grande, digamos 2, la matriz probablemente dejará de ser singular o casi singular. Asi que

A = matrix( [[2,2,3],[11,24,13],[21,22,46]])

se convierte en ni singular ni casi singular y el ejemplo da resultados significativos ... Cuando se trata de números flotantes uno debe estar atento a los efectos de los errores de redondeo inevitables.

Gracias por tu contribución

OldAl.


Numpy será adecuado para la mayoría de las personas, pero también puede hacer matrices en Sympy

Intente ejecutar estos comandos en http://live.sympy.org/

M = Matrix([[1, 3], [-2, 3]]) M M**-1

Para divertirte, prueba M**(1/2)


Puede calcular el determinante de la matriz que es recursivo y luego formar la matriz adyacente

Aquí hay un breve tutorial

Creo que esto solo funciona para matrices cuadradas

Otra forma de calcular esto implica la ortogonalización de gram-schmidt y luego la transposición de la matriz, ¡la transposición de una matriz ortogonalizada es su inversa!


Si odias a numpy, saca RPy y tu copia local de R, y úsala en su lugar.

(También me gustaría repetirle que realmente necesita invertir la matriz. En R, por ejemplo, linalg.solve y la función solve () no hacen una inversión completa, ya que no es necesario).