2010数学建模集训班----拟合与插值专题刘学艺2010/7/13在大量的应用领域中,人们经常面临用一个解析函数描述数据(通常是测量值)的任务。对这个问题有两种方法。一种是插值法,数据假定是正确的,要求以某种方法描述数据点之间所发生的情况。另一种方法是曲线拟合或回归。人们设法找出某条光滑曲线,它最佳地拟合数据,但不必要经过任何数据点。本专题的主要目的是:了解插值和拟合的基本内容;掌握用Matlab求解插值与拟合问题的基本命令。内容提纲1.拟合问题引例及基本理论2.Matlab求解拟合问题3.应用实例4.插值问题引例及基本理论5.Maltab求解插值问题6.应用实例拟合问题拟合问题引例1温度t(0C)20.532.751.073.095.7电阻R()7658268739421032已知热敏电阻数据:求600C时的电阻R。2040608010070080090010001100设R=at+ba,b为待定系数拟合问题引例2t(h)0.250.511.523468c(g/ml)19.2118.1515.3614.1012.899.327.455.243.01已知一室模型快速静脉注射下的血药浓度数据(t=0注射300mg)求血药浓度随时间的变化规律c(t).作半对数坐标系(semilogy)下的图形00(),ktctceck为待定系数02468100101102MATLAB(aa1)曲线拟合问题的提法已知一组(二维)数据,即平面上n个点(xi,yi)i=1,…n,寻求一个函数(曲线)y=f(x),使f(x)在某种准则下与所有数据点最为接近,即曲线拟合得最好。+++++++++xyy=f(x)(xi,yi)ii为点(xi,yi)与曲线y=f(x)的距离线性最小二乘拟合f(x)=a1r1(x)+…+amrm(x)中函数{r1(x),…rm(x)}的选取1.通过机理分析建立数学模型来确定f(x);++++++++++++++++++++++++++++++f=a1+a2xf=a1+a2x+a3x2f=a1+a2x+a3x2f=a1+a2/xf=aebxf=ae-bx2.将数据(xi,yi)i=1,…n作图,通过直观判断确定f(x):曲线拟合问题最常用的解法——线性最小二乘法的基本思路第一步:先选定一组函数r1(x),r2(x),…rm(x),mn,令f(x)=a1r1(x)+a2r2(x)+…+amrm(x)(1)其中a1,a2,…am为待定系数。第二步:确定a1,a2,…am的准则(最小二乘准则):使n个点(xi,yi)与曲线y=f(x)的距离i的平方和最小。记)2(])([])([),,(211211221iiknimkkininiiimyxrayxfaaaJ问题归结为,求a1,a2,…am使J(a1,a2,…am)最小。线性最小二乘法的求解:预备知识超定方程组:方程个数大于未知量个数的方程组)(221111212111mnyarararyarararnmnmnnmm即Ra=ynmnmnnmyyyaaarrrrrrR112111211,,其中超定方程一般是不存在解的矛盾方程组。如果有向量a使得达到最小,则称a为上述超定方程的最小二乘解。212211)(imniimiiyararar线性最小二乘法的求解定理:当RTR可逆时,超定方程组(3)存在最小二乘解,且即为方程组RTRa=RTy------正则(正规)方程组的解:a=(RTR)-1RTy所以,曲线拟合的最小二乘法要解决的问题,实际上就是求以下超定方程组的最小二乘解的问题。nmnmnmyyyaaaxrxrxrxrR111111,,)()()()(其中Ra=y(3)用MATLAB解拟合问题1、线性最小二乘拟合2、非线性最小二乘拟合用MATLAB作线性最小二乘拟合1.作多项式f(x)=a1xm+…+amx+am+1拟合,可利用已有命令:a=polyfit(x,y,m)3.对超定方程组)(11nmyaRnmmn可得最小二乘意义下的解。,用yRa\2.多项式在x处的值y的计算命令:y=polyval(a,x)输出拟合多项式系数a=[a1,…,am,am+1]’(数组)输入同长度数组X,Y拟合多项式次数即要求出二次多项式:3221)(axaxaxf中的123(,,)Aaaa使得:1121[()]iiifxy最小例对下面一组数据作二次多项式拟合xi0.10.20.40.50.60.70.80.91yi1.9783.286.167.347.669.589.489.3011.2211112222232111111,,1,,1,,1xxyayxxaayxx1)输入命令:x=0:0.1:1;y=[-0.447,1.978,3.28,6.16,7.08,7.34,7.66,9.56,9.48,9.30,11.2];R=[(x.^2)',x',ones(11,1)];A=R\y'1111211121xxxxR此时MATLAB(zxec1)解法1.解超定方程的方法2)计算结果:A=[-9.8108,20.1293,-0.0317]0317.01293.208108.9)(2xxxfRAy2)计算结果:A=[-9.8108,20.1293,-0.0317]解法2.用多项式拟合的命令MATLAB(zxec2)00.20.40.60.81-20246810120317.01293.208108.9)(2xxxf1)输入命令:x=0:0.1:1;y=[-0.447,1.978,3.28,6.16,7.08,7.34,7.66,9.56,9.48,9.30,11.2];A=polyfit(x,y,2)z=polyval(A,x);plot(x,y,'k+',x,z,'r')%作出数据点和拟合曲线的图形1.lsqcurvefit已知数据点:xdata=(xdata1,xdata2,…,xdatan)ydata=(ydata1,ydata2,…,ydatan)用MATLAB作非线性最小二乘拟合两个求非线性最小二乘拟合的函数:lsqcurvefit、lsqnonlin。相同点和不同点:两个命令都要先建立M-文件fun.m,定义函数f(x),但定义f(x)的方式不同,请参考例题。211((,))2niiiFxxdataydata最小lsqcurvefit用以求含参量x(向量)的向量值函数F(x,xdata)=(F(x,xdata1),…,F(x,xdatan))T中的参变量x(向量),使得输入格式:(1)x=lsqcurvefit(‘fun’,x0,xdata,ydata);(2)x=lsqcurvefit(‘fun’,x0,xdata,ydata,lb,ub);(3)x=lsqcurvefit(‘fun’,x0,xdata,ydata,lb,ub,options);(4)[x,resnorm]=lsqcurvefit(‘fun’,x0,xdata,ydata,…);(5)[x,resnorm,residual]=lsqcurvefit(‘fun’,x0,xdata,ydata,…);fun是一个事先建立的定义函数F(x,xdata)的M-文件,自变量为x和xdata说明:x=lsqcurvefit(‘fun’,x0,xdata,ydata,options);迭代初值已知数据点选项见无约束优化lsqnonlin用以求含参量x(向量)的向量值函数f(x)=(f1(x),f2(x),…,fn(x))T中的参量x,使得最小。其中fi(x)=f(x,xdatai,ydatai)=F(x,xdatai)-ydatai22212()()()()()Tnfxfxfxfxfx2.lsqnonlin已知数据点:xdata=(xdata1,xdata2,…,xdatan)ydata=(ydata1,ydata2,…,ydatan)输入格式:1)x=lsqnonlin(‘fun’,x0);2)x=lsqnonlin(‘fun’,x0,lb,ub);3)x=lsqnonlin(‘fun’,x0,,lb,ub,options);4)[x,resnorm]=lsqnonlin(‘fun’,x0,…);5)[x,resnorm,residual]=lsqnonlin(‘fun’,x0,…);说明:x=lsqnonlin(‘fun’,x0,options);fun是一个事先建立的定义函数f(x)的M-文件,自变量为x迭代初值选项见无约束优化10020030040050060070080090010004.544.995.355.655.906.106.266.396.506.59jt310jc100.022111min(,,)[]22jktjjFabkabec例2用下面一组数据拟合中的参数a,b,kktbeatc2.0.0)(该问题即解最优化问题:MATLAB(fzxec1)1)编写M-文件curvefun1.mfunctionf=curvefun1(x,tdata)f=x(1)+x(2)*exp(-0.02*x(3)*tdata)%其中x(1)=a;x(2)=b;x(3)=k;2)输入命令tdata=100:100:1000cdata=1e-03*[4.54,4.99,5.35,5.65,5.90,6.10,6.26,6.39,6.50,6.59];x0=[0.2,0.05,0.05];x=lsqcurvefit('curvefun1',x0,tdata,cdata)f=curvefun1(x,tdata)F(x,tdata)=,x=(a,b,k)Tktktbeabea),,(10102.002.0解法1.用命令lsqcurvefit3)运算结果:f=0.00430.00510.00560.00590.00610.00620.00620.00630.00630.0063x=0.0063-0.00340.25424)结论:a=0.0063,b=-0.0034,k=0.25420.020.25420.0050840.00630.00340.00630.0034ttcteeMATLAB(fzxec2)1)编写M-文件curvefun2.mfunctionf=curvefun2(x)tdata=100:100:1000;cdata=1e-03*[4.54,4.99,5.35,5.65,5.90,6.10,6.26,6.39,6.50,6.59];f=x(1)+x(2)*exp(-0.02*x(3)*tdata)-cdata2)输入命令:x0=[0.2,0.05,0.05];x=lsqnonlin('curvefun2',x0)f=curvefun2(x)函数curvefun2的自变量是x,cdata和tdata是已知参数,故应将cdatatdata的值写在curvefun2.m中解法2用命令lsqnonlin1010.020.02110,,(,,)ktktTfxFxtdatactadaabecabecx=(a,b,k)3)运算结果为f=1.0e-003*(0.2322-0.1243-0.2495-0.2413-0.1668-0.07240.02410.11590.20300.2792)x=0.0063-0.00340.2542可以看出,两个命令的计算结果是相同的。4)结论:即拟合得a=0.0063b=-0.0034k=0.2542说明:拟合与统计