在同情中集成Log-Normal PDF

时间:2016-11-06 18:25:00

标签: python-3.x sympy

为什么SymPy不会将标准的Log-Normal PDF集成到1?

我在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))

有谁知道这里发生了什么?

1 个答案:

答案 0 :(得分: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