在sympy中分解polys
问题内容:
我正在做一个非常简单的概率计算,即从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中是不可能完成的任务,可能还有其他选择吗?
问题答案:
这次将一些方法放在一起会给出一个很好的答案。有趣的是,看看这种策略是否比您生成的方程式更有效,或者顾名思义,这次只是幸运的结果。
def iflfactor(eq):
"""Return the "I'm feeling lucky" factored form of eq."""
e = Mul(*[horner(e) if e.is_Add else e for e in
Mul.make_args(factor_terms(expand(eq)))])
r, e = cse(e)
s = [ri[0] for ri in r]
e = Mul(*[collect(ei.expand(), s) if ei.is_Add else ei for ei in
Mul.make_args(e[0])]).subs(r)
return e
>>> iflfactor(eq) # using your equation as eq
2*x*y*z*(x**2 + x*y + y**2 + (z - 3)*(x + y + z) + 3)
>>> _.count_ops()
15
顺便说一句,factor_terms和gcd_terms之间的区别在于,factor_terms在保留表达式的原始结构的同时,将更努力地提取通用术语,就像您手动操作一样(即在可以拉出的Adds中查找通用术语)
。
>>> factor_terms(x/(z+z*y)+x/z)
x*(1 + 1/(y + 1))/z
>>> gcd_terms(x/(z+z*y)+x/z)
x*(y*z + 2*z)/(z*(y*z + z))
物有所值,
克里斯