牛顿插值是一种常用的插值方法,用于根据已知数据点的值,在两个数据点之间的位置上估计函数值。与拉格朗日插值类似,牛顿插值也是通过构造一个多项式来逼近给定的数据点。
假设我们有n+1个数据点 (x0, y0), (x1, y1), ..., (xn, yn),其中xi为已知的不同的x坐标,yi为对应的函数值。
牛顿插值的多项式表示为:
P(x) = f[x0] + f[x0, x1](x - x0) + f[x0, x1, x2](x - x0)(x - x1) + ... + f[x0, x1, ..., xn](x - x0)(x - x1)...(x - xn-1)
其中,f[xi] 表示差商,f[xi, xj] 表示二阶差商,以此类推。差商是一个递归定义的概念,可以通过已知数据点的函数值来计算。具体计算差商的公式如下:
f[xi] = yi f[xi, xi+1] = (f[xi+1] - f[xi]) / (xi+1 - xi) f[xi, xi+1, xi+2] = (f[xi+1, xi+2] - f[xi, xi+1]) / (xi+2 - xi) ...
通过计算差商,可以得到插值多项式P(x),从而根据已知数据点的值,估计在某个位置x处的函数值P(x)。
牛顿插值的优势在于可以通过增量计算差商,避免重复计算,提高计算效率。与拉格朗日插值相比,牛顿插值在实际计算中更常用。然而,牛顿插值同样要注意控制插值误差,并了解插值函数的局限性。
需要指出的是,牛顿插值同样适用于已知数据点之间的插值,而不适用于数据点之外的外推。对于数据点之外的估计,仍然需要使用更高级的插值或拟合方法。
function [C, D] = newpoly(X, Y)
% newpoly 计算牛顿插值多项式。
% 输入参数
% X和Y分别是包含插值点和对应函数值的向量
% 输出参数
% C是一个包含多项式系数的向量,用于计算多项式函数P(x)的值
% D是一个包含分裂差的向量,用于将多项式转换为牛顿插值多项式
n=length(X);
D=zeros(n,n);
D(:,1)=Y';
for j=2:n
for k=j:n
D(k,j)=(D(k,j-1)-D(k-1,j-1))/(X(k)-X(k-j+1));
end
end
C=D(n,n);
for k=(n-1):-1:1
C=conv(C,poly(X(k)));
m=length(C);
C(m)=C(m)+D(k,k);
end
end
%------------------main-----------------------%
clc;
clear;
% 定义原始函数
f=@(x)sin(x);
% 定义插值点
X=linspace(0,2*pi,11);%linspace函数用于生成等间隔的向量的函数,用法v=linspace(x1,x2,n)
Y=f(X);
% 调用newpoly函数计算插值多项式的系数向量C和分裂差向量D
[C,D]=newpoly(X,Y);
% 绘制插值结果
xx=linspace(0,2*pi,501);
yy1=f(xx);
yy2 = polyval(C, xx, [], D);
scatter(X,Y, 'ro');
hold on;
plot(xx, yy1,'b-',xx, yy2,'r--');
xlim([0,2*pi]);ylim([-1, 1]);
legend('插值点', '原函数', '插值函数');
title('牛顿插值多项式');