我正在尝试使一个符号表达式线性化,就像SymPy documentation中为collect
函数提供的表达式:a*x**2 + b*x**2 + a*x - b*x + c
。我想用x
代替x+dx
,然后收集dx
中所有线性的项。但是,当我尝试将collect
函数与coeff
函数一起使用时,它却没有给出所需的答案:
>>> from sympy import S, collect, expand, factor, Wild
>>> from sympy.abc import a, b, c, x, y, z
>>> collect(a*x**2 + b*x**2 + a*x - b*x + c, x)
c+x2(a+b)+x(a−b)
>>> eq1 = a*x**2 + b*x**2 + a*x - b*x + c
>>> dx = symbols('dx')
>>> eq2=eq1.subs(x,x+dx)
>>> eq2
a*(dx+x)**2+a*(dx+x)+b*(dx+x)**2−b*(dx+x)+c
>>> collect(eq2,dx).coeff(dx,1)
0
使用Poly
函数产生:
>>> Poly(eq2,dx)
Poly((a+b)*dx**2+(2*a*x+a+2*b*x−b)*dx+a*x**2+a*x+b*x**2−b*x+c,dx,domain=Z[x,a,b,c])
意味着我想要获得的表达式是2ax+a+2bx−b
。
答案 0 :(得分:0)
collect
文档字符串表明
输入表达式不被:func:
collect
扩展,因此用户可以 期望提供一个表达式是一种适当的形式。这使得 :collect
更可预测,因为在 场景。
由于没有dx
是影响因素的术语(它看起来像是x + dx
,因此应首先扩展表达式:
>>> var('a:c dx')
(a, b, c, dx)
>>> eq1 = a*x**2 + b*x**2 + a*x - b*x + c
>>> eqdx = eq1.subs(x, x + dx)
>>> eqdx.expand().coeff(dx)
2*a*x + a + 2*b*x - b
>>> collect(_, (a, b))
a*(2*x + 1) + b*(2*x - 1)
请注意,没有必要为了获得系数而进行收集...但是您必须先进行扩展。