前言
一、牛顿插值法是什么?
1.均差下的牛顿插值
2.为了给出编辑的表达式,引入均差的概念
3.差分形式的牛顿插值公式(牛顿前插公式)
三、matlab实现代码
1.生成牛顿均差表
2.牛顿插值多项式
3.生成牛顿差分表
4.牛顿前插公式
本篇内容为个人所学知识分享
由于利用插值基函数得到的拉格朗日插值多项式,公式结构紧凑,在理论分析中甚为重要,但当插值节点增减时,计算要全部重新进行,甚为不便,为了计算方便,重新设计出逐次生成插值多项式的牛顿插值
当n=1时,此时插值多项式记为,它满足条件
用点弦式表示为
它可看成是零次插值的修正,即
它满足条件
可表示为
显然它满足条件及.令,则得
系数是函数f的“差商的差商”,一般情景已知f在插值点上的值为,要求n次插值多项式满足条件
则可表示为
其中为待定系数,与拉格朗日插值不同,这里的是由基函数逐次递推得到的,
则牛顿插值在均差形式下的公式为
针对于等距节点,即的情形,
这里称h为步长,令
称为处以h为步长的一阶差分,
为处的二阶差分,
为处的n阶差分,
且均差和差分具有以下的关系
使用差分代替均差,并令x=x_0+th,则得牛顿前插公式
function table=Newtonian_mean_difference_table(x,y)
%功能:生成牛顿均差表
%输入:x为插值节点,y为插值节点对应的值
%输出:均差表table,
table=[x',y'];
[M,N]=size(table);
for n=3:M+1%循环作用:从左到右依次生成均差表
for m=n-1:M%循环作用:在每一列里自上而下生成均差表
table(m,n)=(table(m,n-1)-table(m-1,n-1))/(table(m,1)-table(m-n+2,1));
end
end
end
function y0=Newtonian_interpolated(x,y,x0)
%功能:牛顿插值多项式求解
%输入:x为插值节点,y为插值节点对应的值,x0为计算点集
%输出:x0处值的集合y0
y0=onex(1,length(x0));
for k=1:length(x0)
table=Newtonian_mean_difference_table(x,y);%调用均差表函数
y0(k)=y(1);
for m=2:length(x)%循环作用:均差系数(table对角线的上斜对角线元素)×(x-x0)(x-x1)···(x-xn-1)
product=1;
for n=2:m%循环作用:构成(x-x0)(x-x1)···(x-xn-1)
product=product.*(x0(k)-x(n-1));
end
y0(k)=y0(k)+table(m,m+1).*product;
end
end
end
function table=Difference_table(x,h,t,y)
%功能:构造差分表
%输入:第一个插值点x,步长h,次数t,插值点对应的y值
%输出:差分表table
x=x:h:x+h*t;
table=[x',y'];
[M,N]=size(table);
for n=3:M+1%循环作用:从左到右依次生成差分表
for m=n-1:M%循环作用:在每一列里自上而下生成差分表
table(m,n)=(table(m,n-1)-table(m-1,n-1));
end
end
end
function y0=Newtonian_pre-insertion(x,h,t,y)
%功能:牛顿前插公式
%输入:最小的点x0,步长h,次数t
%输出:x0对应
table=Difference_table(x,h,t,y)%调用差分表函数
y0=y(1);
for m=2:length(y)%循环作用:差分系数(table对角线的上斜对角线元素)×t(t-1)*...(t-n+1)/n!
product=1;
for n=1:m-1%循环作用:构成t(t-1)*...(t-n+1)/n!
product=product.*(t-n+1)/n;
end
y0=y0+table(m,m+1).*product;
end
end
end
拉格朗日插值和牛顿插值的推导其实很像是对于线性插值的两点式的点弦式的高阶外推。
拉格朗日插值是两点式,牛顿插值是点弦式。
然后一般牛顿插值和牛顿向前插值的不同在于,牛顿向前插值要求节点是等距节点。