Python 精确计算线性函数对对数正态分布变量的积分
我迭代计算以下函数方程的一个不动点: 其中h是已知函数,Q是对数正态分布。让f*函数解函数方程。我知道f(z)/z是一个常数。然而,当用Python数值计算f时,比率f*(z)/z是单调递增的。为了量化误差的大小,我计算这个比率的最后一点和第一点之间的差值。我认为问题的根源在于函数Python 精确计算线性函数对对数正态分布变量的积分,python,scipy,numerical-integration,Python,Scipy,Numerical Integration,我迭代计算以下函数方程的一个不动点: 其中h是已知函数,Q是对数正态分布。让f*函数解函数方程。我知道f(z)/z是一个常数。然而,当用Python数值计算f时,比率f*(z)/z是单调递增的。为了量化误差的大小,我计算这个比率的最后一点和第一点之间的差值。我认为问题的根源在于函数f的数值积分: 函数f上的积分是关于对数正态分布的,stdvsigma平均值为零。在数值上,我计算积分如下: integrand = lambda z: f(z) * phi.pdf(z) result, error
f
的数值积分:
函数f上的积分是关于对数正态分布的,stdvsigma
平均值为零。在数值上,我计算积分如下:
integrand = lambda z: f(z) * phi.pdf(z)
result, error = fixed_quad(integrand, int_min, int_max, n=120)
我计算的误差主要由积分边界int\u min
和int\u max
决定。最初,我将集成边界指定为:
int_min, int_max = np.exp( - 1 * sigma), np.exp( 1 * sigma)
然而,当我改变积分边界以覆盖对数正态分布概率质量的95%时,即:
int_min, int_max = np.exp( - 2 * sigma), np.exp( 2 * sigma)
比率f*(z)/z的最高点和最低点之间的差值增加了系数100。stdv的数值为sigma=0.012
在回答我的问题之前,我想提出两点意见:
scipy.quadrature
而不是scipy.fixed_quad
并将积分的误差容差定义为1e-8左右(默认值scipy.quadrature
)时,比率中最高点和最低点之间的差值不会改变。这是否表明集成过程毕竟不是问题的根源李>
改变积分边界会对f*解的精度产生什么影响?如果使用的积分程序确实会导致问题,那么有没有更好的方法来数值计算积分 您是否尝试过使用
scipy.integrate.quad
()?像quad
这样的自适应积分器应该比使用fixed\u quad
更有效。您也可以尝试expect
的scipy.stats.lognorm
()方法。它使用scipy.integrate.quad
来计算func(x)*lognorm.pdf(x)
的积分,也就是说,它为您处理细节。@WarrenWeckesser:谢谢您的回复。我正在尝试你的两个建议。我会尽快对结果发表评论!