Scipy积分出错了

时间:2014-11-09 05:34:59

标签: python scipy integral

我正在尝试集成一个功能。该功能保证是非负面的:

def function(x):
    something = ...
    something_else = ...
    return exp(something) / sqrt(something_else)

现在我正在整合它:

def integrand(a, b):
    return scipy.integrate.quad(function, a, b)

我得到的结果不是我所期望的,所以要检查我这样做了:

for x in range(0, 10000):
    if integrand(0,x+1) < integrand(0,x):
        raise ValueError("Weird!")

果然,我得到'奇怪'的例外。怎么会这样?

1 个答案:

答案 0 :(得分:1)

如果没有一个工作示例,很难调试您的代码,但这里有一些基于您所展示的内容的建议。

quad返回一个带有两个值的元组:积分的估计值和结果中绝对误差的估计值。您似乎没有使用代码中的第一个值。尝试将integrand更改为

def integrand(a, b):
    return scipy.integrate.quad(function, a, b)[0]

在致电[0]后注意quad

接下来,当您发现“奇怪”的情况时,应该打印integrand(0, x)integrand(0, x+1)的值。如果它们大致相同,那么正常的数值不精确可能会破坏理论上预期的顺序。看一下quad返回的第二个值。如果该值大于integrand(0, x)integrand(0, x+1)之间的差值,则您无法真正预期积分的估计值会单调增加,因为预期的增加量小于计算中的误差。如果这是问题,您可以尝试将epsabs和/或epsrel设置为小于默认值1.49e-8的值,但这只会让您到目前为止。最终你遇到了浮点计算的极限。