在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_argument
和polar_lift
Abs(periodic_argument(polar_lift(s)**(-2), oo))
。与以下内容相同的对象:
pi/2
对于我想要的解决方案,必须小于Assuming
。有没有一种很好的方法只有这种情况 - 在Mathematica中可以使用Refine
和Simplify
或{{1}},但我是新来的,我不知道该怎么做这里。
答案 0 :(得分:4)
答案涉及Symbol
方格{@ 1}}的平方根。
声明s
为正,以使其正确简化。由:
s
答案 1 :(得分:4)
将s
设置为正数应该足够了。实际上,我认为答案应该是Abs(s)
,因为对于真实s
,sqrt(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开发版本。