概述
我们经常会遇到大量的数据需要处理,而处理数据的关键就在于这些算法,例如数据拟合、参数估计、插值等数据处理算法。此类问题在MATLAB中有很多现成的函数可以调用。
插值与拟合方法就是要通过实验或测量所得的一些离散数据去确定某一类已知函数的参数或寻求某个近似函数,使所得到的近似函数与已知数据有较高的拟合精度。
插值与拟合的区别
插值问题:寻求近似函数(曲线或曲面),使其经过所已知的所有数据点(不需要函数表达式),从而预测未知点对应的值。
数据拟合:寻求近似函数,使其能较好地反映数据变化规律(必须有函数表达式),近似函数不一定通过所有的数据点
一维插值
定义
一维插值基本命令
yi=interp1(x,y,xi,’method’)
常用插值方法的比较
方法 说明
nearest 最临近插值:最快,但是数据平滑方面最差,数据是不连续的。
linear 线性插值:执行速度较快,有足够的精度,最常用,为默认设置。
cubic 立方插值:较慢,精度高,平滑度好。作平滑的曲线时用该选项。
spline 三次样条插值:执行速度最慢,精度高,最平滑。
二维网格数据插值(二元函数)
zi=interp2(x,y,z,xi,yi,‘method’) 这里输入参数method有:linear,cubic,nearest
拟合曲线
用MATLAB作线性最小二乘拟合
a = polyfit(x,y,n)
输出为拟合多项式系数
例
插值
1.已知数据表如下,试利用interp1的不同插值算法求xi=1,1.1,1.2,…,5各点的函数的近似值,并作图比较.
X | 1.0 | 2.0 | 3.0 | 4.0 | 5.0 |
3.5 | 4.6 | 5.5 | 3.2 | 2.0 |
x=[1:1:5];
y=[3.5,4.6,5.5,3.2,2.0];
xi=[1:0.1:5];
y1=interp1(x,y,xi,'nearest');
y2=interp1(x,y,xi,'linear');
y3=interp1(x,y,xi,'spline');
y4=interp1(x,y,xi,'cubic');
plot(x,y,'o',xi,y1,'r',xi,y2,'k',xi,y3,'b',xi,y4,'g');
legend('已知数据','nearest','linear','spline','cubic')
2.测得平板表面3*5网格点处的温度分别为:
82 81 80 82 84
79 63 61 65 81
84 84 82 85 86
试作出平板表面的温度分布曲面z=f(x,y)的图形。再以平滑数据,在x、y方向上每隔0.5个单位的地方进行插值.
x=[1:1:5];
y[1:1:3];
z=[82 81 80 82 84;
79 63 61 65 81;
84 84 82 85 86];
x1=[1:0.05:5];
y1=[1:0.05:3];
z1=interp2(x,y,z,x1,y1','nearest');
z2=interp2(x,y,z,x1,y1','linear');
z3=interp2(x,y,z,x1,y1','cubic');
subplot(2,2,1)
mesh(x,y,z);
title('原始图');
subplot(2,2,2)
mesh(x1,y1,z1)
title('nearest');
subplot(2,2,3)
mesh(x1,y1,z2)
title('linear');
subplot(2,2,4)
mesh(x1,y1,z3)
title('cubic');
拟合曲线
1.某地区作物生长所需的营养素主要是氮(N)、磷(P)。某作物研究所对土豆的产量做了一定数量的实验,实验数据如表2所示,其中 ha 表示公顷,t 表示吨,kg表示公斤。现对土豆产量关于N 的施肥量做实验,试分析施肥量N与产量之间关系。
施肥量x(kg/ha) | 0 | 34 | 67 | 101 | 135 | 202 | 259 | 336 | 404 | 471 |
产量y(t/ha) | 15.18 | 21.36 | 25.72 | 32.29 | 34.03 | 39.45 | 43.15 | 43.46 | 40.83 | 30.75 |
x=[0 34 67 101 135 202 259 336 404 471];
y=[15.18 21.36 25.72 32.29 34.03 39.45 43.15 43.46 40.83 30.75];
a=polyfit(x,y,2)
z=polyval(a,x);
plot(x,y,'ko',x,z,'r')
legend('原始图','y=-0.0003*x^2+0.1971*x+14.7416')
2.塔机起重量G与钢丝绳拉杆张力F之间存在密切关系,如下表所示。以拉杆张力F作为自变量,起重量为因变量,找出函数关系。并根据函数关系估计相应拉力下的起重量。
拉杆张力F | 0 | 0.45 | 0.94 | 1.44 | 2.10 | 2.61 | 3.36 | 4.27 | 5.16 | 6.05 | 7.33 |
起重量G/kg | 0 | 600 | 1200 | 1800 | 2400 | 3000 | 3600 | 4200 | 4800 | 5400 | 6000 |
x=[0 0.45 0.94 1.44 2.10 2.61 3.36 4.27 5.16 6.05 7.33];
y=[0 600 1200 1800 2400 3000 3600 4200 4800 5400 6000];
a=polyfit(x,y,3)
y1=polyval(a,x);
plot(x,y,'ro',x,y1,'b');
legend(‘原数据','y=4.6*x^3-110.4*x^2+1383*x+0.4')
3.已知一室模型快速静脉注射下的血药浓度数据(t=0注射300mg)
t(h) 0.25 0.5 1 1.5 2 3 4 6 8
c(mg/ml) 19.21 18.15 15.36 14.10 12.89 9.32 7.45 5.24 3.01
将其拟和为:
t=[0.25 0.5 1 1.5 2 3 4 6 8];
c=[19.21 18.15 15.36 14.10 12.89 9.32 7.45 5.24 3.01];
lnc=log(c);
a=polyfit(t,lnc,1)
k=-a(1)
c0=exp(a(2))
t1=[0.25:0.01:8];
c1=c0*exp(-k*t1);
plot(t,c,'ro',t1,c1,'b')
legend('原数据','杨世豪 21434070217')