首页 文章

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

提问于
浏览
2

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

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

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

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

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

1 回答

  • 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) 取代 .

    我还假设只有未取代的功能被替换,否则就必须相应增加...

相关问题