2017-05-24 11 views
2

sympyのsolve関数は、方程式にFunctionが存在する場合、または解決する対象である場合、いくつかの式を解くことができないようです。sympy式の関数を同じ名前のシンボルに置き換える

これを回避するには、同じ名前のSymbolの式でFunctionを自動的に置き換える汎用関数を作成したいと思います。

たとえば、Function('myfunc')(Symbol('t'))が式に含まれている場合は、Symbol('myfunc')を代入したいと思います。

subs関数は、あらかじめ明示的に名前を知っていなければならないため、これを行うことはできません。

replace関数は、特にfunc - > funcのフレーバーで有望ですが、オブジェクトから関数オブジェクトの名前を取得する方法がわかりません。ここで

答えて

0

は私の提案です:

import sympy 

t = sympy.Symbol("t") 
x = sympy.Symbol("x") 
F = sympy.Function("F")(t) 
G = sympy.Function("G") 

def remove_undefineds(expression): 
    for item in sympy.preorder_traversal(expression): 
     if isinstance(item, sympy.function.AppliedUndef): 
      name = str(item).split('(')[0] 
      expression = expression.subs(item, sympy.Symbol(name)) 
    return expression 


expression = F + G(x) + t**x 

cleaned = remove_undefineds(expression) 

利回り:

In [1]: expression 
Out[1]: t**x + F(t) + G(x) 

In [2]: cleaned 
Out[2]: F + G + t**x 

アイデアは表現のpreorder_traversalをループにある、それはAppliedUndefined(すなわちF(のインスタンスのかどうか、各項目をチェック_)であり、Fが未定義の関数である場合)、そうであればそれを名前に応じたシンボルに置き換えます。

私は文字列分割を使用して、このステップで引数を削除しなければならないと仮定して、 "myfunc"パートだけを取得しました。そうでなければstr(item)だけで置き換えることができます。

私はまた、定義されていない関数のみが置き換えられると仮定します。そうでなければ、それに応じて補数を増やす必要があります。

関連する問題