Seite 1 von 1
Sympy Matrizenrechnung
Verfasst: Montag 13. März 2017, 22:19
von yoyoba
Guten Abend zusammen,
ich bin derzeit dabei mich in Sympy einzuarbeiten. Hierbei habe ich mir vorgenommen eine Matrizenmultiplikation durchzuführen.
Hierfür habe ich drei Matrizen, die Multiplikation von v1 und v2 soll die Matrize v3 ergeben. In Matrize v2 befindet sich allerdings die unbekannte x und in v3 die unbekannte y. Mit Hilfe von Sympy möchte ich nun die beiden Unbekannten ermitteln, kriege es allerdings nicht wirklich hin
Folgenden Code habe ich geschrieben
Code: Alles auswählen
from sympy import Matrix, symbols
from sympy.solvers import solve
x,y = symbols('x,y')
v1 = Matrix([[1,2],[2,3]])
v2 = Matrix([[x],[1]])
v3 = Matrix([[3],[y]])
solve(v1.dot(v2), v3)
Allerdings erhalte ich nicht das richtige Ergebnis...
Für x müsste ich 1 und für y 5 herausbekommen.
Der oben gezeigte Code ist nur einer von vielen probierten... Ich denke ich muss nur etwas in der letzte Zeile ändern, weiß allerdings nicht was...
Hat evtl jemand eine Idee wie ich das hinkriege?
Vielen Dank
Grüße und Schönen Abend
Yoyoba
Re: Sympy Matrizenrechnung
Verfasst: Dienstag 14. März 2017, 07:08
von MagBen
Wenn Du
lösen willst, dann geht das so:
Code: Alles auswählen
from sympy import Matrix, symbols
from sympy.solvers import solve
x,y = symbols('x,y')
v1 = Matrix([[1,2],[2,3]])
v2 = Matrix([x,1])
v3 = Matrix([3,y])
print solve(Matrix(v1.dot(v2))-v3, x,y)
# {x: 1, y: 5}
Der 1. Parameter von solve ist die zu lösende Gleichung, danach kommen die Symbole, nach denen gelöst werden soll.
Bei der Gleichung muss man sich das "==0" dazu denken.
Re: Sympy Matrizenrechnung
Verfasst: Dienstag 14. März 2017, 09:18
von BlackJack
Alternativ zum abziehen könnte man mit `Eq()` ein Objekt für die Gleichung erstellen. Läuft letztendlich aber auf das Gleiche hinaus.
Code: Alles auswählen
In [10]: solve(Eq(Matrix(v1.dot(v2)), v3), [x, y])
Out[10]: {x: 1, y: 5}
Re: Sympy Matrizenrechnung
Verfasst: Dienstag 14. März 2017, 09:24
von MagBen
Dass
keine Matrix, sondern eine Liste zurück gibt und man deshalb extra noch den Aufruf von Matrix braucht, finde ich unschön.
Re: Sympy Matrizenrechnung
Verfasst: Dienstag 14. März 2017, 12:49
von yoyoba
Danke für die Lösungen, funktioniert super.
@MagBen, gibt es eine Alternative die nicht so "unschön" ist?
Danke.
Yoyoba
Re: Sympy Matrizenrechnung
Verfasst: Samstag 22. August 2026, 15:26
von pysym25
Der Fehler liegt in der Methode v1.dot(v2) sowie in der Syntax des solve-Aufrufs:dot() ist für Vektoren, nicht für Matrizenmultiplikation: Das Skalarprodukt v1.dot(v2) funktioniert nur bei eindimensionalen Vektoren. Für die klassische Matrizenmultiplikation v_1 . v_2 nutzt man in SymPy den *-Operator oder den @-Operator. solve() erwartet eine Gleichung: SymPy muss wissen, was gelöst werden soll. Wenn
v_1 . v_2 = v_3 gelten soll, lautet die Gleichung v_1 . v_2 - v_3 = 0. So sieht der korrekte Code aus:
Code: Alles auswählen
from sympy import Matrix, symbols
from sympy.solvers import solve
x, y = symbols('x,y')
v1 = Matrix([[1, 2], [2, 3]])
v2 = Matrix([[x], [1]])
v3 = Matrix([[3], [y]])
# Matrizenmultiplikation mit * durchfuerhen
ergebnis = solve(v1 * v2 - v3, (x, y))
print(ergebnis)
Re: Sympy Matrizenrechnung
Verfasst: Dienstag 25. August 2026, 13:05
von __blackjack__
Wobei man vielleicht erwähnen sollte das „der Fehler“ 2017 kein Fehler war, denn damals war die dot()-Methode nicht nur für eindimensionale Vektoren, sondern hat auch mit den Matrizen funktioniert.
Re: Sympy Matrizenrechnung
Verfasst: Dienstag 25. August 2026, 14:42
von pysym25
... und warum heute nicht mehr?
Re: Sympy Matrizenrechnung
Verfasst: Dienstag 25. August 2026, 21:22
von __blackjack__
@pysym25: Weil sich Software und Bibliotheken weiterentwickeln‽ Damals konnte man ``print`` auch noch ohne Klammern schreiben, weil das in Python mal eine Anweisung und keine Funktion war, und ``@`` als Operator gab es da auch noch nicht.
Re: Sympy Matrizenrechnung
Verfasst: Mittwoch 26. August 2026, 08:32
von pysym25
Deine Antwort über den allgemeinen Wandel von Software ist historisch korrekt, übersieht dabei aber genau den mathematischen Beweggrund hinter dieser API-Änderung in SymPy.
Es ging bei dieser Änderung nicht nur um allgemeine Software-Updates, sondern um eine bewusste Korrektur zur Einhaltung der mathematischen Semantik.
In früheren SymPy-Versionen war .dot() als überladener Allrounder implementiert, der bei zwei Matrizen schlicht die Matrizenmultiplikation ausführte. Das führte jedoch zu mathematischen Inkonsistenzen:
Mathematische Definition: Das Skalarprodukt (dot product) $\vec{a} \cdot \vec{b}$ ist für Vektoren definiert und bildet zwei Vektoren auf einen Skalar ab.
Matrizenmultiplikation: Die Verknüpfung zweier Matrizen $A \in \mathbb{R}^{m \times n}$ und $B \in \mathbb{R}^{n \times k}$ liefert wieder eine Matrix $C \in \mathbb{R}^{m \times k}$.
Um Verwechslungen zu vermeiden und die Bibliothek näher an die mathematische Realität zu rücken, wurde die API bereinigt:
v1.dot(v2) ist seitdem strikt für das echte Skalarprodukt reserviert (Ergebnis ist ein Skalar).
Für die klassische Matrizenmultiplikation wurden standardmäßig der *-Operator (in SymPy) sowie der mit Python 3.5 eingeführte @-Operator (PEP 465) etabliert.
Die Umstellung diente also genau dem Zweck, die mathematischen Operationen in Code sauber voneinander zu trennen und begrifflich korrekt abzubilden.
Welche Möglkichkeiten der Arbeit mit Latex gibt es in diesem Forum. Obigen Latexcode übersetze ich z.B. mit Tiny MC6 , nur das Ergebnis lässt sich hier nicht rein kopieren. Bei astronews.com t.B. ist das möglich.
Re: Sympy Matrizenrechnung
Verfasst: Mittwoch 26. August 2026, 11:14
von noisefloor
Welche Möglkichkeiten der Arbeit mit Latex gibt es in diesem Forum.
Gar keine. Die Forensoftware ist, wie dem Footer zu entnehmen ist, phpBB und die verwendet für die Inline-Formatierung BBCodes.
Wenn du jetzt einen akuten Bedarf verspürst, das auszudiskutieren -> starte einen neuen Thread im Subforum "Verbesserungsvorschläge".
Gruß, noisefloor