Scipy.integrate给出奇怪的结果;有最佳做法吗?

时间:2018-04-15 23:58:25

标签: python-3.x scipy

我仍然在与scipy.integrate.quad挣扎。

保留所有细节,我有一个不可或缺的评估。该函数是x中函数乘积的积分形式,如下所示:

Z(k)= f(x)g(k / x)/ abs(x)

我确信整合范围在两个正数之间。奇怪的是,当我选择一个广泛的范围,我知道必须包含x的所有正值 - 如从1到10,000,000的积分 - 它快速整合并给出一个看起来正确的答案。但是当我找出确切的限制 - 我知道sice f(x)在很多实线上都是零 - 并且使用那些,我得到另一个不同的答案。虽然我知道第二个更准确,但它们并没有太大差异。

经过多次摆弄后,我让它工作正常,但后来需要增加一个解决方案 - 我至少得到了一个顺利的'回答z的计算函数。在我加入指数(这是必需的)之前,我有一个正常工作,但现在生成的函数(z)变得越来越振荡和奇特。

知道这里发生了什么吗?我知道这段代码来自旧的Fortran库,因此必定存在一些已知问题,但我找不到引用。

以下是核心代码:

def normal(x, mu, sigma) :
    return (1.0/((2.0*3.14159*sigma**2)**0.5)*exp(-(x-
                                      mu)**2/(2*sigma**2)))

def integrand(x, z, mu, sigma, f) : 
return np.exp(normal(z/x, mu, sigma)) * getP(x, f._x, f._y) / abs(x)




    for _z in range (int(z_min), int(z_max) + 1, 1000):
        z.append(_z)
        pResult = quad(integrand, lb, ub,
                       args=(float(_z), MU-SIGMA**2/2, SIGMA, X),
                       points = [100000.0],
                       epsabs = 1, epsrel = .01)    # drop error estimate of tuple 
        p.append(pResult[0])   # drop error estimate of tuple 

顺便说一句,getP()返回一个线性插值,分段连续但非平滑的函数,以给出平滑拟合在离散的“桶”之间的积分器值。直方图。

1 个答案:

答案 0 :(得分:0)

与许多数值方法一样,它对渐近线、零等非常敏感。唯一的选择是继续给它“提示”,如果它接受它们。