13. 数据插值与拟合
   
实际中,通常需要处理实验或测量得到的离散数据(点)。插值与拟合方法就是要通过离散数据去确定一个近似函数(曲线或曲面),使其与已知数据有较高的拟合精度。
1. 如果要求近似函数经过所已知的所有数据点,此时称为插值问题(不需要函数表达式)。
2. 如果不要求近似函数经过所有数据点,而是要求它能较好地反映数据变化规律,称为数据拟合(必须有函数表达式)。
插值与拟合都是根据实际中一组已知数据来构造一个能够反映数据变化规律的近似函数。区别是:【插值】不一定得到近似函数的表达形式,仅通过插值方法到未知点对应的值。【拟合】要求得到一个具体的近似函数的表达式。
因此,当数据量不够,但已知已有数据可信,需要补充数据,此时用【插值】。当数据基本够用,需要寻因果变量之间的数量关系(推断出表达式),进而对未知的情形作预测,此时用【拟合】。
一、 数据插值
根据选用不同类型的插值函数,逼近的效果就不同,一般有:
(1)拉格朗日插值(lagrange插值)
(2)分段线性插值
(3)Hermite
(4)三次样条插值
Matlab 插值函数实现:
(1)interp1( )  一维插值
(2)intep2( )    二维插值
(3)interp3( )  三维插值
(4)intern( )    n维插值
1. 一维插值(自变量是1维数据)
语法:      yi = interp1(x0, y0, xi, ‘method’)
其中,x0, y0为原离散数据(x0为自变量,y0为因变量);xi为需要插值的节点,method为插值方法。
注:(1)要求x0是单调的,xi不超过x0的范围;
(2)插值方法有‘nearest’——最邻近插值;‘linear’——线性插值;‘spline’——三次样条插值;‘cubic’——三次插值;
默认为分段线性插值。
例1 从1点12点的11小时内,每隔1小时测量一次温度,测得的温度的数值依次为:5,8,9,15,25,29,31,30,22,25,27,24.试估计每隔1/10小时的温度值。
代码:
hours=1:12;
temps=[5 8 9 15 25 29 31 30 22 25 27 24];
h=1:0.1:12;
t=interp1(hours,temps,h,'spline');
plot(hours,temps,'+',h,t,hours,temps,'r:') 
    % 作图,原散点数据用+标记
xlabel('Hour'),ylabel('Degrees Celsius')
运行结果:
2. 二维插值(自变量是2维数据)
语法:      zi = interp2(x0, y0, z0, xi, yi, ‘method’)
其中,x0, y0, z0为原离散数据(x0, y0为自变量,z0为因变量);xi, yi为需要插值的节点,
method为插值方法。
注:(1)要求x0, y0是单调的,xi, yi不超过x0, y0的范围,注意:要求xi取为行向量,yi取列向量
(2)插值方法有‘nearest’——最邻近插值;‘linear’——双线性插值;‘cubic’——双三次插值;默认为双线性插值。
例2山区地貌:在某山区测得一些地点的高度如下表:
      (平面区域为:1200<=x<=4000,  1200<=y<=3600
X
Y
1200
1600
2000
2400
2800
3200
3600
4000
1200
1130
1250
1280
1230
1040
900
500
700
1600
1320
1450
1420
1400
1300
700
900
850
2000
1390
1500
1500
1400
900
1100
1060
950
2400
1500
1200
1100
1350
1450
1200
1150
1010
2800
1500
1200
1100
1550
1600
1550
1380
1070
3200
1500
1550
1600
1550
1600
1600
1600
1550
3600
1480
1500
1550
1510
1430
1300
1200
980
matlab拟合数据
试作出该山区的地貌图和等高线图。
代码:
x0=1200:400:4000;
y0=1200:400:3600;
height=[1130 1250 1280 1230 1040 900 500 700;
        1320 1450 1420 1400 1300 700 900 850;
        1390 1500 1500 1400 900 1100 1060 950;
        1500 1200 1100 1350 1450 1200 1150 1010;
        1500 1200 1100 1550 1600 1550 1380 1070;
        1500 1550 1600 1550 1600 1600 1600 1550;
        1480 1500 1550 1510 1430 1300 1200 980];
mesh(x0,y0,height)
title('原数据散点图');
pause    % 等待,按任意键切换到新图形
xi=1200:5:4000;
yi=1200:5:3600;
zi=interp2(x0,y0,height,xi',yi,'cubic');
mesh(xi,yi,zi)
title('cubic 插值图');
运行结果:
另外,二维插值函数还有griddata函数,格式类似
cz = griddata(x0, y0, z0, cx, cy, ‘method’)
插值方法有‘nearest’——最邻近插值;‘linear’——双线性插值;‘cubic’——双三次插值;‘v4’——Matlab提供的插值方法;默认为双线性插值。
与interp2区别是,interp2的插值数据必须是矩形域,即已知数据点(x,y)组成规则的矩阵(或称之为栅格),可使用meshgid生成。而griddata函数的已知数据点(X,Y)不要求规则排列,特别是对试验中随机没有规律采取的数据进行插值具有很好的效果。