Sympy:有没有办法收集和分解常数项

时间:2020-06-01 10:33:42

标签: python sympy

如果我有这个表达:
x 2 a 2 -x 2 b 2 + 2xa 1 -2xb 1 + 12a 0 -12b 0

我怎么能给我这个?
x 2 (a 2 -b 2 )+ 2x(a 1 - b 1 )+ 12(a 0 -b 0

这是我的代码:

from sympy import sympify, factor_terms, collect
x = symbols('x', real=True)
a2, a1, a0  = symbols('a2 a1 a0', real = True, constant = True)
b2, b1, b0  = symbols('b2 b1 b0', real = True, constant = True)
c2, c1, c0  = symbols('c2 c1 c0', real = True, constant = True)

expr = sympify(x**2*a2 - x**2*b2 + 2*a1*x - 2*b1*x + 12*a0 - 12*b0)
f_expr = factor_terms(collect(expr, x))
display(f_expr)

返回:
x 2 (a 2 -b 2 )+ 2x(a 1 - b 1 )+ 12a 0 -12b 0

我正在寻找的是一种收集常数项( x 0 的系数并能够将它们分解的东西)的方法。
x 2 (a 2 -b 2 )+ 2x(a 1 - b 1 )+ 12(a 0 -b 0

主要是为了让我可以用另一个变量替换差异。

f_expr.replace(a2 - b2, c2).replace(a1 - b1, c1).replace(a0 - b0, c0)

1 个答案:

答案 0 :(得分:2)

您必须做一些表情辩论才能使这种情况发生。但是进行代数替换更容易。不用替换a - b -> A而是执行a -> b + A

>>> from sympy import var
>>> var('x:6')
(x0, x1, x2, x3, x4, x5)
>>> eq = 2*x0-2*x1+3*x2-3*x3+4*x4-4*x5
>>> eq
2*x0 - 2*x1 + 3*x2 - 3*x3 + 4*x4 - 4*x5
>>> eq.subs(dict(x0=x1+x,x2=x3+y,x4=x5+z))
2*x + 3*y + 4*z