2017-11-20 1 views
1

Ich benutze Dinge wieSympy Funktion Substitution

x = Function('x',real=True)(t) 

die x(t) als Funktionsvariablen in allen meinen Berechnungen gibt. Ich kann jetzt zeitlich differenzieren, lösen (nicht nonlinsolve oder solveset, weil sie diese Funktionen nicht subsumieren können) und so weiter.

Allerdings möchte ich meine Ergebnisse nach MATLAB exportieren. Also ich brauche die (t) weg. Ich kann einen dict mit d = {x(t):x} füllen, aber ich denke, dass es eine elegantere Möglichkeit ist dies für alle Funktionen zu tun, wie y(t),z(t), ...

Mein gewünschtes Ergebnis ist für die Eingabe

expr = x(t)-y(t) 
output = x-y 

wo x und y kann "Funktion" sein, wie es Sympy bekannt ist, aber es soll nicht (t) in der Ausgabe sein. Und ich möchte vermeiden, alle meine Variablen wieder einzuführen, ohne die Abhängigkeit von der Zeit!

+0

Wie exportieren Sie nach Matlab? Ist es ein _string_, wo du das '(t)' entfernen willst? Würde das Schneiden oder Indizieren das nicht tun? –

+0

Ich möchte Substitution in der letzten Zeichenfolge vermeiden. Zu dieser Zeit sind Ausdrücke mit 'expr = x (t) - 1' Zeichen. Ich will das gleiche Ergebnis wie: 'exprs ({x (t): x})'. Nur für alle Funktionen, wie 'y (t), z (t)'. – mike

+2

Es ist mir unklar, was Ihr gewünschtes Ergebnis ist. Bitte klären Sie. –

Antwort

2

Hier ist eine Schleife, die walks through the expression tree und ersetzt jede Funktion, deren Argument t durch ein Symbol mit dem Namen dieser Funktion übereinstimmt. Die Ersetzungen werden in einer anderen Kopie des Ausdrucks vorgenommen, um zu verhindern, dass der Ausdruck, durch den wir gehen, geändert wird.

Beispiel: Wenn Ausdruck x(t) - y(t) ist, dann ist Ausdruck1 x - y.

expr1 = expr 
for f in preorder_traversal(expr): 
    if f.args == (t,): 
    expr1 = expr1.subs(f, Symbol(str(f.func))) 
print(expr1) 
+0

Das ist perfekt. Ich wusste, dass ich irgendwie den Baum gehen könnte, aber die Schlüsselidee hier ist das "if args == (t,)" Ich hätte bestimmt nicht gewusst, dass das überhaupt möglich ist! Vielen Dank! – mike