首页 > 解决方案 > 在 Sympy 中收集多元多项式函数的子表达式

问题描述

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

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),它返回了原始方程。

谢谢!

标签: sympysymbolic-math

解决方案


考虑使用临时符号z = x**2 + y**2并替换x**2z - 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

尽管这样可行,但也许更直接的做法是通过系数 AD 将表达式分开,然后将这些项集合分解:

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

推荐阅读