Sympy vs Mathematica

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
NPC
User
Beiträge: 56
Registriert: Dienstag 8. Januar 2019, 17:51

Hi,

ich hätte eine kurze Frage zur Matrixinvertierung in Sympy.

Ich habe eine 3x3 matrix, wobei in jeder componente ein relative langer symbolischer Ausdruck steht.
Leider braucht sympy sehr lange um diese Matrix zu invertieren. Mathematica schafft selbiges jedoch in weniger als einer Sekunde.
Ich glaube es liegt daran, dass ich in sympy mit .inv() automatisch noch ein simplify habe (oder ähnlich). Ich habe mir auch schon die Methoden von .inv angesehen und diese ausprobiert, wurde daraus jedoch nicht schlau...

Weiß jemand wie man das in sympy machen kann oder ist sympy da Mathematica einfach soweit unterlegen?

Viele Grüße und Danke für die Antworten
NPC
einfachTobi
User
Beiträge: 496
Registriert: Mittwoch 13. November 2019, 08:38

Dein Code und Beispieldaten wären hilfreich, um zu sehen, was genau du da machst.
NPC
User
Beiträge: 56
Registriert: Dienstag 8. Januar 2019, 17:51

Hey einfachTobi,

ich weiß, dass diese Antwort es leider nicht einfacher macht mir zu helfen. Ich kann den dazugehörigen Code leider nicht ganz zeigen, da es weder mein Code ist noch das zugehörige Paper veröffentlicht. Außerdem ist die Berechnung der Komponenten um die huntert Zeilen lang und sollte eigentlich keine Rolle spielen. Ich kann allerdings ein maximal triviales Beispiel geben.

Sein x1, ..., x9 komplexe sympy Ausdrücke mit mehreren Symbolen.

Code: Alles auswählen

m = sympy.Matrix([[x1, x2, x3], [x4, x5, x6], [x7, x8, x9]])  # einfache 3x3 Matrix
m_inv = m.inv() # invertierung der Matrix
Ein paar Anmerkungen und Gedanken die ich mir schon dazu gemacht habe:
Die Invertierung einer 3x3 Matrix ist ja eigentlich bekannt (gibt auf Wikipedia dazu sogar eine Formel).
Weiterhin braucht mathematica für selbige Matrix-Invertierung nicht sehr lange => Nicht die Invertierung ist das Problem.
Aus meiner Sicht sollte das Problem also entweder die Methode selbst sein (dann ist einfach die falsche Methode gewählt. Welche wäre dann besser oder näher an der von Mathematica?)
Oder sympy Versucht Rechenschritte die Mathematica hier nicht tut (Mathematica nutzt danach und währendessen kein Simplify [laut deren Doku]). Wenn dem so ist, ist die Frage ob man die Simplifizierung unterdrücken könnte?
Zuletzt vielleicht noch die Frage nach der iszerofunc.
Die sympy Methoden sind (GE’, ‘LU’, ‘ADJ’, ‘CH’, ‘LDL’) https://docs.sympy.org/latest/modules/m ... rices.html .
Die mathematica Methoden sind ("CofactorExpansion", "DivisionFreeRowReduction", and "OneStepRowReduction") https://reference.wolfram.com/language/ref/Inverse.html.

Falls ich hier ein paar Denkfehler habe, gib mir gerne bescheid.
Benutzeravatar
__blackjack__
User
Beiträge: 13533
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Aus der Doku:

Code: Alles auswählen

According to the ``method`` keyword, it calls the appropriate method:

    GE .... inverse_GE(); default for dense matrices
    LU .... inverse_LU()
    ADJ ... inverse_ADJ()
    CH ... inverse_CH()
    LDL ... inverse_LDL(); default for sparse matrices
    QR ... inverse_QR()

Note, the GE and LU methods may require the matrix to be simplified
before it is inverted in order to properly detect zeros during
pivoting. In difficult cases a custom zero detection function can
be provided by setting the ``iszerofunc`` argument to a function that
should return True if its argument is zero. The ADJ routine computes
the determinant and uses that to detect singular matrices in addition
to testing for zeros on the diagonal.
Da steht es wird "GE" als Default für Deine Matrix verwendet und das dort eventuell vereinfacht werden muss. Probier doch einfach mal die anderen Methoden aus, ob da welche von schneller sind. Sie sollten am Ende alle das gleiche Ergebnis liefern.

Code: Alles auswählen

- (void)countSheep {
    unsigned int sheep = 0;
    while ( ! [self isAsleep]) { ++sheep; }
}
NPC
User
Beiträge: 56
Registriert: Dienstag 8. Januar 2019, 17:51

Hi __blackjack__,

Danke für die Antwort.
Das hatte ich bereits ausprobiert.
Leider hatte auch das nicht den Erfolg gebracht.

Die iszerofunction in den Argumenten: Wird die nur einmal für die determinante oder für jede Komponente benutzt. Finde die Erklärung etwas verwirrend?
Nutzt hier sympy dann ein automatisches Simplify?
Antworten