Python 为什么减小np.linspace的范围会提高数值积分的精度?
阅读关于简单数值积分()的教程,它似乎建议减少函数中使用的x值的范围,返回更精确的数值答案。使用的代码是Python 为什么减小np.linspace的范围会提高数值积分的精度?,python,numpy,numerical-integration,Python,Numpy,Numerical Integration,阅读关于简单数值积分()的教程,它似乎建议减少函数中使用的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
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。为什么会这样?有两件事:
- 第一个
集成中的步长不是
,而是(b-a)/N
(b-a)/(N-1)
- 在第一种方法中,误差主要由左右两侧的半条超调控制,即
和(b-a)/(N-1)/2*f(a)
。如果你把这两种方法相减,你会得到与第二种方法相当的准确度(b-a)/(N-1)/2*f(b)
区域计算中,你仍然使用(b-a)
,但是在第二种情况下,你的间隔中有更多的点采样范围与积分范围有何不同?我认为它们的意思是一样的。在第一种情况下,样本相对于集成箱的位置发生了变化。它从最左边的箱子的左端开始,以小步向右边移动。当到达最右边的箱子时,它将移动到最右边的箱子端。第二种情况是在每个箱子的中心取样。(这是二元线性被积函数的最佳位置。)