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

时间:2017-05-24 22:53:19

标签: sympy

当方程中存在solve s或者是要解决的目标时,似乎sympy的Function函数无法求解某些方程。

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

例如,如果表达式中出现Function('myfunc')(Symbol('t')),我希望用Symbol('myfunc')代替。

subs函数无法执行此操作,因为必须事先明确知道名称。

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

1 个答案:

答案 0 :(得分: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)替换。

我还假设只有替换未找到的函数,否则就必须相应地增加...