scipy正交积分精度警告和nan差值

时间:2018-03-26 22:51:47

标签: python scipy integration

我尝试使用scipy.integration.quadrature集成一个复杂的函数组合,并抛出准确性警告,以及最新的差异'值是(gulp)nan:

' C:\ Program Files \ Anaconda3 \ lib \ site-packages \ scipy \ integrate \ quadrature.py:199:AccuracyWarning:maxiter(1000)已超出。最新的差异= nan'

问题似乎与这篇文章类似,但使用不同的集成方法,参数不同。

SciPy Quad Integration: Accuracy Warning

除了发布原始功能集之外,这里还有一个更简单的功能示例,它也会发出警告,尽管最新的差异'这里的值实际上是定义的数字。

def func(phi):
    return phi**3        

def func2(phi):
    return 1/(phi)


def int(phi):
    return func(phi)/abs(2/func2(phi)**5)

res, err = integrate.quadrature(int, 0, 1, maxiter=10)
print("The numerical result is {:f} (+-{:g})"
.format(res, err))

问题:为什么会出现这种行为(警告和值)?

我注意到,在此处提高maxiter值的值(例如,以10的幂)会大幅改变结果,但最新的差异值会增加 - 表明积分与结果不同。

有趣的是,使用具有相同输入的scipy.integration.quad会发出警告'积分可能是发散的,或者是缓慢收敛的。 warnings.warn(msg,IntegrationWarning)'。那么这只是集成功能选择不好的情况吗?请注意,这不是实际的功能,而是一个似乎给出相似(但不完全相同)行为的功能。

1 个答案:

答案 0 :(得分:0)

警告基本上意味着迭代次数不足以找到所需容差范围内的解决方案。因此,尝试的第一步是增加迭代次数。但是,这在这里不起作用,因为该功能不希望(数字上)集成。

这个功能出了什么问题?这是一个更简单的函数,具有相同的行为:

def fint(phi):
    return 1/phi

这可能会让问题更加明显:在phi = 0处有一个极点(函数返回inf)。无论我们使用多少次迭代,越接近0,总会有越来越大的值。

如果我们没有在积分范围内包含极点,则没有警告:

res, err = integrate.quadrature(fint, 0.5, 1, maxiter=100)
print("The numerical result is {:f} (+-{:g})".format(res, err))
  

数值结果为0.693147(+ -6.53485e-10)

(看看错误有多小?)

关于“最新差异=南”的原始警告还有一个微妙之处。这表明您的复杂函数会生成nan个值。这通常是计算类似0/0,inf / inf,inf - inf,...

的结果

我们可以用另一个简单的函数重现这个:

def fint(phi):
    return phi/phi

这基本上是一个常数值,在phi = 0时具有微小的丑陋。

res, err = integrate.quadrature(fint, -1, 1, maxiter=100)
print("The numerical result is {:f} (+-{:g})".format(res, err))
  

数值结果为2.000000(+ -nan)

     

RuntimeWarning:在true_divide中遇到无效值     返回phi / phi

     

AccuracyWarning:超过maxiter(100)。最新差异= nan

要将其包装起来,并非每个功能都可以在任何范围内集成。并非所有可集成的功能都适用于数值积分。