2016-11-06 47 views
2

爲什麼SymPy不會將標準對數正態PDF集成到1?在sympy中集成對數正態PDF

我跑在Python 3.x的下面的代碼和SymPy 1.0.1:

from sympy.stats import density, LogNormal 
from sympy import Symbol, integrate, oo 

mu, sigma = 0, 1 
z = Symbol('z') 
X = LogNormal('x', mu, sigma) 
f = density(X)(z) 

integrate(f, (z, 0, oo)) 

應該返回1,但輸出(?):

sqrt(2)*Integral(exp(-log(z)**2/2)/z, (z, 0, oo))/(2*sqrt(pi)) 

沒有人知道什麼是去這裏?

回答

2

顯然,Sympy未能找到此積分的封閉形式解決方案。

但是,您可以幫助Sympy執行集成。一種方法是執行整合變量的轉換,希望它能導致Sympy可以處理的更簡單的被整合的表達式。 Sympy爲此提供了一種方便的transform()方法。

import sympy as sp 
import sympy.stats 

mu, sigma = 0, 1 
z = sp.Symbol('z', nonnegative=True) 
X = sympy.stats.LogNormal('x', mu, sigma) 

f = sympy.stats.density(X)(z) 
I = sp.Integral(f, (z, 0, sp.oo)) 
print(I) 

enter image description here

這是原來的積分形式,這Sympy無法評估。 (注意使用的sympy.Integral它返回一個未計算積分。)一個(明顯?)積分變量的轉變是z -> exp(z),這將導致一個新的積分如下

I2 = I.transform(z,sp.exp(z)) 
print(I2) 

enter image description here

現在,我們可能調用doit()方法來評估轉化積分:

I2.doit() 

1