Einstellen von Annahmen auf Variablen in Sympy relativ zu anderen Variablen

Ich weiß, dass Sympy in Python kann Annahmen auf Variablen, wie x ist positiv, negativ, real, komplex, etc. Ich frage mich, ob sympy kann Annahmen auf Variablen relativ zu anderen Variablen setzen. Zum Beispiel, wenn ich die Variablen x und y habe, kann ich Sympy setzen, um anzunehmen, dass x> y in seinen Lösungen ist. Oder alternativ, wenn ich zwei Variablen, a und B habe, kann ich Sympy setzen, um anzunehmen, dass a + 2B <1? Diese Art von Annahmen würde möglicherweise helfen, sympy vereinfachen komplizierte Lösungen zu lösen () und Eigenvektoren.

Ich habe alles gesehen und habe keine Informationen gefunden, die darauf abzielen, diese Art von Annahmen in Sympy zu setzen.

Ich frage, weil ich versuche, die Eigenvektoren einer bestimmten Matrix zu finden

a,b = symbols('a,b', nonnegative=False) M = Matrix([ [1-a-2*b, a, b, b], [a, 1-a-2*b, b, b], [b, b, 1-a-2*b, a], [b, b, a, 1-a-2*b] ]) 

Sympy findet die Eigenwerte richtig

 M.eigenvals() 

Die ich über MATLAB und WolframAlpha bestätigt habe, die alle die gleichen Ergebnisse liefern. Allerdings sind die Eigenvektoren ein Durcheinander

 M.eigenvects() 

MATLAB und WolframAlpha geben beide Eigenvektoren von [1,1,1,1] [-1, -1,1,1] [0,0, -1,1] [-1,1,0,0] zurück, die sind Die richtigen Eigenvektoren. Ich habe nicht einmal versucht, Sympy's Ergebnisse zu vereinfachen, weil sie unglaublich lang und komplex sind. Ich vermute, es hat mit Annahmen auf die Variablen zu tun, wie die Angabe, dass a + 2b <1, aber ich bin mir nicht sicher.

2 Solutions collect form web for “Einstellen von Annahmen auf Variablen in Sympy relativ zu anderen Variablen”

Ich habe mich gefragt, ob ich das als Kommentar posten soll, aber es ist zu lang:

Kurze Antwort: nicht in einer nutzbaren Weise.

Das Annahmesystem von SymPy ist ein bisschen ein Chaos (Version 0.7.2, spätestens ab Mai 2013). Es gibt eine Möglichkeit, dass es in diesem Sommer aufgrund eines prospektiven GSoC-Projekts besser wird, aber das ist noch nicht sicher.

Es gibt tatsächlich zwei Annahmesysteme innerhalb von SymPy. Der alte, der die Annahmen den Symbolen selbst hinzufügt (also Probleme beim Wiederaufbau von Ausdrucksbäumen verursacht) und im Konstruktor aufgerufen wird (zB Symbol(..., positive=True) ), und da ist der neue, der Basiert auf globalen Variablen für die globalen Annahmen und Kontextmanager ( with assume(...): für lokale.

Viele der Funktionen innerhalb von SymPy überprüfen die alten Annahmen (zB wird Abs überprüfen, ob das Keyword-Argument positive gesetzt wurde), aber es kann immer noch vermisst werden. Das neue Annahmesystem kann mächtiger sein, ist aber im Moment fast unbenutzt (außer in sehr neuen Submodulen).

Im alten Annahmesystem ist das, was du willst, nicht möglich. In der neuen ist es möglich, aber wahrscheinlich noch nicht implementiert und nicht in irgendwelchen Teilen von SymPy verwendet.

So haben Sie zwei Möglichkeiten: Helfen Sie uns mit den Annahmesystemen oder helfen Sie uns mit dem Matrixmodul. Beide können noch mehr Liebe benutzen.

Die Annahmen kommen hier nicht ins Spiel. Das ist in der Regel nur wichtig, wenn man quadratische Wurzeln hat, weil sqrt(x**2) = x nur wenn x >= 0 .

Alles, was Sie dafür tun müssen, vereinfacht das Ergebnis. Matrix.eigenvects hat eine simplify Flagge, aber es scheinbar nicht vereinfacht die Ergebnisse. Ich werde dafür ein Problem eröffnen. Mittlerweile kannst du das manuell machen. Beachten Sie, dass Matrix.simplify fungiert in-place (wenn Sie das nicht mögen, können Sie Matrix.applyfunc(simplify)

 >>> A = M.eigenvects() >>> A[0][2][0].simplify() >>> A[1][2][0].simplify() >>> pprint(A) ⎡⎛1, 1, ⎡⎡1⎤⎤⎞, ⎛-4⋅b + 1, 1, ⎡⎡-1⎤⎤⎞, ⎛-2⋅a - 2⋅b + 1, 2, ⎡⎡-1⎤, ⎡0 ⎤⎤⎞⎤ ⎢⎜ ⎢⎢ ⎥⎥⎟ ⎜ ⎢⎢ ⎥⎥⎟ ⎜ ⎢⎢ ⎥ ⎢ ⎥⎥⎟⎥ ⎢⎜ ⎢⎢1⎥⎥⎟ ⎜ ⎢⎢-1⎥⎥⎟ ⎜ ⎢⎢1 ⎥ ⎢0 ⎥⎥⎟⎥ ⎢⎜ ⎢⎢ ⎥⎥⎟ ⎜ ⎢⎢ ⎥⎥⎟ ⎜ ⎢⎢ ⎥ ⎢ ⎥⎥⎟⎥ ⎢⎜ ⎢⎢1⎥⎥⎟ ⎜ ⎢⎢1 ⎥⎥⎟ ⎜ ⎢⎢0 ⎥ ⎢-1⎥⎥⎟⎥ ⎢⎜ ⎢⎢ ⎥⎥⎟ ⎜ ⎢⎢ ⎥⎥⎟ ⎜ ⎢⎢ ⎥ ⎢ ⎥⎥⎟⎥ ⎣⎝ ⎣⎣1⎦⎦⎠ ⎝ ⎣⎣1 ⎦⎦⎠ ⎝ ⎣⎣0 ⎦ ⎣1 ⎦⎦⎠⎦ 
  • Kein Modul namens sympy
  • Wie kann man ein Paar nichtlinearer Gleichungen mit Python lösen?
  • Verwenden Sie Sympy mit Pypy
  • SymPy - Beliebige Anzahl von Symbolen
  • Fehler: Funktion () nimmt mindestens n Argumente (n gegeben)
  • Wie finde ich alle Begriffe in einem Ausdruck in Sympy
  • SymPy: Sich parsing Strings
  • Verhindern, dass Sympy die Gleichung neu ordnet
  • Vermeiden Sie das Sortieren von Args im Python-Modul Sympy
  • SymPy: Wie kann ich einen Ausdruck in Bezug auf andere Ausdruck (e) zurückgeben?
  • Lösen von Gleichungssysteme mit SymPy
  • Python ist die beste Programmiersprache der Welt.