牛顿-科特斯(Newton-Cotes)数值积分学习笔记

微积分是我们数学领域一个强大的工具,科学研究领域乃至生活中的方方面面都渗透着微积分的思想。
学过高等数学的我们都知道,对于 I = ∫ a b f ( x ) {\color{Blue} I=\int_{a}^{b}f(x)} I=abf(x)这样一个定积分,运用牛顿-莱布尼兹公式(Newton-Leibniz formula) ∫ a b f ( x ) = F ( b ) − F ( a ) \int_{a}^{b}f(x)=F(b)-F(a) abf(x)=F(b)F(a)可以很方便快捷地求解一些较为简单的连续性问题。但现实中,大多数问题都是离散地、非连续地,我们没法通过代数手段找到被积函数所对应的原函数。因此, 数 值 积 分 \color{Blue}{数值积分} 成了我们求解积分问题的一个有力手段。
积分中值定理大家想必很熟悉了:若函数 f ( x ) \color{Blue}{f(x)} f(x)在闭区间 [ a , b ] \color{Blue}{[a,b]} [a,b]上连续,则在积分区间上至少存在一个点 ξ \color{Blue}{\xi} ξ,使下式成立
∫ a b f ( x ) = ( b − a ) f ( ξ ) {\color{Blue} \int_{a}^{b}f(x)=(b-a)f(\xi )} abf(x)=(ba)f(ξ)
在这里插入图片描述
这个定理的几何意义便是: 存 在 一 个 矩 形 , 其 面 积 与 连 续 曲 线 与 坐 标 轴 所 围 成 的 封 闭 图 形 的 面 积 相 等 \color{#00F}{存在一个矩形,其面积与连续曲线与坐标轴所围成的封闭图形的面积相等} 线
也就是说,当我们能找到这一点 ξ \color{Blue}{\xi} ξ时及其对应的 f ( ξ ) \color{Blue}{f(\xi)} f(ξ)时,被积函数在一段区间上的积分值就转化成了某一点的函数值与一个定值常数的乘积。这样一来,原来的积分仿佛被一种数值形式所取代,数值积分便由此有了雏形。这便是所谓的离散化思想。 相应地,可以简单定义这种普遍存在的数值形式: ∫ a b f ( x ) = A i f ( x i ) \color{#00F}{\int_{a}^{b}f(x)=A_{i}f(x_{i})} abf(x)=Aif(xi)
这里, f ( x i ) \color{Blue}{f(x_i)} f(xi)表示某点函数值, A i \color{Blue}{A_i} Ai代表该函数值对应权重。

然而, ξ \color{Blue}{\xi} ξ是多少, f ( ξ ) \color{Blue}{f(\xi)} f(ξ)又是多少,我们现在凭借以上并不能确定,于是牛顿-科特斯(Newton-Cotes)公式将逐步求解出我们的这些疑惑。
首先思考的问题便是怎么求解出这些所谓的权重,观察上述式子,注意到左边为积分项,右边为数值项,考虑是否也能将左半部分的积分项也化成数值项的形式,我们将用到拉格朗日插值(Lagrange Interpolation Polynomial)。

拉格朗日插值

对于某个未知的函数,已知该函数上一系列未知的散点 ( x 0 , y 0 ) , ( x 1 , x 1 ) , ⋯   , ( x n , y n ) {\color{Blue} \left ( x_{0},y_{0}\right ),\left ( x_{1},x_{1}\right ),\cdots ,\left ( x_{n},y_{n}\right )} (x0,y0),(x1,x1),,(xn,yn)
定义基函数: l i ( x ) = ( x − x 0 ) ⋯ ( x − x i − 1 ) ( x − x i + 1 ) ⋯ ( x − x n ) ( x i − x 0 ) ⋯ ( x i − x i − 1 ) ( x i − x i + 1 ) ⋯ ( x i − x n ) {\color{Blue} l_{i}(x)=\frac{(x-x_{0})\cdots(x-x_{i-1}) (x-x_{i+1})\cdots (x-x_{n})}{(x_i-x_{0})\cdots(x_i-x_{i-1}) (x_i-x_{i+1})\cdots (x_i-x_{n})}} li(x)=(xix0)(xixi1)(xixi+1)(xixn)(xx0)(xxi1)(xxi+1)(xxn) = ∏ j = 0 , j ≠ i n x − x j x i − x j , j = 0 , 1 , 2 , ⋯   , n =\prod_{j=0,j\neq i}^{n}\frac{x-x_{j}}{x_{i}-x_{j}},j=0,1,2,\cdots ,n =j=0,j=inxixjxxj,j=0,1,2,,n
该函数所满足的就是在散点 x = x i \color{Blue}{x=x_i} x=xi处, l i ( x ) = 1 \color{Blue}{l_i(x)=1} li(x)=1,而其他点 x j \color{Blue}{x_j} xj处均为 0 \color{Blue}{0} 0.
于是,拉格朗日插值函数:
L n ( x ) = ∑ i = 0 n y i l i ( x ) {\color{Blue} L_{n}(x)=\sum_{i=0}^{n}y_{i}l_{i}(x)} Ln(x)=i=0nyili(x)
从而巧妙地用函数的形式刻画了这种 曲 线 经 过 固 定 点 \color{#0F0}{曲线经过固定点} 线现象。
这里,参考MATLAB之拉格朗日插值

function y=Lagrange1(x0,y0)
syms x

for i=1:length(x0)
  x0_=x0;
    x0_(i)=[];
    a{i}=-x0_+x0(i);
    b=-x0_+x;
    l(i)=prod(b)/prod(a{i}); x0_=x0;
end
for i=1:length(x0)
    L(i)=y0(i)*l(i);
end
Ln=sym2poly(expand(sum(L)));
xx=x0(1):0.1:x0(end);
y=polyval(Ln,xx);
Y1=interp1(x0,y0,xx,'spline');
Y2=interp1(x0,y0,xx,'nearest');
plot(x0,y0,'r*','LineWidth',2);hold on
plot(xx,Y1,'LineWidth',2);
plot(xx,y,'LineWidth',2);
plot(xx,Y2,'LineWidth',2);hold off
xlabel('x');ylabel('y');
legend('data','spline','Lagrange Interpolation Polynomial','nearest')

这里我们进行了对同一组数据点拉格朗日插值和最近项插值以及样条线插值的绘制,可以发现拉格朗日插值与样条曲线已大致合为一体。

在这里插入图片描述
有了以上的知识储备,我们可以对 f ( x ) \color{Blue}{f(x)} f(x)进行插值运算,化其为
离散多项式,即:
f ( x ) = L n ( x ) = ∑ i = 0 n y i l i ( x ) {\color{Blue} f(x)=L_{n}(x)=\sum_{i=0}^{n}y_{i}l_{i}(x)} f(x)=Ln(x)=i=0nyili(x)
于是, ∫ a b f ( x ) d x = ∫ a b ∑ i = 0 n y i l i ( x ) d x = ∫ a b ∑ i = 0 n f i ( x ) l i ( x ) d x = ∑ i = 0 n f i ( x ) ∫ a b l i ( x ) d x \color{#00F}{\int_{a}^{b}f(x)dx=\int_{a}^{b}\sum_{i=0}^{n}y_{i}l_{i}(x)dx=\int_{a}^{b}\sum_{i=0}^{n}f_{i}(x)l_{i}(x)dx=\sum_{i=0}^{n}f_{i}(x)\int_{a}^{b}l_{i}(x)dx} abf(x)dx=abi=0nyili(x)dx=abi=0nfi(x)li(x)dx=i=0nfi(x)abli(x)dx
∫ a b l i ( x ) d x = A i = ∫ a b ∏ j = 0 , j ≠ i n x − x j x i − x j d x (1) \color{#00F}{\int_{a}^{b}l_{i}(x)dx}=A_i=\int_{a}^{b}\prod_{j=0,j\neq i}^{n}\frac{x-x_{j}}{x_{i}-x_{j}}dx\tag 1 abli(x)dx=Ai=abj=0,j=inxixjxxjdx(1)
这样求积公式便由最初的 ∫ a b f ( x ) = A i f ( x i ) \color{#00F}{\int_{a}^{b}f(x)=A_{i}f(x_{i})} abf(x)=Aif(xi)转化成了更具有一般规律的
∫ a b f ( x ) = ∑ i = 0 n A i f ( x i ) \color{#00F}{\int_{a}^{b}f(x)=\sum_{i=0}^{n}A_{i}f(x_{i})} abf(x)=i=0nAif(xi)
观察上述 ( 1 ) (1) (1)式,任意未知函数的积分形式将演化为幂函数的积分形式,无论从那种角度来说,幂函数的积分将大大简化积分繁琐性。
根据之前的拉格朗日插值函数,我们可在此基础上求解牛顿-科特斯(Newton-Cotes)数值积分。

function y=Newton_Cotes(x0,y0,qa,qb)
syms x
for i=1:length(x0)
  x0_=x0;
    x0_(i)=[];
    a{i}=-x0_+x0(i);
    b=-x0_+x;
    l(i)=prod(b)/prod(a{i});
    A(i)=int(l(i),qa,qb);
    x0_=x0;
end
%这里用于定义步长,不同步长将有不同求解精度
% 步长=(x(end)-x(1))/1-------一阶---------梯形公式
%步长=(x(end)-x(1))/2-------二阶----------辛普森求解公式
%步长=(x(end)-x(1))/4-------四阶----------科斯特公式

for i=1:length(x0)
    I(i)=y0(i)*A(i);
end
y=eval(sum(I));

我们用以上定义的 f u n c t i o n y = N e w t o n C o t e s ( x 0 , y 0 , q a , q b ) function y=NewtonCotes(x0,y0,qa,qb) functiony=NewtonCotes(x0,y0,qa,qb)分别测试了一次函数、二次函数、正弦均得到问题的精确值
二次抛物线: y = x 2 \color{#00F}{y=x^2} y=x2
列些曲线上的任意点 x 0 = [ 1 , 2 , 3 ] , y 0 = [ 1 , 4 , 9 ] \color{#00F}{x0=[1 ,2 ,3],y0=[1 ,4 ,9]} x0=[1,2,3]y0=[1,4,9]
MATLAB求解 ∫ 1 4 x 2 = ∑ i = 0 n A i f ( x i ) = N e w t o n C o t e s ( x 0 , y 0 , 1 , 4 ) \color{#00F}{\int_{1}^{4}x^2=\sum_{i=0}^{n}A_{i}f(x_{i})=NewtonCotes(x0,y0,1,4)} 14x2=i=0nAif(xi)=NewtonCotes(x0,y0,1,4)
计算结果为21为该问题的精确解答

考虑到 ( 1 ) (1) (1)幂函数积分项是否也能化为幂函数之和,于是将 [ a , b ] \color{#00F}{[a,b]} [a,b]区间划分成 n \color{#00F}{n} n等份,每份步长为 h = b − a 2 {\color{Red}h= \frac{b-a}{2}} h=2ba,数值积分点取 x i = a + k h , k = 0 , 1 , 2 , ⋯   , n {\color{Red} x_i=a+kh,k=0,1,2,\cdots ,n} xi=a+kh,k=0,1,2,,n
∫ a b l i ( x ) d x = A i = ∫ a b ∏ j = 0 , j ≠ i n x − x j x i − x j d x (1) \color{#00F}{\int_{a}^{b}l_{i}(x)dx}=A_i=\int_{a}^{b}\prod_{j=0,j\neq i}^{n}\frac{x-x_{j}}{x_{i}-x_{j}}dx\tag 1 abli(x)dx=Ai=abj=0,j=inxixjxxjdx(1)中令 x = a + t h \color{#00F}{x=a+th} x=a+th,于是:
A i = b − a n ( − 1 ) n − i i ! ( n − i ) ! ∫ 0 n ∏ j = 0 , j ≠ i n ( t − j ) d t , i = 0 , 1 , 2 , ⋯   , n {\color{Blue}A_i= \frac{b-a}{n}\frac{(-1)^{n-i}}{i!(n-i)!}\int_{0}^{n}\prod_{j=0,j\neq i}^{n}(t-j)dt,i=0,1,2,\cdots ,n} Ai=nbai!(ni)!(1)ni0nj=0,j=in(tj)dt,i=0,1,2,,n
C i = ( − 1 ) n − i n i ! ( n − i ) ! ∫ 0 n ∏ j = 0 , j ≠ i n ( t − j ) d t , i = 0 , 1 , 2 , ⋯   , n {\color{Blue}C_i= \frac{(-1)^{n-i}}{ni!(n-i)!}\int_{0}^{n}\prod_{j=0,j\neq i}^{n}(t-j)dt,i=0,1,2,\cdots ,n} Ci=ni!(ni)!(1)ni0nj=0,j=in(tj)dt,i=0,1,2,,n科斯特系数,显然科斯特系数与被积函数与积分区间均无关。

n \color{#00F}{n} n取1,2,4,该数值求积公式将分别转化成 梯 形 公 式 、 辛 普 森 公 式 、 科 斯 特 公 式 \color{#00F}{梯形公式、辛普森公式、科斯特公式} 在这里插入图片描述

得到的科斯特系数表:在这里插入图片描述

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐