题目:
已知函数表如下表所示,用二次插值函数求的近似值(计算结果取五位小数)。
x | 1.2 | 1.3 | 1.4 | 1.5 | 1.6 | 1.7 |
1.244 | 1.406 | 1.602 | 1.837 | 2.121 | 2.465 |
牛顿插值算法思想:
已知插值点序列,首先计算
阶差商
利用差商建立牛顿插值多项式
最后把的具体值代入,求得相应的函数值。
步骤:
第一步:输入插值点序列,令
。
第二步:对,计算
的各阶差商
。
第三步:计算函数值
第四步:输出的近似值或计算失败信息,结束程序。
牛顿插值算法N-S流程图:
程序:
%%Newton牛顿n次插值(函数封装)
clear
clc
%输入数据
x = [1.2 1.3 1.4 1.5 1.6 1.7];
y = [1.244 1.406 1.602 1.837 2.121 2.465];
xs=1.54;%待求值
n=2;%指定插值次数,可选。
f = NewT03(xs,x,y)%不指定插值次数
%NewT03(xs,x,y,n)%指定插值次数
plot(x,y,'--',xs,f,'*')
function f = NewT03(xs,x,y,n)
%Newton插值
% xs为待求值
% x,y为列表向量
% n为插值次数,可选,若为空则自动按“点个数-1”次插值,若不为空,自动从xs值左右选取n+1个值
%确保输入了足够的参数
if nargin < 4
n = length(x)-1;
if nargin <3
error(message('参数个数不符合要求'));
end
if length(x) ~= length(y)
error(message('x与y的长度不相等,快去检查是不是数据输错了'));
end
else
x1 = [x(find(x<xs,ceil(n/2)+1,'last')),x(find(x>xs,n-ceil(n/2)))];
y1 = [y(find(x<xs,ceil(n/2)+1,'last')),y(find(x>xs,n-ceil(n/2)))];
x=[];y=[];x=x1;y=y1;
end
%%构造差商表
ZC=[x',y'];%将x和y按列放到一起
CS=zeros(n+1);%构造差商表的容器,包括y值列
CS(:,1)=ZC(:,2);
for i=2:n+1%行
for j=2:n+1%列
if i>=j
CS(i,j)=(CS(i-1,j-1)-CS(i,j-1))/(ZC(i-j+1,1)-ZC(i,1));
end
end
end
%%写n次Newton插值多项式
%提取差商表矩阵对角线元素
Dcs=diag(CS);
%开始写多项式表达式
f = Dcs(1);%f保存插值结果
ftemp=1;%中间变量,临时保存各项之中(x-x_(N))乘积的值的值
for i=2:n+1
for j=1:i-1
ftemp = ftemp*(xs-ZC(j,1));
end
f = f + ftemp*Dcs(i);
ftemp = 1;
end
end
多项式输出
%%Newton牛顿n次插值(函数封装)%输出插值多项式
clear
clc
%输入数据
x = [1.2 1.3 1.4 1.5 1.6 1.7];
y = [1.244 1.406 1.602 1.837 2.121 2.465];
xs=1.54;%待求值
n=2;%指定插值次数,可选。
f = NewT04(xs,x,y)%不指定插值次数
%NewT03(xs,x,y,n)%指定插值次数
%plot(x,y,'--',xs,f,'*')
function f = NewT04(p,x,y,n)
%输出插值多项式
%Newton插值
% xs为待求值
% x,y为列表向量
% n为插值次数,可选,若为空则自动按“点个数-1”次插值,若不为空,自动从xs值左右选取n+1个值
syms p;
%确保输入了足够的参数
if nargin < 4
n = length(x)-1;
if nargin <3
error(message('参数个数不符合要求'));
end
if length(x) ~= length(y)
error(message('x与y的长度不相等,快去检查是不是数据输错了'));
end
else
x1 = [x(find(x<p,ceil(n/2)+1,'last')),x(find(x>p,n-ceil(n/2)))];
y1 = [y(find(x<p,ceil(n/2)+1,'last')),y(find(x>p,n-ceil(n/2)))];
x=[];y=[];x=x1;y=y1;
end
%%构造差商表
ZC=[x',y'];%将x和y按列放到一起
CS=zeros(n+1);%构造差商表的容器,包括y值列
CS(:,1)=ZC(:,2);
for i=2:n+1%行
for j=2:n+1%列
if i>=j
CS(i,j)=(CS(i-1,j-1)-CS(i,j-1))/(ZC(i-j+1,1)-ZC(i,1));
end
end
end
%%写n次Newton插值多项式
%提取差商表矩阵对角线元素
Dcs=diag(CS);
%开始写多项式表达式
f = Dcs(1);%f保存插值结果
ftemp=1;%中间变量,临时保存各项之中(x-x_(N))乘积的值的值
for i=2:n+1
for j=1:i-1
ftemp = ftemp*(p-ZC(j,1));
end
f = f + ftemp*Dcs(i);
ftemp = 1;
simplify(f);
end
end
结果分析:
Newton n次插值 | 1.9441 |