我试图用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
会发出警告:“积分可能发散,或缓慢收敛。警告。警告(消息,集成警告)'。那么这仅仅是一个错误的函数选择的例子吗?注意这不是实际的函数,而是一个似乎给出了类似(但不完全相同)行为的函数。在
警告基本上意味着迭代次数不足以在期望的公差内找到解决方案。因此,第一步是增加迭代次数。但是,这在这里不起作用,因为函数不想被(数值)积分。在
这个功能有什么问题?下面是一个具有相同行为的更简单的函数:
这可以使问题更清楚地看到:在phi=0处有一个极点(函数返回
inf
)。无论我们使用多少次迭代,越接近0,值总是越大。在如果我们不将磁极纳入积分范围,则不会发出警告:
^{pr2}$(看看误差有多小?)在
关于最初关于“Latest difference=nan”的警告,还有一个微妙之处。这表示复杂的函数产生
nan
值。这通常是计算0/0,inf/inf,inf-inf。。。在我们可以用另一个简单的函数重现:
^{3}$丑陋基本上是一个很小的值。在
总而言之,并不是每个函数都可以在任何范围内集成。并不是所有可以积分的函数都适合数值积分。在
相关问题 更多 >
编程相关推荐