python - ¿Por qué numpy.linalg.solve() ofrece inversiones matriciales más precisas que numpy.linalg.inv()?
arrays matrix (1)
No entiendo bien por qué numpy.linalg.solve()
da la respuesta más precisa, mientras que numpy.linalg.inv()
se descompone un poco, dando (lo que creo que son) estimaciones.
Para un ejemplo concreto, estoy resolviendo la ecuación C^{-1} * d
donde C
denota una matriz, y d
es una matriz vectorial. En aras de la discusión, las dimensiones de C
son forma (1000,1000)
y d
es forma (1,1000)
.
numpy.linalg.solve(A, b)
resuelve la ecuación A*x=b
para x, es decir, x = A^{-1} * b.
Por lo tanto, yo podría resolver esta ecuación por
(1)
inverse = numpy.linalg.inv(C)
result = inverse * d
o (2)
numpy.linalg.solve(C, d)
El método (2) da resultados mucho más precisos. ¿Por qué es esto?
¿Qué está sucediendo exactamente de modo que uno "funcione mejor" que el otro?
np.linalg.solve(A, b)
no calcula el inverso de A. En su lugar, llama a una de las rutinas gesv
LAPACK , que primero factoriza A utilizando la descomposición de LU, luego resuelve para x usando la sustitución hacia adelante y hacia atrás (consulte here ).
np.linalg.inv
usa el mismo método para calcular el inverso de A resolviendo para A -1 en A · A -1 = I donde I es la identidad *. El paso de factorización es exactamente el mismo que el anterior, pero se necesitan más operaciones de punto flotante para resolver para A -1 (una matriz n × n ) que para x (un vector n- largo). Además, si luego desea obtener x a través de la identidad A -1 · b = x , la multiplicación de la matriz adicional incurrirá en más operaciones de punto flotante y, por lo tanto, un rendimiento más lento y más errores numéricos.
No hay necesidad del paso intermedio de computar A -1 ; es más rápido y más preciso obtener x directamente.
* El bit relevante de fuente para inv
está here . Desafortunadamente, es un poco difícil de entender ya que tiene una plantilla de C. Lo importante a tener en cuenta es que se está pasando una matriz de identidad al solucionador de LAPACK como parámetro B