2012年数学建模培训材料——Matlab软件的使用
第四讲 插值、拟合与回归分析
在生产实践和科学研究中,常常有这样的问题:由实验或测量得到变量间的一批离散样本点,要求得到变量之间的函数关系或得到样本点之外的数据。解决此类问题的方法一般有插值、拟合和回归分析等。
设有一组实验数据(x0,y0),(x1,y1),?(xn,yn),当原始数据精度较高,要求确定一个简单函数y??(x)(一般为多项式或分段多项式)通过各数据点,即yi??(xi),i?0,?,n,称为插值问题。
另一类是拟合问题,当我们已经有了函数关系的类型,而其中参数未知或原始数据有误差时,我们确定的初等函数y??(x)并不要求经过数据点,而是要求在某种距离度量下总体误差达到最小,即
yi??(xi)??i,i?0,?,n,且??i2达到最小值。
i?0n对同一组实验数据,可以作出各种类型的拟合曲线,但拟合效果有好有坏,需要进行有效性的统计检验,这类问题称为回归分析。 一、插值(interpolation)
常用的插值方法有分段线性插值、分段立方插值、样条插值等。 1、一元插值
yi=interp1(x,y,xi,method)
对给定数据点(x,y),按method 指定的方法求出插值函数在点(或数组)xi处的函数值yi。其中method 是字符串表达式,可以是以下形式:
'nearest' ——最邻近点插值
2012年数学建模培训材料——Matlab软件的使用
'linear' ——分段线性插值(也是缺省形式) 'spline' ——分段三次样条插值 'cubic' 分段立方插值
例:在一天24小时内,从零点开始每间隔2小时测得环境温度数据分别为(℃):
12,9,9,10,18,24,28,27,25,20,18,15,13 用不同的插值方法估计中午1点(即13点)的温度,并绘出温度变化曲线。 >> x=0:2:24;
>> y=[12 9 9 10 18 24 28 27 25 20 18 15 13];
>>y_linear=interp1(x,y,13),y_nearest=interp1(x,y,13,'nearest') >>y_cubic=interp1(x,y,13,'cubic'),y_spline=interp1(x,y,13,'spline') >> y1=interp1(x,y,xx); y2=interp1(x,y,xx,'nearest'); >> y3=interp1(x,y,xx,'cubic');y4=interp1(x,y,xx,'spline'); >> subplot(2,2,1),plot(x,y,'or',xx,y1) >> subplot(2,2,2),plot(x,y,'or',xx,y2) >> subplot(2,2,3),plot(x,y,'or',xx,y3) >> subplot(2,2,4),plot(x,y,'or',xx,y4) 2、二元插值
zi=interp2(X,Y,Z,xi,yi,method)
已知数据点(X,Y,Z),求插值函数在(xi,yi)处的函数值zi,插值方法method同interp1。这里要求X,Y,Z是同维矩阵,且X,Y是
2012年数学建模培训材料——Matlab软件的使用
网格矩阵,或者X是与Z列数相同的行向量,Y是与Z行数相同的列向量。
例:测得平板表面5?3网格点处的温度分别为
y x 1 2 3 1 82 79 84 2 81 63 84 3 80 61 82 4 82 65 85 5 84 81 86 试作出平板表面的温度分布图
>> x=1:5;y=1:3;z=[82 81 80 82 84;79 63 61 65 81;84 84 82 85 86]; >> xx=1:0.1:5;yy=1:0.1:3;yy=yy'; >> zz=interp2(x,y,z,xx,yy,'cubic'); >> mesh(xx,yy,zz) 3、不规则点的插值
若数据是不规则的,即数据不能构成矩阵形式,从而不能用interp2函数进行插值。
zi=griddata(x,y,z,xi,yi,method)
这里,x,y,z为同维向量,表示已知数据点的坐标,xi,yi是行向量和列向量,返回值zi为在meshgrid(xi,yi)网格矩阵处的函数值。method 可选择’linear’,’nearest’,’cubic’。 例:假如上例中的数据残缺不全
2012年数学建模培训材料——Matlab软件的使用
y x 1 2 3 1 * 79 84 2 * * 84 3 80 61 * 4 82 65 * 5 84 * 86 >> x=[3 4 5 1 3 4 1 2 5];y=[1 1 1 2 2 2 3 3 3]; >>z=[80 82 84 79 61 65 84 84 86]; >> xx=1:0.1:5;yy=1:0.1:3; >> zz=griddata(x,y,z,xx,yy','cubic'); >> mesh(xx,yy',zz) 二、拟合(Fit) 1、多项式拟合
p=polyfit(x,y,n) 用n次多项式拟合向量数据(x,y)。 例:拟合下列数据
x y 0.1 0.95 0.2 0.84 0.15 0.86 0.0 1.06 -0.2 1.50 0.3 0.72 >> x=[0.1 0.2 0.15 0 -0.2 0.3];y=[0.95 0.84 0.86 1.06 1.50 0.72]; >> p=polyfit(x,y,2);
>> xx=-0.2:0.01:0.3;yy=polyval(p,xx); >> plot(x,y,'or',xx,yy) 2、曲线拟合
当经验函数不是多项式,而是其它类型的函数时,可以用lsqcurvefit函数对拟合函数中的未知参数进行估计。
2012年数学建模培训材料——Matlab软件的使用
c=lsqcurvefit(fun,c0,xdata,ydata)
fun是经验拟合函数,含有未知参数,即具有形式fun(c,x),c0是未知参数的预估计值,(xdata,ydata)是已知实验数据。 例:已知数据表
t 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 y 4 6.4 8 8.4 9.28 9.5 9.7 9.86 10 10.2 10.32 10.42 10.5 10.55 10.58 10.6 用适当的曲线进行数据拟合。
先画散点图,根据散点图确定拟合曲线为对数函数y?a?blnt >> t=1:16;
>> y=[4 6.4 8 8.4 9.28 9.5 9.7 9.86 10 10.2 10.32 10.42 10.5 ... 10.55 10.58 10.6]; >> plot(t,y,'or')
>> f=inline('c(1)+c(2)*log(t)','c','t') %建立拟合函数 >> c=lsqcurvefit(f,[1,1],t,y) %求未知参数 >> tt=1:0.1:16;yy=f(c,tt); >> hold on >> plot(tt,yy) 3、拟合工具箱
Matlab中的拟合工具箱是一个更方便、更直观进行曲线拟合的图形界面,用cftool指令打开拟合工具箱。
拟合效果主要看2个参数:SSE(误差平方和)和R-Square ,SSE越接近0,R-Square越接近1,拟合效果越好。