牛顿插值法在Matlab上的实现

文章目录

  • 一、均差及其性质
    • 1.均差的定义
    • 2.均差的性质
    • 3.均差表
  • 二、牛顿插值多项式
    • 1.牛顿插值多项式
  • 三、牛顿插值多项式在Matlab上的实现
    • 1.Matlab代码
    • 2.代码使用演示
  • 备注


一、均差及其性质

1.均差的定义

在开始介绍牛顿插值多项式之前,需要先引入均差的定义

定义 :称 f [ x 0 , x k ] = f ( x k ) − f ( x 0 ) x k − x 0 f[x_0,x_k]=\frac{f(x_k)-f(x_0)}{x_k-x_0} f[x0,xk]=xkx0f(xk)f(x0)为函数 f ( x ) f(x) f(x)关于点 x 0 x_0 x0, x k x_k xk一阶均差.

f [ x 0 , x 1 , x k ] = f [ x 0 , x k ] − f [ x 0 , x 1 ] x k − x 1 f[x_0,x_1,x_k]=\frac{f[x_0,x_k]-f[x_0,x_1]}{x_k-x_1} f[x0,x1,xk]=xkx1f[x0,xk]f[x0,x1]称为 f ( x ) f(x) f(x)二阶均差. 一般地,称 f [ x 0 , x 1 , ⋯   , x k ] = f [ x 0 , ⋯   , x k − 2 , x k ] − f [ x 0 , x 1 , ⋯   , x k − 1 ] x k − x k − 1 f[x_0,x_1,\cdots ,x_k]=\frac{f[x_0,\cdots ,x_{k-2},x_k]-f[x_0,x_1,\cdots,x_{k-1}]}{x_k-x_{k-1}} f[x0,x1,,xk]=xkxk1f[x0,,xk2,xk]f[x0,x1,,xk1] f ( x ) f(x) f(x) k \mathbf{k} k阶均差(均差也称为差商)。

2.均差的性质

(1) k k k阶均差可表示为函数值 f ( x 0 ) f(x_0) f(x0) f ( x 1 ) f(x_1) f(x1) ⋯ \cdots f ( x k ) f(x_k) f(xk)的线性组合,即 f [ x 0 , x 1 , ⋯   , x k ] = ∑ j = 0 k f ( x j ) ( x j − x 0 ) ⋯ ( x j − x j − 1 ) ( x j − x j + 1 ) ⋯ ( x j − x k ) f[x_0,x_1,\cdots ,x_k]=\sum_{j=0}^{k}\frac{f(x_j)}{(x_j-x_0)\cdots(x_j-x_{j-1})(x_j-x_{j+1})\cdots(x_j-x_k)} f[x0,x1,,xk]=j=0k(xjx0)(xjxj1)(xjxj+1)(xjxk)f(xj)可用归纳法证明此性质。这个性质也表明均差与节点的排列次序无关,称为均差的对称性,即 f [ x 0 , x 1 , ⋯   , x k ] = f [ x 1 , x 0 , x 2 , ⋯   , x k ] = ⋯ = f [ x 1 , ⋯   , x k , x 0 ] f[x_0,x_1,\cdots,x_k]=f[x_1,x_0,x_2,\cdots,x_k]=\cdots=f[x_1,\cdots,x_k,x_0] f[x0,x1,,xk]=f[x1,x0,x2,,xk]==f[x1,,xk,x0]

(2)由性质(1)及 k k k阶均差表达式可得 f [ x 0 , x 1 , ⋯   , x k ] = f [ x 1 , x 2 , ⋯   , x k ] − f [ x 0 , x 1 , ⋯   , x k − 1 ] x k − x 0 f[x_0,x_1,\cdots,x_k]=\frac{f[x_1,x_2,\cdots,x_k]-f[x_0,x_1,\cdots,x_{k-1}]}{x_k-x_0} f[x0,x1,,xk]=xkx0f[x1,x2,,xk]f[x0,x1,,xk1]

(3)若 f ( x ) f(x) f(x) [ a , b ] [a,b] [a,b]上存在 n n n阶导数,且节点 x 0 x_0 x0 x 1 x_1 x1 ⋯ \cdots x n ∈ [ a , b ] x_n\in[a,b] xn[a,b],则 n n n阶均差与导数的关系为 f [ x 0 , x 1 , ⋯   , x k ] = f ( n ) ( ξ ) n ! , ξ ∈ [ a , b ] f[x_0,x_1,\cdots,x_k]=\frac{f^{(n)}(\xi )}{n!} ,\xi\in[a,b] f[x0,x1,,xk]=n!f(n)(ξ),ξ[a,b]这个公式可直接用罗尔定理证明。

3.均差表

均差计算可列为均差表如下:

x k x_k xk f ( x k ) f(x_k) f(xk) 一阶均差 二阶均差 三阶均差 四阶均差 ⋯ \cdots
x 0 x_0 x0 f ( x 0 ) ‾ \underline{f(x_0)} f(x0)
x 1 x_1 x1 f ( x 1 ) f(x_1) f(x1) f [ x 0 , x 1 ] ‾ \underline{f[x_0,x_1]} f[x0,x1]
x 2 x_2 x2 f ( x 2 ) f(x_2) f(x2) f [ x 1 , x 2 ] f[x_1,x_2] f[x1,x2] f [ x 0 , x 1 , x 2 ] ‾ \underline{f[x_0,x_1,x_2]} f[x0,x1,x2]
x 3 x_3 x3 f ( x 3 ) f(x_3) f(x3) f [ x 2 , x 3 ] f[x_2,x_3] f[x2,x3] f [ x 1 , x 2 , x 3 ] f[x_1,x_2,x_3] f[x1,x2,x3] f [ x 0 , x 1 , x 2 , x 3 ] ‾ \underline{f[x_0,x_1,x_2,x_3]} f[x0,x1,x2,x3]
x 4 x_4 x4 f ( x 4 ) f(x_4) f(x4) f [ x 3 , x 4 ] f[x_3,x_4] f[x3,x4] f [ x 2 , x 3 , x 4 ] f[x_2,x_3,x_4] f[x2,x3,x4] f [ x 1 , x 2 , x 3 , x 4 ] f[x_1,x_2,x_3,x_4] f[x1,x2,x3,x4] f [ x 0 , x 1 , x 2 , x 3 , x 4 ] ‾ \underline{f[x_0,x_1,x_2,x_3,x_4]} f[x0,x1,x2,x3,x4]
⋮ \vdots ⋮ \vdots ⋮ \vdots ⋮ \vdots ⋮ \vdots ⋮ \vdots ⋮ \vdots

二、牛顿插值多项式

1.牛顿插值多项式

设待插函数为 f ( x ) f(x) f(x),利用拉格朗日插值多项式和均差的概念可以得到 f ( x ) = f ( x 0 ) + f [ x 0 , x 1 ] ( x − x 0 ) + f [ x 0 , x 1 , x 2 ] ( 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 n ] ω n + 1 ( x ) = P n ( x ) + R n ( x ) f(x)=f(x_0)+f[x_0,x_1](x-x_0)+f[x_0,x_1,x_2](x-x_0)(x-x_1)+\cdots +f[x_0,x_1,\cdots,x_n](x-x_0)\cdots(x-x_{n-1})+f[x,x_0,\cdots,x_n]\omega _{n+1}(x)=P_n(x)+R_n(x) f(x)=f(x0)+f[x0,x1](xx0)+f[x0,x1,x2](xx0)(xx1)++f[x0,x1,,xn](xx0)(xxn1)+f[x,x0,,xn]ωn+1(x)=Pn(x)+Rn(x)
其中牛顿均差插值多项式:
P n ( x ) = f ( x 0 ) + f [ x 0 , x 1 ] ( x − x 0 ) + f [ x 0 , x 1 , x 2 ] ( x − x 0 ) ( x − x 1 ) + ⋯ + f [ x 0 , x 1 , ⋯   , x n ] ( x − x 0 ) ⋯ ( x − x n − 1 ) P_n(x)=f(x_0)+f[x_0,x_1](x-x_0)+f[x_0,x_1,x_2](x-x_0)(x-x_1)+\cdots +f[x_0,x_1,\cdots,x_n](x-x_0)\cdots(x-x_{n-1}) Pn(x)=f(x0)+f[x0,x1](xx0)+f[x0,x1,x2](xx0)(xx1)++f[x0,x1,,xn](xx0)(xxn1)
牛顿插值余项:
R n ( x ) = f [ x , x 0 , ⋯   , x n ] ω n + 1 ( x ) R_n(x)=f[x,x_0,\cdots,x_n]\omega _{n+1}(x) Rn(x)=f[x,x0,,xn]ωn+1(x)

三、牛顿插值多项式在Matlab上的实现

1.Matlab代码

function [f0,f1] = Newtown_f(x0,y0)
%Newtown_f x0,y0分别是牛顿插值法所用点的x坐标、y坐标向量
%f0 输出多项式的句柄函数形式
%f1 输出多项式的符号表达式
syms x y
N=length(x0);   %统计样本点个数
mean_difference=zeros(N);
mean_difference(:,1)=y0';
mean_difference_temp=diff(y0);  %生成用于储存均差的矩阵,并存储一阶均差
%计算i-1阶均差
for i=2:N
    delta=i-1;
    for j=delta+1:N
        mean_difference(j,i)=mean_difference_temp(j-delta)/(x0(j)-x0(j-delta));
    end
   mean_difference_temp=diff(mean_difference(i:end,i));
end
%计算多项式
for i=0:(N-1)
    if i==0
        alpha=mean_difference(i+1,i+1);
        polynomial=1;
        f1=alpha*polynomial;
    else
        alpha=mean_difference(i+1,i+1);
        polynomial=polynomial*(x-x0(i));
        f1=f1+alpha*polynomial;
    end
end
f1=simplify(f1);    %简化多项式
f0=matlabFunction(f1);

2.代码使用演示

在多项式函数 f ( x ) = x 2 f(x)=x^2 f(x)=x2 上取三个样本点进行插值

%% 样本点生成
N=3; 
x0=linspace(-1,1,N);
y0=x0.^2;

%% 使用插值法进行计算
[f1,f2]=Newtown_f(x0,y0);

%% 画图
xo_o=linspace(-1,1,500);    %生成画图用点的x值
yo_o=f1(xo_o);  %代入多项式计算画图用点的y值
plot(xo_o,yo_o);
f2 %在命令行窗口展示多项式符号表达式

牛顿插值法在Matlab上的实现_第1张图片
牛顿插值法在Matlab上的实现_第2张图片

上图分别为插值多项式在 [ − 1 , 1 ] [-1,1] [1,1]区间上的图像和得到插值多项式 f 2 = x 2 f2=x^2 f2=x2,可以看到插值多项式图像与原多项式图像保持一致。


备注

一般情况下,插值多项式所插的点越多,多项式的次数就越高,插值结果越接近原函数,但对于龙格函数,例如: f ( x ) = 1 1 + 25 x 2 f(x)=\frac{1}{1+25x^2} f(x)=1+25x21,会存在龙格现象,即插值次数越高,插值结果越偏离原函数的特殊情况。

你可能感兴趣的:(Matlab&数值分析,matlab,算法,矩阵)