Warum bietet numpy.linalg.solve () präzisere Matrixinvertierungen als numpy.linalg.inv ()?

Ich verstehe nicht ganz, warum numpy.linalg.solve() gibt die genauere Antwort, während numpy.linalg.inv() bricht etwas, geben (was ich glaube, sind) Schätzungen.

Für ein konkretes Beispiel löst ich die Gleichung C^{-1} * d wobei C eine Matrix bezeichnet und d ein Vektor-Array ist. Aus Gründen der Diskussion sind die Dimensionen von C Form (1000,1000) und d ist Form (1,1000) .

numpy.linalg.solve(A, b) löst die Gleichung A*x=b für x, dh x = A^{-1} * b. Deshalb konnte ich diese Gleichung entweder lösen

(1)

 inverse = numpy.linalg.inv(C) result = inverse * d 

Oder (2)

 numpy.linalg.solve(C, d) 

Methode (2) liefert weitaus präzisere Ergebnisse. Warum ist das?

Was genau passiert so, dass man "besser funktioniert" als der andere?

One Solution collect form web for “Warum bietet numpy.linalg.solve () präzisere Matrixinvertierungen als numpy.linalg.inv ()?”

np.linalg.solve(A, b) berechnet nicht die Umkehrung von A. Stattdessen nennt man eine der gesv LAPACK-Routinen , die zuerst A mit LU-Zerlegung faktorisiert, dann löst sie für x mit Vorwärts- und Rückwärtssubstitution (siehe hier ).

np.linalg.inv verwendet dieselbe Methode, um die Umkehrung von A zu berechnen, indem man für A -1 in A · A -1 = I, wo I die Identität * ist, löst. Der Faktorisierungsschritt ist genau derselbe wie oben, aber es dauert mehr Gleitkommaoperationen, um für A -1 (eine nxn Matrix) als für x (ein n- langer Vektor) zu lösen. Wenn Sie dann x über die Identität A -1 · b = x erhalten wollten, dann würde die zusätzliche Matrixmultiplikation noch mehr Gleitkommaoperationen und damit eine langsamere Leistung und einen numerischeren Fehler verursachen.

Es besteht keine Notwendigkeit für den Zwischenschritt der Berechnung von A -1 – es ist schneller und genauer, um x direkt zu erhalten.


* Das relevante Bit der Quelle für inv ist hier . Leider ist es ein bisschen schwierig zu verstehen, da es vorgeschrieben ist. Das Wichtigste ist, dass eine Identitätsmatrix an den LAPACK-Löser als Parameter B .

  • Numpy Zeit-basierte Vektor Operationen, wo Zustand der vorangehenden Elemente Angelegenheiten - sind für Schleifen geeignet?
  • Wie lese ich mp4 Video, um von scikit-image verarbeitet zu werden?
  • Warum Numpy.all () und irgendwelche () geben falsche Ergebnisse, wenn Sie Generatorausdrücke verwenden?
  • Bestimmen der Form des Ergebnis-Arrays nach dem Slicing in Numpy
  • Pythonreihe major to Spalte Großauftrag Vektor
  • Normalisieren / Standardisieren Sie eine numpy Recarray
  • Python - finden Muster in einer Handlung
  • Importieren von NumPy in Parallel Python
  • Python pandas flach ein dataframe zu einer liste
  • Berechnen Sie das Mittel über diskrete Funktionen mit unterschiedlicher Stichprobenpunkte
  • Laden und Speichern von Numpy Matrix
  • Python ist die beste Programmiersprache der Welt.