第2章 插值法
2.1 实验目的
用MATLAB编写线性插值、抛物插值、拉格朗日插值等算法程序。
熟悉MATLAB中相关插值函数,并调用它们解决样条插值或分段插值等问题。
2.2 MATLAB命令
函数 | 含义 |
---|---|
interp1 | 一维插值 |
spline | 样条插值 |
interp2 | 二维插值 |
一维插值函数格式为interp1(x0,y0,x,‘method’),x0和y0为节点值,x为需要计算的函数值点,'method’为差值方法的选取,有以下几种:
method=‘neraest’,将插值结果的值设置为最近的数据点的值。
method=‘linear’,线性插值,将两个数据点连成直线根据给定的插值点计算直线上的值作为插值结果。
method=‘spline’,三次样条差值,通过数据点拟合出三次样条曲线,根据给定数据计算出曲线上的值。
method=‘pchip’或’cubic’,通过分段三次埃米尔特差值方法计算插值结果。
2.3 实验2例题:多项式插值
例1:已知函数f(x)满足
x | 1.2 | 1.3 | 1.4 | 1.5 | 1.6 |
---|---|---|---|---|---|
f(x) | 1.244 | 1.406 | 1.604 | 1.837 | 2.121 |
编写拉格朗日插值法的MATLAB程序计算f(1.54)的近似值。
function y=lagr(x0,y0,x)
%拉格朗日插值程序
%x0和y0为给定的数据对
%输出y为差值多项式在x处的值
n=length(x0);m=length(x);
for i=1:m
z=x(i);
s=0;
for k=1:n
p=1;
for j=1:n
if j~=k
p=p*(z-x0(j))/(x0(k)-x0(j));
end
end
s=p*y0(k)+s;
end
end
y(i)=s;
end
结果:
%拉格朗日插值
>> x0=[1.2 1.3 1.4 1.5 1.6];
>> y0=[1.244 1.406 1.604 1.837 2.121];
>> y1=lagr(x0,y0,1.54)
y1 =
1.9430
%只用相邻两点做线性插值来求f(1.54)
>> x0=[1.5 1.6];
>> y0=[1.837 2.121];
>> y1=lagr(x0,y0,1.54)
y1 =
1.9506
例2:对以下函数在区间[-4,4]进行10等分,用MATLAB做拉格朗日插值、分段线性插值和三次样条插值,对比图形。
f
(
x
)
=
1
1
+
x
2
f(x)=\frac{1}{1+x^2}
f(x)=1+x21
x0=-4:0.8:4;
y0=1./(1+x0.^2);
x=-4:0.1:4;
y=1./(1+x.^2);
y1=lagr(x0,y0,x); %计算拉格朗日插值
y2=interp1(x0,y0,x); %计算分段线性插值
y3=spline(x0,y0,x); %计算三次样条插值
for k=1:20
xx(k)=x(0+4*k); %间隔0.4产生插值点
yy(k)=y(0+4*k); %间隔0.4计算原函数值
yy1(k)=y1(0+4*k); %间隔0.4计算拉格朗日插值多项式值
yy2(k)=y2(0+4*k); %间隔0.4计算分段限行插值多项式值
yy3(k)=y3(0+4*k); %间隔0.4计算三次样条插值多项式值
end
%plot(x,y,'k',x,y1,'r'); %绘图
plot(x,y,'k',x,y2,'r');
%plot(x,y,'k',x,y3,'r');
结果:
拉格朗日插值(结果有问题丞待解决):
分段线性插值:
三次样条插值: