为什么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))
有谁知道这里发生了什么?
答案 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)
这是Sympy未能评估的原始整体形式。 (注意使用sympy.Integral
返回未评估的积分。)积分变量的一个(显而易见的?)变换是z -> exp(z)
,这导致一个新的积分如下
I2 = I.transform(z,sp.exp(z))
print(I2)
现在,我们可以调用doit()
方法来评估转换的积分:
I2.doit()
1