我目前正在处理超过一个变量的函数,并需要收集类似项以简化表达式。
假设表达式如下所示:
x = sympy.Symbol('x')
y = sympy.Symbol('y')
k = sympy.Symbol('k')
a = sympy.Symbol('a')
z = k*(y**2*(a + x) + (a + x)**3/3) - k((2*k*y*(a + x)*(n - 1)*(-k*(y**2*(-a + x) + (-a + x)**3/3) + k*(y**2*(a + x) + (a + x)**3/3)) + y)**2*(-a + k*(n - 1)*(y**2 + (a + x)**2)*(-k*(y**2*(-a + x)))))
zEx = z.expand()
print type(z)
print type(zEx)
编辑:为了更加清晰,我调整了表达方式,使问题更容易理解。
假设 z
包含大量项,通过人工筛选并选择适当的项需要花费不可接受的时间。
我想收集所有仅为 a**1 的倍数的项。我不关心 a 的二次或更高次幂,也不关心不包含 a 的项。
z
和 zEx
的类型如下:
print type(z)
print type(zEx)
>>>
<class 'sympy.core.add.Add'>
<class 'sympy.core.mul.Mul'>
有人知道我如何收集那些是a
的倍数,但不是a^0或a^2的术语吗?
简而言之
在常数a和k下描述为z
和zEx
及其type()的z(x,y)中,如何从z
中删除所有非a
项,并从表达式中删除所有二次或更高次的a
项?这样剩下的只有包含a
的单位幂的术语。
zstr.split('-')
和' - '.join(res)
。如果既有+
又有-
,那就有点棘手了。我可以尝试稍后更新帖子。但根据@asmeurer和至少另一个人的说法,这不是正确的方法——即使它能完成任务,也会被投票降低评分。 - Clebx - y
等同于Add(x, Mul(-1, y))
。因此,如果按参数拆分它,符号已经在项上了,所以为了将它们重新组合在一起,你只需要执行Add(*terms)
。 - asmeurer