2017-05-24 195 views
2

似乎sympy的solve函數無法求解方程中存在的一些方程式,或者是要求解的目標。使用同名的符號替換sympy表達式中的函數

爲了解決這個問題,我想創建一個通用函數,該函數會自動替換Function s中的一個表達式,其中Symbol同名。

例如,如果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(IE F的一個實例( _),F是一個未定義的函數),如果是,則用符號名稱替換它。

我使用了字符串split來單獨獲取「myfunc」部分,假設參數在這一步被刪除;否則只能由str(item)替代。

我還假設只有undefind函數被替換,否則必須相應地增加...

相關問題