2017-12-21 6 views
2

ich den folgenden Code in python3 (mit der Absicht, dann nullclines ein 2-D dynamischen System ziehen zu berechnen) schrieb:erzwingen Sympy Ausdruck ein Symbol enthält

import sympy as sm 
x1, x2 = sm.symbols('x1 x2') 
x = [x1, x2] 
sys = sm.Matrix([(x1 - sm.log(x2))*(x2-x1*x1), 
    x2**2 - 4]) 
solutions = list(map(lambda dx: sm.solve(sm.Eq(dx, 0)), sys)) 
print(solutions) 

Was ich sehe, ist

[[{x1: -sqrt(x2)}, {x1: sqrt(x2)}, {x1: log(x2)}], [-2, 2]] 

Dies [-2,2] gibt mir ein großes Problem, da ich die Lösungen als nächstes zeichnen möchte. Da ich mit sys arbeiten möchte, ob jedes Element beide Variablen enthält oder nicht. Ich möchte über die Wörterbücher iterieren und sm.Eq(list(solutions[i][j].keys())[0], list(solutions[i][j].values())[0]) plotten, aber ich kann ein Wörterbuch wie dieses

nicht garantieren, sah ich, dass, wenn ich + x1 - sm.log(sm.exp(x1)) zu sys[1] hinzufügen es gibt mir die konsequente Wörterbuchform, aber gibt es eine Möglichkeit für ich zu erzwingen sys 'Element, um beide auf eine elegante Art und Weise zu enthalten? Ich möchte nicht in jedem Element nach beiden Koordinaten suchen und wenn einer nicht vorhanden ist, um den redundanten Ausdruck hinzuzufügen

+0

'Liste (Karte (Lambda dx: sm.solve (sm.Eq (dx, 0)), sys))' entspricht zu '[sm.solve (sm.Eq (dx, 0)) für dx in sys]'. Sie lösen kein Gleichungssystem, Sie lösen zwei Gleichungen. Entschuldigung, wenn dies für Sie offensichtlich ist, stelle ich mir vor, ein Gleichungssystem zu lösen, wenn ich Nulllinien zeichne, aber ich kann Ihr Ziel falsch verstehen. – winerd

+0

Es sieht eleganter aus, aber es hilft mir immer noch nicht bei dem Problem, wo für einige Systeme eine Gleichung unabhängig von einer Koordinate ist und 'solve()' 's Ausgabe nicht in einer Wörterbuchform ist –

+1

sys ist ein häufig benutztes Modul. am besten nicht als Variable verwenden – ShpielMeister

Antwort

3

Das Argument dict=True tut das. Mit sm.solve(sm.Eq(dx, 0), dict=True) die Ausgabe des Codes

[[{x1: -sqrt(x2)}, {x1: sqrt(x2)}, {x1: log(x2)}], [{x2: -2}, {x2: 2}]] 

Das heißt, ich bin nicht sicher, dass Sie etwas gewinnen im Vergleich zu einfach mit plot_implicit direkt auf den Gleichungen in sys. Berücksichtigen Sie, dass die verschiedenen Lösungen, die Sie erhalten, verschiedene Definitionsbereiche haben werden, wenn sich die Kurven drehen oder seitwärts gehen (Parabeln usw.). Es wird ein Kopfzerbrechen sein, all diese Stücke zu entwerfen.

Hier ist, wie es funktioniert mit plot_implicit

import sympy as sm 
x1, x2 = sm.symbols('x1 x2') 
eqs = [(x1 - sm.log(x2))*(x2-x1*x1), x2**2 - 4] 
window = [(x1, -3, 3), (x2, -3, 3)] 
plots = [plot_implicit(eq, *window, show=False) for eq in eqs] 
combined_plots = plots[0] 
for k in range(1, len(plots)): 
    combined_plots.extend(plots[k]) 
combined_plots.show() 

nullclines

+0

Oh wow! Genau das habe ich gebraucht. Ich kannte hier nicht einen Haufen sympathischer Züge –

Verwandte Themen