Ich versuche einige symbolische Matrixberechnungen mit sympy zu machen. Mein Ziel ist es, eine symbolische Darstellung des Ergebnisses einiger Matrixberechnungen zu erhalten. Ich bin auf einige Probleme gestoßen, die ich auf dieses einfache Beispiel reduziert habe, in dem ich versuche, das Ergebnis einer Potenzierung einer bestimmten Matrix und deren Multiplikation mit einem beliebigen Vektor zu bewerten.
%Vor%Wenn ich dagegen die Identitätsmatrix direkt anlege und sie dann mit v multipliziere, gibt es kein Problem:
%Vor%Eine Sache, die ich bemerkt habe, ist, dass die zwei Identitätsmatrizen verschiedene Klassen haben:
%Vor% Ich habe auch festgestellt, dass das Aufrufen der as_mutable()
-Methode einen Workaround darstellt.
Ist es immer notwendig, as_mutable()
-Aufrufe während der Berechnungen der linearen Algebra zu setzen? Ich vermute nicht, und stattdessen deuten diese Fehler darauf hin, dass ich die falsche Strategie verwende, um mein Problem zu lösen, aber ich kann nicht herausfinden, was die richtige Strategie wäre. Hat jemand irgendwelche Zeiger?
Ich habe die Dokumentationsseite zu unveränderlichen Matrizen gelesen, aber ich könnte trotzdem etwas Hilfe beim Verständnis gebrauchen wie wichtig ihre Unterschiede zu standardmä- ßigen Matrizen sind und warum einige Operationen (zB sympy.exp) zwischen diesen verschiedenen Klassen konvertieren.
Ich würde behaupten, dass dies ein Fehler in Sympy ist:
In Python können Sie den Multiplikationsoperator von beiden Seiten überladen . A*B
kann intern behandelt werden, indem entweder A.__mul__(B)
oder B.__rmul__(A)
aufgerufen wird. Python ruft zuerst A.__mul__
auf, und wenn diese Methode nicht existiert oder NotImplemented
zurückgibt, versucht Python B.__rmul__
automatisch. SymPy verwendet stattdessen einen Decorator namens call_highest_priority , um zu entscheiden, welche der beiden Implementierungen verwendet werden soll. Es sucht die _op_priority
der beteiligten Klassen und ruft die Funktion der Implementierung mit höherer Priorität auf. Die Prioritäten in Ihrem Fall sind 11 für v
und I
und 10.01 für I_
, daher wird I
bevorzugt. Außerdem fehlt der Basisimplementierung von __mul__
, die I
verwendet, der Decorator.
Lange Rede, kurzer Sinn: I*v
endet immer mit I.__mul__
, und __mul__
kann nicht mit MatrixSymbol
s umgehen, gibt aber auch NotImplemented
nicht zurück. v.__rmul__(I)
funktioniert wie erwartet.
Die richtige Lösung wäre, die AttributeError
in matrices.py
zu erfassen und NotImplemented
zurückzugeben, d. h.
Python würde dann automatisch auf __rmul__
zurückfallen. Der Hack'ish Fix wäre, _op_priority
anzupassen. In jedem Fall sollten Sie einen Fehlerbericht einreichen: Wenn der Fehler von Entwurf war (das heißt, wenn Sie versehentlich etwas versucht haben, das nicht funktionieren sollte), dann würde die Fehlermeldung das sagen.
Tags und Links python sympy matrix symbolic-math