【数值分析——插值法】牛顿插值多项式及Matlab实现

2024-06-04 7247阅读
  • 牛顿多项式插值法(Newton polynomial interpolation)
    • 算法思想及公式定义

      对于要插值的数据点,如果是只存在一对数据点,即 ( x 0 , y 0 ) \left(x_{0},y_{0}\right) (x0​,y0​) ,那么插值多项式显然为:

      f 0 ( x ) = y 0 f_{0}\left(x\right)=y_{0} f0​(x)=y0​

      其中, a 0 = y 0 a_{0}=y_{0} a0​=y0​

      如果现在我们新增一个数据点 ( x 1 , y 1 ) \left(x_{1},y_{1}\right) (x1​,y1​) ,那么,插值多项式的图像就是经过这两个点 ( x 0 , y 0 ) 、 ( x 1 , y 1 ) \left(x_{0},y_{0}\right)、\left(x_{1},y_{1}\right) (x0​,y0​)、(x1​,y1​) 的直线,不难得到插值函数为:

      f 1 ( x ) = y 0 + a 1 ⋅ ( x − x 0 ) f_{1}\left(x\right)=y_{0}+a_{1}\cdot \left(x-x_{0}\right) f1​(x)=y0​+a1​⋅(x−x0​)

      带入 f 1 ( x 1 ) = y 1 f_{1}\left(x_{1}\right)=y_{1} f1​(x1​)=y1​ 可得, a 1 = y 1 − y 0 x 1 − x 0 a_{1}=\frac{y_{1}-y_{0}}{x_{1}-x_{0}} a1​=x1​−x0​y1​−y0​​

      现在,我们在新增一个数据点 ( x 2 , y 2 ) \left(x_{2},y_{2}\right) (x2​,y2​) ,还是写成之前的 f 1 ( x ) f_{1}\left(x\right) f1​(x) 的形式,即:

      f 2 ( x ) = y 0 + y 1 − y 0 x 1 − x 0 ⋅ ( x − x 0 ) + a 2 ⋅ ( x − x 0 ) ⋅ ( x − x 1 ) f_{2}\left(x\right)=y_{0}+\frac{y_{1}-y_{0}}{x_{1}-x_{0}}\cdot \left(x-x_{0}\right)+a_{2}\cdot \left(x-x_{0}\right)\cdot \left(x-x_{1}\right) f2​(x)=y0​+x1​−x0​y1​−y0​​⋅(x−x0​)+a2​⋅(x−x0​)⋅(x−x1​)

      带入 f 2 ( x 2 ) = y 2 f_{2}\left(x_{2}\right)=y_{2} f2​(x2​)=y2​ 可得, a 2 = y 2 − y 0 x 2 − x 0 − y 1 − y 0 x 1 − x 0 x 2 − x 1 a_{2}=\frac{\frac{y_{2}-y_{0}}{x_{2}-x_{0}}-\frac{y_{1}-y_{0}}{x_{1}-x_{0}}}{x_{2}-x_{1}} a2​=x2​−x1​x2​−x0​y2​−y0​​−x1​−x0​y1​−y0​​​

      我们可以看到,每增加一个数据点后,我们只需要对之前的插值多项式做一个修正即可,即增加一项。如果我们可以求出 a i a_{i} ai​ ,那么我们就能求出新增数据点之后的插值多项式。

      根据上面的分析,我们定义牛顿插值多项式为:

      f n ( x ) = a 0 + a 1 ⋅ ( x − x 0 ) + a 2 ⋅ ( x − x 0 ) ⋅ ( x − x 1 ) + ⋯ + a n ⋅ ( x − x 0 ) ⋅ ( x − x 1 ) ⋯ ( x − x n − 1 ) f_{n}\left(x\right)=a_{0}+a_{1}\cdot \left(x-x_{0}\right)+a_{2}\cdot \left(x-x_{0}\right)\cdot \left(x-x_{1}\right)+\cdots +a_{n}\cdot \left(x-x_{0}\right)\cdot \left(x-x_{1}\right)\cdots \left(x-x_{n-1}\right) fn​(x)=a0​+a1​⋅(x−x0​)+a2​⋅(x−x0​)⋅(x−x1​)+⋯+an​⋅(x−x0​)⋅(x−x1​)⋯(x−xn−1​)

      其中, a n ( n = 0 , 1 , 2 ⋯ n ) a_{n}\left(n=0,1,2\cdots n\right) an​(n=0,1,2⋯n) 为待定系数。

    • 商差(均差)的概念及性质

      自变量之差与因变量之差叫做商差,函数 y = f ( x ) y=f\left(x\right) y=f(x) 在区间 [ x i , x i + 1 ] \left[x_{i},x_{i+1}\right] [xi​,xi+1​] 的平均变化率:

      f [ x i , x i + 1 ] = f ( x i + 1 ) − f ( x i ) x i + 1 − x i f\left[x_{i},x_{i+1}\right]=\frac{f\left(x_{i+1}\right)-f\left(x_{i}\right)}{x_{i+1}-x_{i}} f[xi​,xi+1​]=xi+1​−xi​f(xi+1​)−f(xi​)​

      称为 f ( x ) f\left(x\right) f(x) 关于 x i , x i + 1 x_{i},x_{i+1} xi​,xi+1​ 的一阶差商,并记为 f [ x i , x i + 1 ] f\left[x_{i},x_{i+1}\right] f[xi​,xi+1​] 。

      同理可得,二阶商差为:

      f [ x i , x i + 1 , x i + 2 ] = f [ x i + 1 , x i + 2 ] − f [ x i , x i + 1 ] x i + 2 − x i f\left[x_{i},x_{i+1},x_{i+2}\right]=\frac{f\left[x_{i+1},x_{i+2}\right]-f\left[x_{i},x_{i+1}\right]}{x_{i+2}-x_{i}} f[xi​,xi+1​,xi+2​]=xi+2​−xi​f[xi+1​,xi+2​]−f[xi​,xi+1​]​

      ⋮ \vdots ⋮

      m阶商差为:

      f [ x 0 , x 1 , x 2 , ⋯   , x m ] = f [ x 1 , x 2 , ⋯   , x m ] − f [ x 0 , x 1 , ⋯   , x m − 1 ] x m − x 0 f\left[x_{0},x_{1},x_{2},\cdots,x_{m}\right]=\frac{f\left[x_{1},x_{2},\cdots,x_{m}\right]-f\left[x_{0},x_{1},\cdots,x_{m-1}\right]}{x_{m}-x_{0}} f[x0​,x1​,x2​,⋯,xm​]=xm​−x0​f[x1​,x2​,⋯,xm​]−f[x0​,x1​,⋯,xm−1​]​

    • 商差表

      x i x_{i} xi​ f ( x i ) f\left(x_{i}\right) f(xi​) f [ x i , x i + 1 ] f\left[x_{i},x_{i+1}\right] f[xi​,xi+1​] f [ x i , x i + 1 , x i + 2 ] f\left[x_{i},x_{i+1},x_{i+2}\right] f[xi​,xi+1​,xi+2​] f [ x i , x i + 1 , x i + 2 , x i + 3 ] f\left[x_{i},x_{i+1},x_{i+2},x_{i+3}\right] f[xi​,xi+1​,xi+2​,xi+3​] ⋯ \cdots ⋯
      x 0 x_{0} x0​ f ( x 0 ) f\left(x_{0}\right) f(x0​)--- ⋯ \cdots ⋯
      x 1 x_{1} x1​ f ( x 1 ) f\left(x_{1}\right) f(x1​) f [ x 0 , x 1 ] f\left[x_{0},x_{1}\right] f[x0​,x1​]-- ⋯ \cdots ⋯
      x 2 x_{2} x2​ f ( x 2 ) f\left(x_{2}\right) f(x2​) f [ x 1 , x 2 ] f\left[x_{1},x_{2}\right] f[x1​,x2​] f [ x 0 , x 1 , x 2 ] f\left[x_{0},x_{1},x_{2}\right] f[x0​,x1​,x2​]- ⋯ \cdots ⋯
      x 3 x_{3} x3​ f ( x 3 ) f\left(x_{3}\right) f(x3​) f [ x 2 , x 3 ] f\left[x_{2},x_{3}\right] f[x2​,x3​] f [ x 1 , x 2 , x 3 ] f\left[x_{1},x_{2},x_{3}\right] f[x1​,x2​,x3​] f [ x 0 , x 1 , x 2 , x 3 ] f\left[x_{0},x_{1},x_{2},x_{3}\right] f[x0​,x1​,x2​,x3​] ⋯ \cdots ⋯
      ⋮ \vdots ⋮ ⋮ \vdots ⋮ ⋮ \vdots ⋮ ⋮ \vdots ⋮ ⋮ \vdots ⋮ ⋱ \ddots ⋱
    • 插值余项

      定义:若在 [ a , b ] \left[a,b\right] [a,b] 上用 L n ( x ) L_{n}\left(x\right) Ln​(x) 近似 f ( x ) f\left(x\right) f(x) ,则其截断误差为 R n ( x ) = f ( x ) − L n ( x ) R_{n}\left(x\right)=f\left(x\right)-L_{n}\left(x\right) Rn​(x)=f(x)−Ln​(x) ,也称为插值多项式的余项。

      • 牛顿插值多项式的余项

        根据均差的定义:

        f [ x 0 , x 1 , x 2 , ⋯   , x m ] = f [ x 1 , x 2 , ⋯   , x m ] − f [ x 0 , x 1 , ⋯   , x m − 1 ] x m − x 0 f\left[x_{0},x_{1},x_{2},\cdots,x_{m}\right]=\frac{f\left[x_{1},x_{2},\cdots,x_{m}\right]-f\left[x_{0},x_{1},\cdots,x_{m-1}\right]}{x_{m}-x_{0}} f[x0​,x1​,x2​,⋯,xm​]=xm​−x0​f[x1​,x2​,⋯,xm​]−f[x0​,x1​,⋯,xm−1​]​

        f [ x , x 0 , x 1 , ⋯   , x m − 1 ] = f [ x 0 , x 1 , x 2 , ⋯   , x m ] + f [ x , x 0 , x 1 , ⋯   , x m ] ⋅ ( x − x m ) f\left[x,x_{0},x_{1},\cdots,x_{m-1}\right]=f\left[x_{0},x_{1},x_{2},\cdots,x_{m}\right]+f\left[x,x_{0},x_{1},\cdots,x_{m}\right]\cdot \left(x-x_{m}\right) f[x,x0​,x1​,⋯,xm−1​]=f[x0​,x1​,x2​,⋯,xm​]+f[x,x0​,x1​,⋯,xm​]⋅(x−xm​)

        ⋮ \vdots ⋮

        f [ x , x 0 ] = f [ x 0 , x 1 ] + f [ x , x 0 , x 1 ] ⋅ ( x − x 1 ) f\left[x,x_{0}\right]=f\left[x_{0},x_{1}\right]+f\left[x,x_{0},x_{1}\right]\cdot \left(x-x_{1}\right) f[x,x0​]=f[x0​,x1​]+f[x,x0​,x1​]⋅(x−x1​)

        f ( x ) = f ( x 0 ) + f [ x , x 0 ] ⋅ ( x − x 0 ) f\left(x\right)=f\left(x_{0}\right)+f\left[x,x_{0}\right]\cdot \left(x-x_{0}\right) f(x)=f(x0​)+f[x,x0​]⋅(x−x0​)

        把前一式代入后一式中,就可以得到:

        f ( x ) = f ( x 0 ) + f [ x , x 0 ] ⋅ ( x − x 0 ) + f [ x , x 0 , x 1 ] ⋅ ( x − x 0 ) ⋅ ( x − x 1 ) + ⋯ + f [ x 0 , x 1 , ⋯   , x n ] ⋅ ( x − x 0 ) ⋯ ( x − x n − 1 ) + f [ x , x 0 , x 1 , ⋯   , x n ] ⋅ w n + 1 ( x ) f\left(x\right)=f\left(x_{0}\right)+f\left[x,x_{0}\right]\cdot \left(x-x_{0}\right)+f\left[x,x_{0},x_{1}\right]\cdot \left(x-x_{0}\right)\cdot\left(x-x_{1}\right)+\cdots +f\left[x_{0},x_{1},\cdots,x_{n}\right]\cdot \left(x-x_{0}\right)\cdots \left(x-x_{n-1}\right)+f\left[x,x_{0},x_{1},\cdots,x_{n}\right]\cdot w_{n+1}\left(x\right) f(x)=f(x0​)+f[x,x0​]⋅(x−x0​)+f[x,x0​,x1​]⋅(x−x0​)⋅(x−x1​)+⋯+f[x0​,x1​,⋯,xn​]⋅(x−x0​)⋯(x−xn−1​)+f[x,x0​,x1​,⋯,xn​]⋅wn+1​(x)

        其中,

        P n [ x ] = f ( x 0 ) + f [ x , x 0 ] ⋅ ( x − x 0 ) + f [ x , x 0 , x 1 ] ⋅ ( x − x 0 ) ⋅ ( x − x 1 ) + ⋯ + f [ x 0 , x 1 , ⋯   , x n ] ⋅ ( x − x 0 ) ⋯ ( x − x n − 1 ) P_{n}\left[x\right]=f\left(x_{0}\right)+f\left[x,x_{0}\right]\cdot \left(x-x_{0}\right)+f\left[x,x_{0},x_{1}\right]\cdot \left(x-x_{0}\right)\cdot\left(x-x_{1}\right)+\cdots +f\left[x_{0},x_{1},\cdots,x_{n}\right]\cdot \left(x-x_{0}\right)\cdots \left(x-x_{n-1}\right) Pn​[x]=f(x0​)+f[x,x0​]⋅(x−x0​)+f[x,x0​,x1​]⋅(x−x0​)⋅(x−x1​)+⋯+f[x0​,x1​,⋯,xn​]⋅(x−x0​)⋯(x−xn−1​)

        w n + 1 ( x ) = ( x − x 0 ) ⋅ ( x − x 1 ) ⋯ ( x − x n ) w_{n+1}\left(x\right)=\left(x-x_{0}\right)\cdot \left(x-x_{1}\right)\cdots \left(x-x_{n}\right) wn+1​(x)=(x−x0​)⋅(x−x1​)⋯(x−xn​)

        P n ( x ) P_{n}\left(x\right) Pn​(x) 是近似 f ( x ) f\left(x\right) f(x) 的插值多项式,前面也推导出了

        f ( x ) = P n ( x ) + R n ( x ) f\left(x\right)=P_{n}\left(x\right)+R_{n}\left(x\right) f(x)=Pn​(x)+Rn​(x)

        所以有

        f ( x ) − P n ( x ) = R n ( x ) f\left(x\right)-P_{n}\left(x\right)=R_{n}\left(x\right) f(x)−Pn​(x)=Rn​(x)

        那么插值余项为:

        R n ( x ) = f [ x , x 0 , x 1 , ⋯   , x n ] ⋅ w n + 1 ( x ) R_{n}\left(x\right)=f\left[x,x_{0},x_{1},\cdots,x_{n}\right]\cdot w_{n+1}\left(x\right) Rn​(x)=f[x,x0​,x1​,⋯,xn​]⋅wn+1​(x)

      • Matlab实现(只实现了插值函数,测试函数同前面的拉格朗日插值的测试)

        function y=newton(x0,y0,x)
        %   Newton插值函数
        %   x0为已知数据点的x坐标
        %   y0为已知数据点的y坐标
        %   x为插值点的x坐标
        %   y为各插值点函数值
        % 获取数据点的个数
        n=length(x0);
        % 判断输入信息x0和y0的信息正确
        if n~=length(y0)
            error('维数不等');
        else
        % 获取要预测插值点的个数
        m=length(x);
        % 初始化y值,并幅值为0,向量维度为m
        y=zeros(1,m);
        % 初始化A-->代表均差表,可参考均差表的形式来理解代码的实现
        A=zeros(n,n);
        A(:,1)=y0;
        for j=2:n
            for i=j:n
                A(i,j)=(A(i,j-1)-A(i-1,j-1))/(x0(i)-x0(i-j+1));
            end
        end
        % 求整个插值函数
        for i=1:n
            % 定义中间变量p
            p=1.0;
            for j=1:i-1
                p=p.*(x-x0(j));
            end
            y=y+A(i,i)*p;
        end
        end
        
        • 关于代码中A矩阵实现的由来

          【数值分析——插值法】牛顿插值多项式及Matlab实现 第1张

        • 结果分析

          根据原理分析,牛顿插值多项式是插值多项式 P ( x ) P\left(x\right) P(x) 的另一种表示形式,与Lagrange多项式相比,它不仅克服了增加一个节点时整个计算工作重新开始的缺点, 且可以节省乘除法运算次数。

          • Matlab对于sin函数的插值结果

            【数值分析——插值法】牛顿插值多项式及Matlab实现 第2张

            【数值分析——插值法】牛顿插值多项式及Matlab实现 第3张

            【数值分析——插值法】牛顿插值多项式及Matlab实现 第4张

            但是根据Matlab实现的计算结果来看,lagrange插值和newton插值的结果并不一样,这和之前推导出来的唯一性相违背,那么到底哪儿应该是正确的呢?为了寻找答案,我翻遍了网上的资料,以及看了我的Matlab代码实现,发现好像都没有什么问题,那么为什么会出现这种问题呢,难道真的是前面的多项式插值的唯一性存在错误吗?

            直到我一步步的将前面的实现过程在matlab的命令行敲出来,然后观察每个变量的具体数值的时候发现了如下图所示:

            【数值分析——插值法】牛顿插值多项式及Matlab实现 第5张

            发现了什么,随着不断地计算,后面的项目全部趋近于0,直到全为0。看到这儿,我豁然开朗,这不就是前面提到的(数值分析第一章讲的)截断误差吗!就是这个截断误差,导致了两种插值方法的结果相差这么大!

            所以,虽然newton插值每增加一个节点,只需要修正插值多项值得一项,但是,在计算机计算的过程中,其截断误差也会随着项得不断增多而不断得增大。


    免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

    目录[+]