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

scipy quadrature integration accuracy warning and nan difference values

我正在尝试使用 scipy.integration.quadrature 集成一个复杂的函数组合,它会抛出准确性警告,并且 'Latest difference' 值为 (gulp) nan:

'C:\Program Files\Anaconda3\lib\site-packages\scipy\integrate\quadrature.py:199: AccuracyWarning: maxiter (1000) exceeded. Latest difference = nan'

这个问题好像和这个post差不多,只是使用了不同的积分方式,参数也不一样

SciPy Quad Integration: Accuracy Warning

而不是 post 原始函数集,这里是一个更简单的函数示例,它也会引发警告,尽管此处的 'Latest difference' 值实际上是定义的数字。

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 会给出警告 'The integral is probably divergent, or slowly convergent. warnings.warn(msg, IntegrationWarning)'。那么这只是集成功能选择不当的情况吗?请注意,这不是实际的功能,而是一个似乎具有相似(但不相同)行为的功能。

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

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

def fint(phi):
    return 1/phi

这可能会使问题看得更清楚:在phi=0处有一个极点(函数returns inf)。无论我们使用多少次迭代,总会有越来越大的值越接近 0.

如果我们不将极点包含在积分范围内,则不会出现警告:

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

The numerical result is 0.693147 (+-6.53485e-10)

(看看误差有多小?)

关于 "Latest difference = nan" 的原始警告还有一个微妙之处。这表明您的复杂函数会产生 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))

The numerical result is 2.000000 (+-nan)

RuntimeWarning: invalid value encountered in true_divide return phi/phi

AccuracyWarning: maxiter (100) exceeded. Latest difference = nan

总而言之,并非每个功能都可以在任何范围内集成。而且并不是所有可以积分的函数都适合数值积分。