Python 精确计算线性函数对对数正态分布变量的积分

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

我迭代计算以下函数方程的一个不动点:

其中h是已知函数,Q是对数正态分布。让f*函数解函数方程。我知道f(z)/z是一个常数。然而,当用Python数值计算f时,比率f*(z)/z是单调递增的。为了量化误差的大小,我计算这个比率的最后一点和第一点之间的差值。我认为问题的根源在于函数
f
的数值积分:

函数f上的积分是关于对数正态分布的,stdv
sigma
平均值为零。在数值上,我计算积分如下:

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*的级别在很大程度上取决于积分边界。这一水平大致增加了3倍。级别的更改可能与Stackoverlow上发布的以下问题有关:

  • 改变积分边界会对f*解的精度产生什么影响?如果使用的积分程序确实会导致问题,那么有没有更好的方法来数值计算积分

    您是否尝试过使用
    scipy.integrate.quad
    ()?像
    quad
    这样的自适应积分器应该比使用
    fixed\u quad
    更有效。您也可以尝试
    expect
    scipy.stats.lognorm
    ()方法。它使用
    scipy.integrate.quad
    来计算
    func(x)*lognorm.pdf(x)
    的积分,也就是说,它为您处理细节。@WarrenWeckesser:谢谢您的回复。我正在尝试你的两个建议。我会尽快对结果发表评论!