正交积分精度和SCINAN警告值

2024-04-26 23:56:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图用scipy.积分.求积,并抛出精度警告,“最新差异”值为(gulp)nan:

'C:\Program Files\Anaconda3\lib\site packages\scipy\integrate\正交。py:199:精度警告:超过最大值(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会发出警告:“积分可能发散,或缓慢收敛。警告。警告(消息,集成警告)'。那么这仅仅是一个错误的函数选择的例子吗?注意这不是实际的函数,而是一个似乎给出了类似(但不完全相同)行为的函数。在


Tags: 函数警告returndef精度resscipy差异
1条回答
网友
1楼 · 发布于 2024-04-26 23:56:31

警告基本上意味着迭代次数不足以在期望的公差内找到解决方案。因此,第一步是增加迭代次数。但是,这在这里不起作用,因为函数不想被(数值)积分。在

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

def fint(phi):
    return 1/phi

这可以使问题更清楚地看到:在phi=0处有一个极点(函数返回inf)。无论我们使用多少次迭代,越接近0,值总是越大。在

如果我们不将磁极纳入积分范围,则不会发出警告:

^{pr2}$

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

(看看误差有多小?)在

关于最初关于“Latest difference=nan”的警告,还有一个微妙之处。这表示复杂的函数产生nan值。这通常是计算0/0,inf/inf,inf-inf。。。在

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

^{3}$

丑陋基本上是一个很小的值。在

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

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

相关问题 更多 >