Python 有没有办法在Symphy中处理常量函数参数?

Python 有没有办法在Symphy中处理常量函数参数?,python,sympy,symbolic-math,Python,Sympy,Symbolic Math,我正在生成符号函数,并使用SymPy来简化它们。 现在,我想要一种方法来“简化”符号,这些符号表示尚未拟合的函数中的常量参数。 例如,如果我生成一个多项式,我可能会生成这样的字符串 C*x*x + C*x + C*x + C, 哪个交响乐团会变成 C*x^2 + 2*C*x + C. 现在我想找到一种方法来实现这一点: C*x^2 + C*x + C. 换句话说,有没有一种方法可以告诉辛皮,某个符号是常量且未定义的,所以 C+C -> C, C*C -> C, etc. Or

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

C*x*x + C*x + C*x + C,
哪个交响乐团会变成

C*x^2 + 2*C*x + C.
现在我想找到一种方法来实现这一点:

C*x^2 + C*x + C.
换句话说,有没有一种方法可以告诉辛皮,某个符号是常量且未定义的,所以

C+C -> C, C*C -> C, etc. Or more generally: f(C) = C, for any f(C)?
我的第一个想法是,也许有一个假设(比如Q.positive)描述了这个属性,我可能能够使用refine。然而,情况似乎并非如此。 如果没有其他方法的话,我肯定有一种方法可以使用预排序遍历来完成我想做的事情,但我无法想出一个策略来完成它。
非常感谢您的帮助或想法。

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


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

您的意思是每个术语中的符号C都是相同的符号吗?如果是这样,那么在其他术语中,您也需要将
C
替换为
C/2
。cf哇!我只是部分理解代码中发生的事情,但它是有效的!然而,我有一个问题。似乎对于自由常数的和或乘的情况,编号变得疯狂。在您的示例中,如果设置e=d,则返回值为:c0+c2*x**2+c3*x。查看函数集合的常量,它计算c0两次。你能调查一下吗?此外,在我看来,这不应该适用于多元函数。目前,当我测试它时,它似乎起了作用。你认为呢?是的,编号是任意的。多项式可以按照单项式的次数顺序重新编号。只要在表达式后传递所有变量,它就应该适用于多元函数,例如
consim(eq,x,y)
。这只是一个轻量级的例程,例如,它不会深入检查相互依赖的常量。
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