在关于numpy的课上,我展示了一个用梯形法则计算曲线下面积的例子。今天我们要发展一种计算曲线下面积的改进方法,辛普森法则。
我们将要研究的赢博体育估算面积的方法都有相同的基本设置。我们试图在区间[a,b]上估计函数f(x)下的面积。我们通过使用除点xi将区间划分为N个子区间,宽度为h = (b-a)/N,其中x0 = a, xN = b, xi+1 = xi+ h。
梯形规则通过构造一条经过点(xi, f(xi))和(xi+1, f(xi+1))的直线,并使用该线在子区间上的下面积作为曲线下面积的近似值,来估计子区间[xi, xi+1]上曲线下的面积。
辛普森法则首先构造一个二次多项式,该多项式通过点(xi, f(xi)), (xi+ h/2, f(xi+ h/2))和(xi+ h, f(xi+ h)) = (xi+1, f(xi+1)),并使用多项式下的面积来估计曲线面积。构造多项式和计算多项式下的面积所涉及的代数计算有些涉及,因此我将使用sympy包来执行必要的代数计算。
我在Jupyter笔记本上做了这些计算。那本笔记本可以在这些笔记底部提供的档案中找到。这些计算证明了多项式下的面积是
将赢博体育这些面积估计值加在赢博体育子区间上,就得到了曲线下面积的估计值:
2和4个系数的交替模式加上两端1的系数使得这个和的计算有点棘手。下面是我在Python程序中用来计算这个和的策略。
下面是完全实现辛普森规则的Python程序:
这是我们将在这个例子中使用的函数def f(x):返回np.sqrt(4.0 - x*x) #使用辛普森规则#计算f(x)从a到b的积分#的近似值,步长为h = (b-a)/N def SimpsonArea(a,b,N): h = (b-a)/N x = np.linspace(a,b-h,N)返回h/3*(f(x).sum()) + 2*h/3*(f(x+h/2).sum()) -h *f(a)/6 +h *f(b)/6打印(“N错误”);for j in range(3,20,2): estimate = SimpsonArea(0.0,2.0,2**j) error = math.fabs(π-估计)打印(“{:> 7 d} {: g}”.format (2 * * j、错误))
为了说明辛普森规则作为N的函数的行为,这个程序计算了一系列不同N值的辛普森规则估计。
这是一个包含笔记本和python程序的存档文件。