如何在Python中的scipy.integrate.quad中使用参数epsabs



我试图通过为scipy.integrate.quad指定参数epsabs来更精确地计算积分,比如说我们正在将函数sin(x(/x^2从1e-16积分到1.0

from scipy.integrate import quad
import numpy
integrand = lambda x: numpy.sin(x) / x ** 2
integral = quad(integrand, 1e-16, 1.0)

这给了我们

(36.760078801255595, 0.01091187908038005)

为了使结果更加精确,我们通过epsabs指定绝对误差容限

from scipy.integrate import quad
import numpy
integrand = lambda x: numpy.sin(x) / x ** 2
integral = quad(integrand, 1e-16, 1.0, epsabs = 1e-4)

结果完全相同,误差仍然高达0.0109!我是否理解参数epsabs错误?我应该采取什么不同的方法来提高积分的精度?

根据scipy手动quad函数有limit参数来指定

自适应算法中使用的子区间数的上限。

默认情况下,limit的值为50。您的代码返回警告信息

quadpack.py:364:集成警告:细分(50(已经实现。如果增加极限收益没有改进建议分析被积函数以便确定困难。如果局部困难的位置可以确定(奇异性、不连续性(分割间隔并调用积分器获得的增益子范围。也许应该使用一个特殊用途的积分器
警告.warn(消息,集成警告(

您必须更改limit参数,即:

from scipy.integrate import quad
import numpy
integrand = lambda x: numpy.sin(x) / x ** 2
print(quad(integrand, 1e-16, 1.0, epsabs = 1e-4, limit=100))

输出:

(36.76007877611414,3.635057215414274e-05(

输出中没有警告消息。细分次数小于100,quad达到了要求的精度。

相关内容

  • 没有找到相关文章

最新更新