我正在做一个非常简单的概率计算,从A-Z集合获得X,Y,Z的子集(具有相应的概率x,y,z).
并且由于非常繁重的公式,为了处理它们,我试图使用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,以尽可能少的操作(, – ,*,**,…)重写
我尝试了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
但如何结合上面的表达式来组合多项式呢?
如果这是不可能的任务,可能还有其他选择吗?
解决方法:
这次把一些方法放在一起恰好给出了一个很好的答案.有趣的是,看看这个策略是否比你生成的方程更常用,或者,如顾名思义,这次只是一个幸运的结果.
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))
物有所值,
克里斯
标签:python,sympy,symbolic-math 来源: https://codeday.me/bug/20190620/1245190.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。