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
总而言之,并非每个功能都可以在任何范围内集成。而且并不是所有可以积分的函数都适合数值积分。
我正在尝试使用 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
总而言之,并非每个功能都可以在任何范围内集成。而且并不是所有可以积分的函数都适合数值积分。