估计曲线下的面积

在关于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程序中用来计算这个和的策略。

  1. 首先使用numpy linspace函数来构造点集x0 = 一个xN1 = b - h以大小为步h
  2. 使用numpy向量函数求值方法来计算f(x)在这些点上的值。赢博体育这些值都乘以2。
  3. 接下来,我们将赢博体育这些样本点向右移动h/2然后计算f(x)在每个移动点处的值。赢博体育这些值都乘以4。
  4. 如果我们把步骤2和3中计算的赢博体育值加起来,我们就会得到我们想要的和。我们唯一需要调整的是求和公式中的第一个和最后一个条目。我们最终会得到一个看起来像2的项fx0)而不是fx0)我们想要在和的开始,最后我们将没有项fxN)。我们可以通过加法来解决这些问题fb) -f一个)到我们的总和。
  5. 然后我们把最后的和乘以h/6得到估计的面积。

下面是完全实现辛普森规则的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程序的存档文件。