1. 背景知识
梯形积分公式其实和矩形积分公式类似,只是前面在采用矩形积分公式时,使用的是中点处的纵坐标作为矩形的高,而在梯形积分公式中,使用的是边界上两个点的高度,作为直角梯形的上底和下底,然后横坐标的差作为梯形的高,其近视积分为:
可以看到,如果对于线性函数,这种算法是精确的。
2. 梯形积分
实现如下:
def trapezoidal(f,a,b):
"""
Trapezoidal rule for
numerical integration of f(x) from a to b.
"""
return (b-a)*(f(a)+f(b))/2
如果使用humps函数在上对积分进行近似,结果如下图所示:
这个误差太大了,基本上只有实际积分值的一半。
3. 复合梯形积分
为了解决上述问题,还可以和前面的复合矩形积分法则类似,将一个大的区间分成多个等距的小区间,然后,在每个小区间内使用梯形法则,显然对于具有(N+1)个等分点的区间,其公式为:
实现算法为:
def comp_trapezoidal(f,a,b,N):
x=np.linspace(a,b,N)
h=x[1]-x[0]
y=np.vectorize(f)(x)
return h*sum(y[1:-1])+h/2*(y[0]+y[-1])
将区间等分为N个点的数值积分效果如下:
可见随着划分次数的增加,其误差也在逐渐缩小。
PS:大家程序员节快乐。