我试图通过为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
达到了要求的精度。