在开始介绍牛顿插值多项式之前,需要先引入均差的定义
定义 :称 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]=xk−x0f(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]=xk−x1f[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]=xk−xk−1f[x0,⋯,xk−2,xk]−f[x0,x1,⋯,xk−1]为 f ( x ) f(x) f(x)的 k \mathbf{k} k阶均差(均差也称为差商)。
(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=0∑k(xj−x0)⋯(xj−xj−1)(xj−xj+1)⋯(xj−xk)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]=xk−x0f[x1,x2,⋯,xk]−f[x0,x1,⋯,xk−1]
(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]这个公式可直接用罗尔定理证明。
均差计算可列为均差表如下:
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 ⋮ |
设待插函数为 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](x−x0)+f[x0,x1,x2](x−x0)(x−x1)+⋯+f[x0,x1,⋯,xn](x−x0)⋯(x−xn−1)+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](x−x0)+f[x0,x1,x2](x−x0)(x−x1)+⋯+f[x0,x1,⋯,xn](x−x0)⋯(x−xn−1)
牛顿插值余项:
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)
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);
在多项式函数 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 %在命令行窗口展示多项式符号表达式
上图分别为插值多项式在 [ − 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,会存在龙格现象,即插值次数越高,插值结果越偏离原函数的特殊情况。