Newton插值

Lagrange插值公式结构紧凑,在理论分析中甚为有用。但当插值节点增加、减少或其位置发生变化时,整个插值公式的结构也将发生变化,这在实际计算中非常不利。而Newton插值公式可以克服这个缺点,Newton插值多项式的公式为[大谦MATLAB,dqmatlab点com]

\[{L}_{n}(x)=f[{x}_{0}]+f[{x}_{0},{x}_{1}](x-{x}_{0})+\cdots+f[{x}_{0},{x}_{1},\cdots,{x}_{n}](x-{x}_{0})(x-{x}_{1})\cdots(x-{x}_{n-1})\]

公式中的f[x0,x1, …,xn]可以通过下面的公式计算得到。

\[f[{x}_{0},{x}_{1},\cdots,{x}_{k},{x}_{k+1}]=\frac{f(x,{x}_{0},{x}_{1},\cdots,{x}_{k-1},{x}_{k+1})-f(x,{x}_{0},{x}_{1},\cdots,{x}_{k-1},{x}_{k})}{x-{x}_{k+1}}\]

于是可以编写Newton插值法的M文件Newton.m,如下所示。

code.matlab
function s=Newton(x,y,x0,nn)
  % Newton插值,x与y为已知的插值点及其函数值
  % x0为要求的插值点的x坐标值。nn为Newton插值多项式的阶数
  nx=length(x);
  ny=length(y);
  if nx~=ny
      warning('向量x与y的长度应该相同')
      return
  end
  m=length(x0);
  % 按照公式,对要求的插值点x0的每个元素进行计算
  for i=1:m
      t=0.0;
      j=1;
      yy=y;
      kk=j;
      % 求各级均差
      while(kk<=nn)
          kk=kk+1;
          for k=kk:nx
              yy(k)=(yy(k)-yy(kk-1))/(x(k)-x(kk-1));
          end
      end
      % 求差值结果
      t=yy(1);
      for k=2:nn
          u=1.0;
          jj=1;
          while(jj<k)
              u=u*(x0(i)-x(jj));
              jj=jj+1;
          end
          t=t+yy(k)*u;
      end
      s(i)=t;
  end

【例13】利用Newton插值函数求解下列问题:

给定f(x)=shx在一系列指定X处的函数值,利用4次Newton插值多项式插值计算f(0.596)的近似值(见表4-2)。

表4-2 已知数据表

x 0.4 0.55 0.65 0.80 0.90 1.05
F(x) 0.41075 0.57815 0.69675 0.88811 1.02652 1.25382

用MATLAB实现,如下所示。

code.matlab
>> x=[0.4 0.55 0.65 0.8 0.9 1.05];
>> y=[0.41075 0.57815 0.69675 0.88811 1.02652 1.25382];
>> Newton(x,y,0.596,4)
ans =
    0.6319