2017-11-20 20 views
1

私はすべての私の計算では、関数の変数としてx(t)与えSympy機能置換

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

のようなものを使用します。私は今、時間に関して、区別することができます(nonlinsolveまたはsolvesetはこれらの機能を潜在することができないためです)。

しかし、結果をMATLABにエクスポートしたいとします。だから私は(t)がなくてはなりません。私の望ましい結果が入力を

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

xは

私は d = {x(t):x}dictを埋めることができますが、私は、すべての機能のためにこれを行うには、よりエレガントな方法があると思い、 y(t),z(t)のような、... yはSympyに知られている "Function"ですが、出力には (t)はありません。そして、時間に依存することなく、すべての変数を再び導入しないようにしたい!

+0

どのようにしてMatlabにエクスポートしますか?あなたは '(t)'を削除したいところですか?それをスライスしたりインデクシングしたりしないでしょうか? –

+0

私は最終的な文字列の置換を避けたいです。そのとき、 'expr = x(t) - 1'文字で表現されます。私は 'expr.subs({x(t):x})'と同じ結果が欲しいです。 'y(t)、z(t)'のようなすべての関数に対してです。 – mike

+2

あなたの望む結果が何であるかはわかりません。どうか明らかにしてください。 –

答えて

2

ループはwalks through the expression treeであり、引数がtの関数はその関数の名前と一致するシンボルに置き換えられます。置換は、私たちが歩いている式を変更しないように、式の別のコピーで行われます。

例:exprがx(t) - y(t)の場合、expr1は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

これは完璧です。私は何とか木を歩くことができることを知っていましたが、ここでの重要なアイデアは "if args ==(t、)"です。これが可能であることは間違いありません!ありがとう! – mike

関連する問題