2013-05-16 24 views
2

簡化有條件的積分在SymPy,如果我通過整合一般高斯:在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因爲我想要的解決方案。有沒有一種很好的方法來解決這個問題 - 在Mathematica中可以使用AssumingRefineSimplify,但我是sympy的新手,我不知道該怎麼做。

+0

對我來說,它已經簡化了你的假設。 – asmeurer

+0

@asmeurer再次您好;)...錯字 - 應該是(-oo,oo) – Lucas

回答

2

設置s是積極的應該是足夠的。真的,我認爲答案應該是Abs(s),因爲對於真實的s,sqrt(s**2) = Abs(s)(儘管我對此並不滿意)。

在SymPy的git的主分支,你可以用細化手動承擔的確切條件你想

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

你也可以把它在Pi之外ecewise

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

的首選方法,當然,使用起來會refine,但不幸的是,事情使用新的假設系統(使用Q任何東西)仍處於開發階段,因此可能無法工作,或者可能只是工作在SymPy開發版本中。

4

答案涉及Symbol的平方的平方根必須與s綁定。

聲明s肯定會使其簡化。通過:

s = Symbol('sigma', real=True, positive=True)