在 Sympy 中收集多元多项式函数的子表达式

Collecting sub-expressions of a multivariate polynomial function in Sympy

我在 xy 中有一个用 Sympy 编写的 6 阶多元方程,例如

eqn = a*x**6 + b*x**5*y + c*x**4*y + d*x**3*y + e*x**3*y**2 + ...  

有没有办法收集 (x**2+y**2) 并将它们重新排列成以下格式?

eqn2 = A*(x**2+y**2)**3 + B*(x**2+y**2)**2 + C*(x**2+y**2) + D  

A, B, C, D 可以在 x, y.

到目前为止我只试过 collect(eqn, x**2 + y**2) 并且它返回了原始方程。

谢谢!

考虑使用临时符号z = x**2 + y**2,将x**2替换为z - y**2,然后展开还原:

>>> ex
A*x**6 + 3*A*x**4*y**2 + 3*A*x**2*y**4 + A*y**6 + B*x**4 + 2*B*x**2*y**2 +
B*y**4 + C*x**2 + C*y**2 + D
>>> ex.subs(x**2, z - y**2).expand().subs(z, x**2 + y**2)
A*(x**2 + y**2)**3 + B*(x**2 + y**2)**2 + C*(x**2 + y**2) + D

虽然这可行,但也许更直接的做法是用系数 A-D 分隔表达式,然后分解这些项集合:

def separatevars_additively(expr, symbols=[]):
    free = set(symbols) or expr.free_symbols
    d = {}
    while free:
        f = free.pop()
        expr, dep = expr.as_independent(f, as_Add=True)
        if dep.has(*free):
            return None
        d[f] = dep
    if expr:
        d[0] = expr
    return d

>>> coeff = var("A:D")
>>> separatevars_additively(ex, coeff)
{B: B*x**4 + 2*B*x**2*y**2 + B*y**4, A: A*x**6 + 3*A*x**4*y**2 + 3*A*x**2*y**4 + A*y**6, D: D, C: C*x**2 + C*y**2}
>>> Add(*[factor(i) for i in _.values()])
A*(x**2 + y**2)**3 + B*(x**2 + y**2)**2 + C*(x**2 + y**2) + D