2016-11-06 50 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