我正在做一个非常简单的概率计算,从 A-Z 集合中获取 X、Y、Z 的子集(具有相应的概率 x、y、z)。
由于公式非常繁重,为了处理它们,我正在尝试simplify (or collect or factor- 我不知道确切的定义)这些多项式表达式使用sympy.
所以..有这个(一个非常简单的概率计算表达式,从 A-Z 集合中获取 X、Y、Z 的子集,并具有相应的概率 x、y、z)
import sympy as sp
x, y, z = sp.symbols('x y z')
expression = (
x * (1 - x) * y * (1 - x - y) * z +
x * (1 - x) * z * (1 - x - z) * y +
y * (1 - y) * x * (1 - y - x) * z +
y * (1 - y) * z * (1 - y - z) * x +
z * (1 - z) * y * (1 - z - y) * x +
z * (1 - z) * x * (1 - z - x) * y
)
我想要得到这样的东西
x * y * z * (6 * (1 - x - y - z) + (x + y) ** 2 + (y + z) ** 2 + (x + z) ** 2)
一个poly,以最少的操作重写(+
, -
, *
, **
, ...) 尽可能
I tried factor()
, collect()
, simplify()
。但结果与我的预期不同。大多数情况下我得到
2*x*y*z*(x**2 + x*y + x*z - 3*x + y**2 + y*z - 3*y + z**2 - 3*z + 3)
我知道同情可以combine将多项式化为简单形式:
sp.factor(x**2 + 2*x*y + y**2) # gives (x + y)**2
但如何使人同情combine上面表达式的多项式?
如果这在 sympy 中是不可能的任务,可能还有其他选择吗?