我正在做一个非常简单的概率计算,从 AZ 集合中获取 X、Y、Z 的子集(具有相应的概率 x、y、z)。
而且由于公式非常繁重,为了处理它们,我正在尝试使用 sympy 来简化(或收集或分解-我不知道确切的定义)这些多项式表达式。
所以.. 有这个(一个非常简单的概率计算表达式,从具有相应概率 x、y、z 的 AZ 集合中获取 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)
+
一个多边形,以尽可能少的操作( , -
, *
, **
, ...)的方式重写
我试过了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)
我知道 sympy 可以将多项式组合成简单的形式:
sp.factor(x**2 + 2*x*y + y**2) # gives (x + y)**2
但是如何使 sympy 从上面的表达式中组合多项式呢?
如果这是 sympy 中不可能完成的任务,是否还有其他选择?