4

在 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_argumentand polar_lift。与以下对象相同的对象:

Abs(periodic_argument(polar_lift(s)**(-2), oo))

必须小于pi/2我想要的解决方案。有没有一种很好的方法来只满足这种条件 - 在 Mathematica 中,人们可能会使用Assumingand Refineor Simplify,但我是 sympy 的新手,我不知道该怎么做。

4

2 回答 2

4

设置s为正数就足够了。真的,我认为答案应该是Abs(s),因为真正的ssqrt(s**2) = Abs(s)(不过我对此并不积极)。

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

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)   ⎠│    ⎠

您也可以将其从 Piecewise 中拉出

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

当然,首选的方法是使用refine,但不幸的是,使用新假设系统的东西(任何使用的东西Q)仍在开发中,所以可能还不能工作,或者只能在 SymPy 开发版本中工作。

于 2013-05-18T03:52:05.897 回答
4

答案涉及到 的平方的Symbol平方根s

声明s肯定以使其正确简化。经过:

s = Symbol('sigma', real=True, positive=True)
于 2013-05-17T00:52:00.437 回答