工程上常用所谓三次样条插值,效果比较好,只需在上面插值命令后加上'spline'即可 t=interp1(hours, temps, [3.2,4.7], 'spline') ; t=interp1(hours, temps, h,'spline') ; 图像如下
Matlab也能够完成二维插值运算,函数为interp2,用法与interp1基本相同,只是输入和输出参数均为矩阵,对应于平面上的数值点。 2 曲线拟合
在科学实验的统计方法研究中,往往要从一组实验数据(xi,yi)中寻找出自变量x 和因变量y之间的函数关系y?f(x)。由于观测数据往往不够准确,因此并不要求y?f(x)经过所有的点 (xi,yi)(前述插值法要求插值函数?(x)必须经过所有已知点),而只要求在给定点xi上误差?i?f(xi)?yi按照某种标准达到最小,通常采用欧氏范数?2作为误差量
度的标准。这就是所谓的最小二乘法。我们找到的这条曲线f(x)叫做所给数据点(xi,yi)的
拟合曲线,一般先在平面直角坐标系中描出所给数据点(xi,yi)(i?1,?,n)的图形,称为散点图,其次观察散点图,根据经验确定一条曲线,尽可能好的反映x与y的变化关系(通常用多项式),设出其一般形式(如含待定系数的多项式),然后根据已知数据,具体求出这条曲线。
在MATLAB中实现最小二乘法拟合通常采用polyfit函数进行(多项式拟合)。 例2:两组数据如下:
x=[0 .1 .2 .3 .4 .5 .6 .7 .8 .9 1];
y=[-.447 1.978 3.28 6.16 7.08 7.34 7.66 9.56 9.48 9.30 11.2]; 先做出x与y的散点图(用命令plot(x,y,'o'))
估计变量x与y之间大概是什么样的函数关系,比如估计是一次函数,则用下面的命令: n=1;
p1=polyfit(x,y,n) % n表示用n阶多项式拟合,n=1为线性拟合,输出p1为所求多
项式的系数
poly2sym(p1) % 前面的拟合命令只给出多项式的系数,用此命令则将前面的
p1转化为我们熟悉的多项式
vpa(poly2sym(p1),5) % 上面命令给出的结果是有理数形式,此命令将结果转化为数
值形式,5表示显示5位有效数字
x1=0:0.01:1; % 由此以后三句是画出拟合曲线的图像
y1=polyval(p1,x1); % 此句是在x1这些点处求出多项式的值,送给y1 plot(x,y,'o',x1,y1) 运行结果 p1 =
10.3185 1.4400 ans =
5808773505743561/562949953421312*x+31679/22000 ans =
10.318*x+1.4400
n=2(用二次多项式拟合)时的图形
看来要比用一次函数拟合效果要好一些 n=10时
当n比较大时,如上面n=10,数据点之间出现大的波动(虽然曲线经过所有点)。当企图进行高阶曲线拟合时,这种波动现象经常发生,并不利于我们认识两组数据之间的规律,因此并不是阶数越高越好,实际问题当中,适当选择一个即可。
例3:非线性拟合,这里介绍函数lsqcurvefit来拟合,拟合下面两组数据,t为自变量 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 1)作散点图
2)观察此图,我们想用指数函数来拟合c?re, 建立函数文件fun01.m用来计算函数值 function c=fun01(x,t) c=x(1)*exp(x(2)*t);
3)建立脚本文件,输入程序 x0=[10, 0.5];
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]; [x,norm,res]=lsqcurvefit(@fun01,x0,t,c)
其中x是所求系数,norm是误差的平方和,res是误差向量,x0是迭代初始值 运行结果 x =
20.2413 -0.2420 %即r=20.2413,k=-0.2420 norm = 1.0659 res =
-0.1568 -0.2152 0.5311 -0.0198 -0.4143 0.4744 0.2394 -0.5006 -0.0889 4)画图: tt=0:0.2:8;
cc=x(1).*exp(x(2).*tt); plot(tt,cc,t,c,'o')
?kt