为什么减小np.linspace的范围可以提高数值积分的精度?



阅读有关简单数值积分(https://helloacm.com/how-to-compute-numerical-integration-in-numpy-python/(的教程,这似乎表明减小函数中使用的x值的范围会返回更准确的数值答案。 使用的代码是

def integrate(f, a, b, N):
x = np.linspace(a, b, N)
fx = f(x)
area = np.sum(fx)*(b-a)/N
return area
integrate(np.sin, 0, np.pi/2, 100)

这将返回值 0.99783321217729803。

但是,当他们将集成方法修改为:

def integrate(f, a, b, N):
x = np.linspace(a+(b-a)/(2*N), b-(b-a)/(2*N), N)
fx = f(x)
area = np.sum(fx)*(b-a)/N
return area
integrate(np.sin, 0, np.pi/2, 100)

这将返回更准确的值 1.0000102809119051。 为什么会这样呢?

两件事:

  • 您第一个integrate中的步长宽度不是(b-a) / N,而是(b-a) / (N-1)

  • 在第一种方法中,误差主要由左右的半柱线过冲主导,即(b-a)/(N-1)/2 * f(a)(b-a)/(N-1)/2 * f(b)。如果减去这两个方法,则获得与第二种方法相当的准确性。