系数分组:来自较长表达式的系数方程

时间:2014-05-03 10:40:28

标签: python grouping sympy coefficients

我使用sympy来生成矩阵中的行列式:

from sympy import *

X1, Y1 = symbols ("X1 Y1")
x1, x2, x3, y1, y2, y3 = symbols ("x1 x2 x3 y1 y2 y3")
th12, th13 = symbols ("theta_{12} theta_{13}")

X2 = cos(th12)*X1-sin(th12)*Y1+x2-y1*cos(th12)-y1*sin(th12)
Y2 = sin(th12)*X1+cos(th12)*Y1+y2-x1*sin(th12)-y1*cos(th12)

X3 = cos(th13)*X1-sin(th13)*Y1+x3-y1*cos(th13)-y1*sin(th13)
Y3 = sin(th13)*X1+cos(th13)*Y1+y3-x1*sin(th13)-y1*cos(th13)

M=Matrix([[X1,Y1,1],[X2,Y2,1],[X3,Y3,1]])
Det=M.det()
print Det

如果您运行代码,您会注意到它会产生一个非常长的"表达。我想得到一个表达式:

X1 ** 2 + Y1 ** 2 + A * X1 + B * Y1 + C = 0(圆周方程)

所以我希望Python能够生成系数A,B和C.基本上我想将所有共享X1 ** 2的热量组合在一起,所有的热量分享Y1 ** 2等等。

如果我插入x1,x2,x3,y1,y2,y3,th12,th13的数值,我可以得到我需要的形式的表达式,但我想得到系数A,B和C

编辑:修正Xi和Yi公式,增加了更多信息。

1 个答案:

答案 0 :(得分:4)

collect是正确的工具:

以上链接中的示例:

>>> collect(a*x**2 + b*x**2 + a*x - b*x + c, x)
c + x**2*(a + b) + x*(a - b) 

在你的情况下(这里的系数没有标准化):

col = collect(Det, [X1, Y1], evaluate=False)
A = col[X1]
B = col[Y1]
C = col[S.One]

使用evaluate=False,您将获得有关因素的字典。否则,你得到完整的表达。