简化SymPy中的条件积分

时间:2013-05-16 23:53:42

标签: python sympy symbolic-math

在SymPy中,如果我将普通高斯集成为:

x = Symbol("x", real=True)
y = Symbol("y", real=True)
s = Symbol("s", real=True)

gaussian = exp(-((x-y)**2)/(2*(s**2)))
nfactor = simplify(integrate(gaussian, (x,-oo,oo)))

nfactor Piecewise取决于periodic_argumentpolar_lift Abs(periodic_argument(polar_lift(s)**(-2), oo)) 。与以下内容相同的对象:

pi/2
对于我想要的解决方案,

必须小于Assuming。有没有一种很好的方法只有这种情况 - 在Mathematica中可以使用RefineSimplify或{{1}},但我是新来的,我不知道该怎么做这里。

2 个答案:

答案 0 :(得分:4)

答案涉及Symbol方格{@ 1}}的平方根。

声明s为正,以使其正确简化。由:

s

答案 1 :(得分:4)

s设置为正数应该足够了。实际上,我认为答案应该是Abs(s),因为对于真实ssqrt(s**2) = Abs(s)(尽管我对此并不积极)。

在SymPy的git master分支中,您可以使用refine来手动假设您想要的确切条件

In [6]: refine(nfactor, Q.is_true(Abs(periodic_argument(1/polar_lift(s)**2, oo)) <= pi/2))
Out[6]:
  ___   ___
╲╱ 2 ⋅╲╱ π ⋅s

另一种方式,如果你知道你的积分满足条件,但是你不能简化它们(因为不幸的是,SymPy中这种条件的简化非常差),你可以使用integrate(conds='none'),或integrate(conds='separate')(这不需要git版本。

In [8]: integrate(gaussian, (x,-oo,oo), conds='none')
Out[8]:
  ___   ___
╲╱ 2 ⋅╲╱ π ⋅s

In [9]: integrate(gaussian, (x,-oo,oo), conds='separate')
Out[9]:
⎛  ___   ___    │                 ⎛      1          ⎞│   π⎞
⎜╲╱ 2 ⋅╲╱ π ⋅s, │periodic_argument⎜──────────────, ∞⎟│ ≤ ─⎟
⎜               │                 ⎜          2      ⎟│   2⎟
⎝               │                 ⎝polar_lift (s)   ⎠│    ⎠

您也可以将它从片段中拉出来

In [10]: nfactor.args[0][0]
Out[10]:
  ___   ___
╲╱ 2 ⋅╲╱ π ⋅s

当然,首选方法是使用refine,但遗憾的是,使用新假设系统(使用Q的任何内容)的内容仍在开发中,因此可能无法正常工作,或者可能只适用于SymPy开发版本。