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')
运行结果:
353025Degrees Celsius20151050246Hour81012
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 1200 1130 1320 1390 1500 1500 1500 1480 1600 1250 1450 1500 1200 1200 1550 1500 2000 1280 1420 1500 1100 1100 1600 1550 2400 1230 1400 1400 1350 1550 1550 1510 2800 1040 1300 900 1450 1600 1600 1430 3200 900 700 1100 1200 1550 1600 1300 3600 500 900 1060 1150 1380 1600 1200 4000 700 850 950 1010 1070 1550 980 试作出该山区的地貌图和等高线图。
代码:
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 插值图');
运行结果:
相关推荐: