首页 > 解决方案 > 有没有办法在 SymPy 中处理常量函数参数?

问题描述

我正在生成符号函数并使用 SymPy 来简化它们。现在我想要一种方法来“简化”表示尚未拟合的函数中的常量参数的符号。例如,如果我正在生成一个多项式,我可能会生成一个这样的字符串

C*x*x + C*x + C*x + C,

SymPy 会变成哪个

C*x^2 + 2*C*x + C.

现在我想找到一种方法来得到这个:

C*x^2 + C*x + C.

换句话说,有没有办法告诉 SymPy 某个符号是常量且未定义的,所以

C+C -> C, C*C -> C, etc. Or more generally: f(C) = C, for any f(C)?

我的第一个想法是,也许有一个描述这个属性的假设(例如 Q.positive),我也许可以使用细化。然而,情况似乎并非如此。如果不出意外,我确信有一种方法可以使用 preorder_traversal 来做我想做的事,但我无法想出一个策略来做到这一点。任何帮助或想法表示赞赏。

标签: pythonsympysymbolic-math

解决方案


可能是这样的(应用于已完全展开的表达式):

def consim(eq, *v):
    con = numbered_symbols('c', cls=Dummy)
    reps = {}
    for i in preorder_traversal(eq):
        if i.is_Mul or i.is_Add:
            c, d = i.as_independent(*v)
            if c != i.identity and c.free_symbols:
                c = reps.setdefault(c, next(con))
    return eq.subs(reps)


>>> from sympy.abc import a, b, c, d, x
>>> eq = 2*a*x**2 + b*c*x + d + e
>>> consim(eq, x)
         2
c₀ + c₁⋅x  + c₂⋅x

您可能需要编号符号,而不是所有符号都相同。


推荐阅读