我正在进行一个非常简单的概率计算,从A-Z集合中获取X、Y、Z的子集(相应的概率为x、y、z)。
由于公式非常复杂,为了处理它们,我尝试使用sympy来简化(或收集或因式分解-我不知道确切的定义)这些多项式表达式。
所以...有了这个(一个非常简单的概率计算表达式,从A-Z集合中获取X、Y、Z的子集,并具有相应的概率x、y、z)。
我知道sympy可以将多项式合并为简单形式:
由于公式非常复杂,为了处理它们,我尝试使用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)
一个多项式,重写为尽可能少的操作(+
、-
、*
、**
等)。
我尝试使用 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可以将多项式合并为简单形式:
我知道sympy可以合并多项式成为简单形式:
sp.factor(x**2 + 2*x*y + y**2) # gives (x + y)**2
但是如何使sympy将上面的表达式中的多项式合并?
如果在sympy中无法完成此任务,也许还有其他选择?
x * (1 - x) * y * (1 - x - y) * z + ...
->x / (1 - x) * y / (1 - x - y) * z + ...
,对于这样的方程,你的组合不起作用(我想这是因为显而易见的事情,但由于我不知道算法...)。 - akaRemiflfactor
最终无法执行所有必要的替换以返回原始变量。我必须在末尾添加几个e.subs(r)
才能获取所有原始变量。 - Him