使用同名的符号替换sympy表达式中的函数

问题描述:

似乎sympy的solve函数无法求解方程中存在的一些方程式,或者是要求解的目标。使用同名的符号替换sympy表达式中的函数

为了解决这个问题,我想创建一个通用函数,该函数会自动替换Function s中的一个表达式,其中Symbol同名。

例如,如果Function('myfunc')(Symbol('t'))出现在表达式中,我想替换Symbol('myfunc')

subs函数不能这样做,因为名称必须事先明确知道。

replace函数看起来很有前途,特别是它的func - > func味道,但我无法弄清楚如何从对象中获取函数对象的名称。

这里是我的建议:

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函数被替换,否则必须相应地增加...