2016-03-30 17 views
2

Ich habe den folgenden Code:Python - SymPy - Kraft SymPy zu halten, um

from sympy import * 
init_printing() 

x,y = symbols('x y') 
u = Function('u')(x,y) 
ux,uy,uxx,uxy,uyy = symbols("u_x u_y u_xx u_xy u_yy") 

mainEvaluation = uxx - 2*sin(x)*uxy - (cos(x) ** 2) * uyy - 2*ux + (2 - cos(x) + 2*sin(x))*uy 

Und wenn der Ausgang des print(mainExpression) ist

-2*u_x + u_xx - 2*u_xy*sin(x) + u_y*(2*sin(x) - cos(x) + 2) - u_yy*cos(x)**2 

Das Problem ist: Ich möchte die ursprüngliche Reihenfolge der Variablen .

u_xx - 2*u_xy*sin(x) - u_yy*cos(x)**2 - 2*u_x + u_y*(2*sin(x) - cos(x) + 2) 

All das ist in IPython-Notebook getan. Gibt es eine Möglichkeit, Ordnung zu halten?

+0

Siehe https://stackoverflow.com/questions/14624511/prevent-sympy-from-rearrange-the-equation – asmeurer

Antwort

4

Leider verfolgt SymPy nicht die Reihenfolge der Eingabe (siehe die andere Frage, die ich in einem Kommentar zu der Frage verknüpfte). Sie können eine eigene Bestellfunktion definieren, die Ausdrücke wie gewünscht anordnet, aber es gibt keine Möglichkeit, die Dinge exakt so zu ordnen, wie sie eingegeben wurden, da diese Informationen nicht gespeichert werden.

+0

gibt es eine Möglichkeit, dies zu erzwingen? –

1

versuchen, diese http://docs.sympy.org/0.7.2/modules/utilities/misc.html lesen, werden Sie möglicherweise

Hinweis helfen könnte:

Die zurückgegebenen Schlüssel für das Erhalten von Elementen in eine kanonische Ordnung nützlich ist, die dieselben auf allen Plattformen sein wird. Es ist nicht direkt nützlich für Listen von Ausdrücken Sortierung:

>>> a, b = x, 1/x 

Da hat nur 1 Begriff, dessen Wert von sort_key ist unbeeinflusst von Bestellung:

>>> a.sort_key() == a.sort_key('rev-lex') 
True 

Wenn a und b kombiniert werden, dann ist der Schlüssel unterscheiden, weil es Begriffe, die bestellt werden können:

>>> eq = a + b 
>>> eq.sort_key() == eq.sort_key('rev-lex') 
False 
>>> eq.as_ordered_terms() 
[x, 1/x] 
>>> eq.as_ordered_terms('rev-lex') 
[1/x, x] 

Aber da die Schlüssel für jede dieser Bedingungen des Auftragswertes unabhängig sind, sie nicht anders sortiert, wenn sie separat erscheinen ely in einer Liste:

>>> sorted(eq.args, key=default_sort_key) 
[1/x, x] 
>>> sorted(eq.args, key=lambda i: default_sort_key(i, order='rev-lex')) 
[1/x, x] 

Die Reihenfolge der Begriffe erhalten, wenn diese Schlüssel verwenden, ist die Reihenfolge, die erhalten werden würden, wenn diese Begriffe Faktoren in einem Produkt sind.

.

+0

Vielen Dank für Ihre Antwort! Ich werde das untersuchen. Obwohl ich mich fragte, ob es eine Flagge oder etwas für diesen Zweck gibt. Hoffnung gibt es. – UpmostScarab