Sympy:分层收集具有多个因子表达式的方程?

问题描述 投票:0回答:1

我们可以使用具有多个因子表达式(并且分层)的 sympy 收集/分解一个符号方程吗? 我提供以下示例:将长计算结果放入扩展方程

f
中。在我的计算中,方程更大、更复杂。

import sympy
a,b,m,n = sympy.symbols('a b m n')
f = -a**2*b*m**2 - a**2*b*m*n - a**2*b*m + a**2*m**2*n + a**2*m**2 + 2*a**2*m + a**2*n**2 - a*b*m - a*b*n + 5*a*m + a*n**2 + a*n + b*m**2 - 2*b*m*n - b*m - b*n**2 - m**2 + 2*m*n + n**2 + 1
g=sympy.collect(g,(a**2,1-b))

我期望一个函数(收集?)首先围绕

a**2
分层聚合项,然后是
(1-b)
,以便
f
写成下面的方程
g

g = a**2 * ( (1-b) * (m+n*m+m**2)+m+n**2-m*n+m**2*n)+a*((1-b)*(m+n)+n**2+4*m)+(1-b) * (m+n**2-m**2+2*m*n) +1 - m

其中方程围绕 a**2 进行因式分解/分组,然后 (1-b)

当然,f=g可以在我的例子中验证:

h = sympy.simplify(f-g)
print(h)
python sympy
1个回答
0
投票

集合在符号上比求和更有效,因此请尝试以下方法,它会给出与您想要的

g
相同的结果:

>>> g == collect(collect(f.subs(b,1-y).expand(),a),y).subs(y,1-b)
True

expand
扩展了
m*(1 - y) -> m - m*y
等产品,因此您可以在
y
上收集。我使用
a
而不是
a**2
和标记
exact=True
,因为您的
g
表情也收集在
a
上,而不仅仅是
a**2

© www.soinside.com 2019 - 2024. All rights reserved.