插值和拟合
初学插值,我不禁想:“这不就是曲线拟合吗?”,然而,在运用matlab画了几张图,兼之对比了曲线拟合和数据插值的实现方法,发现它们还是不同的。
曲线拟合,一般是追求拟合函数与原始数据的均方误差达到极小,是一种整体意义的逼近,对局部性质没有要求,因此,它允许拟合结果不经过样本值。
而数据插值的话,则是在离散数据的基础上补插连续函数,使得这条连续曲线通过全部给定的离散数据点,插值函数在离散点之外的那些点都相当于“插入”的值。插值有全局插值,也有局部插值(比如分段线性插值),插值误差通常考虑的是逐点误差或最大模误差,插值的好坏往往通过某些局部的性质来体现,比如龙格现象或吉布斯振荡。
插值总结
根据被插函数的自变量个数,插值可分为一维插值、二维插值及多维插值;而根据插值函数的类型,可分为线性插值、多项式插值和样条插值等。
一维数据插值
若已知数据是平面上的一组点集,即被插函数是单变量函数时,此时称为一维插值问题。
matlab提供interp1函数实现一维插值,其调用格式如下:
vq = interp1(x,v,xq,method,extrapolation)
其中,输入参数x、v分别储存采样点和采样值。若同一个采样点对应多个采样值,则v为矩阵,v的每一列对应一种采样值。输入参数xq储存插值点,而输出参数vq是一个行数和xq的长度相同、列数与v相同的矩阵。选项method指定插值方法。
例题:
分别用pchip方法和spline方法对下面的函数进行插值,绘制图形并比较两者异同。
代码如下:
subplot(1,2,1)
x1=1:7;
y1=x1;% x<=5和x>=3时y值
y1(x1<3)=3;
y1(x1>5)=5;
xq1=1:0.1:7; % 插值点
p1=interp1(x1,y1,xq1,'pchip');
s1=interp1(x1,y1,xq1,'spline');
plot(x1,y1,'ko',xq1,p1,'r-',xq1,s1,'b-.')
legend('样本点','pchip','spline')
subplot(1,2,2)
x2=1:0.2:2*pi;
y2=cos(5*x2)./(sqrt(x2));
xq2=1:0.1:2*pi;% 插值点
p2=interp1(x2,y2,xq2,'pchip');
s2=interp1(x2,y2,xq2,'spline');
plot(x2,y2,'bo',xq2,p2,'r-',xq2,s2,'b-.');
legend('样本点','pchip','spline')
运行结果图:
二维数据插值
若已知的数据集是三维空间中的离散点集,则被插函数是二维函数。
matlab提供interp2函数:
Vq = interp2(X,Y,V,Xq,Yq,method)
X,Y分别储存采样点的平面坐标,V储存采样值。其他参数同理。
Attention:如果X、Y表示二维平面上的点,则(X,Y)必须是网格形式!
例题:
一钢板长4m,宽2m,测得钢板表面(x,y)处的温度t(℃)见下表。
(1)用线性插值法求(2.8,1.7)处的温度。
(2)用三次样条插值法求出每隔0.1m处钢板的温度,并绘制插值后的温度分布图。
代码如下:
clc
clear
[x,y]=meshgrid(0:4,0:2); %创建网格
t=[44 25 20 24 30;42 21 20 23 38;25 23 19 27 40]; %样本值
[xq,yq]=meshgrid(0:0.1:4,0:0.1:2); % 创建插值网格
% (1)问
tq1=interp2(x,y,t,2.8,1.7,'linear');
% (2)问
tq2=interp2(x,y,t,xq,yq,'spline');
surf(xq,yq,tq2);
运行结果如下:
在上题中,因为x、y表示二维平面上的点,因此需要创建(x,y)网格。
此外,tq1=interp2(x,y,t,x1,y1,method);
可以直接得到点(x1,y1)的插值。
多维插值
多维插值方法同二维。
n纬插值函数调用格式如下:
vq=interpn(x1,y1,……,v,xq1,yq1,……,method);
散乱数据插值
散乱数据指在二维平面或者三维空间中随机分布的数据,matlab提供griddata函数实现散乱数据插值。其调用格式如下:
vq=griddata(x,y,v,xq,yq,method);
vq=griddata(x,y,z,v,xq,yq,zq,method);
插值方法:
做题时思路和上述的二维插值大致一样。
结语
简单记录一下,等下次有新的收获再来写点儿,溜了溜了。。
Hustle everyday