SymPy:在表达式中收集特定术语

时间:2019-07-23 16:34:46

标签: python sympy symbolic-math

我正在尝试使一个符号表达式线性化,就像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

1 个答案:

答案 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)

请注意,没有必要为了获得系数而进行收集...但是您必须先进行扩展。