【问题标题】:Seeming inconsistency in scipy.integrate.quad operation under change of variable在变量更改下 scipy.integrate.quad 操作似乎不一致
【发布时间】:2018-04-11 10:51:34
【问题描述】:

我有一个算法,旨在将两个函数相乘并整合结果。一个是 1.0 左右的小正态分布,标准差约为 0.1;另一个也是正常的,但要大得多,平均为 100,000,标准差为 15,000。

代码如下:

def integrand(x, z, mu, sigma) :  
    # goal is to return return  f_x(x)*f_y(z/x)*1/abs(x)
#   return normal(x, mu, sigma) * normal(z/x, 100000, 15000)/abs(x) 
    return normal(z/x, mu, sigma) * normal(x, 100000, 15000)/abs(x) 

    pResult = quad(integrand, -10000000,10000000,
                       args=(_z, MU, SIGMA),
                       points = [1.0, 2.0, 100000.0],
                       epsabs = 1, epsrel = .01)   

这是一个乘以随机变量的公式,Z = XY。看起来我可以交换 z/x 在被积函数中的位置,但是在尝试查看哪种方式运行得更快(通过注释掉 integrand() 中的两个返回语句之一)时,我惊讶地得到不同的结果(一个是 114,221.4,另一个是 116,174.2)。知道为什么吗?

另外,当我循环遍历大范围的 z 值并绘制 P(z) 与 z 时,图表看起来不同,一个看起来正确(像正态分布 - 使用第一个 return 语句),另一个看起来像带软角的礼帽。

此算法的数学运算:https://en.wikipedia.org/wiki/Product_distribution

【问题讨论】:

    标签: python scipy numerical-integration


    【解决方案1】:

    缩放很重要,正如我在对您的previous question 的回答中指出的那样,建议使用points 来帮助quad 定位相对较小的功能。

    您重新调整函数但保持相同的积分间隔。假设函数本质上“拟合”在区间内(区间外的尾部可以忽略不计),差异是由于算法能够或不能在积分区间内定位函数的小特征(窄高斯) .功能支持越窄,quad 越容易集成错误。

    我还建议将准确性作为重中之重;速度在那之后。编写一个快速返回“0”的函数很容易。

    【讨论】:

      猜你喜欢
      • 2017-11-20
      • 2016-12-19
      • 2019-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多