




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
[matlab曲线拟合(含实例)]matlab曲线拟合-非常好非常全面的介绍M拟合的参考资料MathworksTech-Note1508曲线拟合向导1.介绍2.Mathworks产品的曲线拟合特色a.曲线拟合工具箱(CurveFittingToolbox)b.Matlab内建函数与其他的带有曲线拟合能力的附加产品(工具箱)c.线性曲线拟合d.非线性曲线拟合3.加权曲线拟合方法a.曲线拟合工具箱b.统计工具箱c.优化工具箱4.利用曲线拟合工具箱提高曲线拟合结果5.其他的相关资料第1节:简介MATLAB即有内建的解决很多通常遇到的曲线拟合问题的能力,又具有附加这方面的产品。本技术手册描述了几种拟合给定数据集的曲线的方法,另外,本手册还解释了加权曲线拟合、针对复数集的曲线拟合以及其他一些相关问题的拟合技巧。在介绍各种曲线拟合方法中,采用了典型例子的结合介绍。第2节:MathWorks产品的曲线拟合特色MATLAB有可以用于曲线拟合的内建函数。MathWorks公式也提供了很多工具箱可以用于曲线拟合。这些方法可以用来做线性或者非线性曲线拟合。MATLAB也有一个开放的工具箱――曲线拟合工具箱(CurveFittingToolbox),她可以用于参数拟合,也可以用于非参数拟合。本节将介绍曲线拟合工具箱与其他工具箱、以及各种MATLAB可以用于曲线拟合的内建函数的详细特征。a.曲线拟合工具箱曲线拟合工具箱是专门为数据集合进行曲线拟合而设计的。这个工具箱集成了用MATLAB建立的图形用户界面(GUIs)和M文件函数。曲线拟合向导Genial@USTC2004-4-18?利用工具箱的库方程(例如线性,二次,高阶多项式等)或者是用户自定义方程(局限于用户的想象力)可以进行参数拟合。当你想找出回归系数以及他们背后的物理意义的时候就可以采用参数拟合。?通过采用平滑样条或者其他各种插值方法,你就可以进行非参数拟合。当回归系数不具有物理意义并且不在意他们的时候,就采用非参数拟合方法。曲线拟合工具箱提供了如下功能:?数据回归,譬如截面(?sectioning)与平滑;?标准线性最小二乘拟合,非线性最小二乘拟合,加权最小二乘拟合,约束二乘(constrainedleastsquares)拟合以及稳健(robust)拟合;?根据诸如R2以及误差平方和(SSE)确定的拟合性能的统计特征。请查阅曲线拟合工具箱提供的demos。b.MATLAB内建函数与具有曲线拟合能力的其他工具箱除了曲线拟合工具箱,MATALB与其他工具箱也提供了些可以用于解决线性和非线性曲线拟合的功能。本节列举并解释了其中几个。c.利用MATLAB内建函数进行线性曲线拟合函数描述polyfit用多项式进行数据拟合。polyfit(X,Y,N)对数据X,Y拟合N阶多项式系数,P(X(I))~=Y(I),在最小二乘意义上。\反斜线或者矩阵阵左除。如果A是一个方阵,A\B基本上与inv(A)*B一致的,是采用的不同计算方式而已。polyval在给定点计算多项式的值corrcoef计算两个向量的相关系数。它可以与polyfit和polyval函数一起用来在实际数据和拟合输出之间计算R2相关系数下面给出一个利用corref计算R值的例子:loadcensus[p,s]=polyfit(cdate,pop,2);Output=polyval(p,cdate);Corrolation=corroef(cate,Output);cdate与它自身很好的相关,同样的Output也与它自身很好相关。反对角线上元素是2曲线拟合向导Genial@USTC2004-4-18cdate与Output之间的相关性。这个值非常接近于1,因此实际数据与拟合结果能否较好的吻合。因此,这个拟合是“好”的拟合。(应该是这样判断的么?我怎么觉得应该通过pop与Output的相关性来判断拟合的好坏的呢?)利用反斜线操作符与polyfit函数进行回归与曲线拟合的更多的例子请参照MATLAB文档中的RegressionandCurveFitting一节。附加例子:数据集:t=[0.3.81.11.62.3]';y=[0.50.821.141.251.351.40]';plot(t,y,'o'),gridon方法1:多项式回归基于图形,数据可能通过二次多项式建模如下:y=a0+a1*t+a2*t其中未知系数a0,a1,a2可以通过最小二乘(通过最小化通过模型计算出来的数据的偏差的平方和)拟合计算。三个未知数6个方程如下:用6x3的矩阵表示:X=[ones(size(t))tt.^2];则结果通过反斜线操作符得到:a=X\ya=0.53180.9191-0.2387因此二阶多项式模型为:y=0.5318+0.9191*t-0.2387*t2曲线拟合向导Genial@USTC2004-4-18计算模型在均匀空间的值,并将原来的值画在同一个图形上:T=(0:.1:2.5)';Y=[ones(size(T)TT.^2)]*a;plot(T,Y,'-'t,y,'o'),gridon方法2:线性参数回归建立模型:X=[ones(size(t))exp(-t)t.*exp(-t)];a=X\y;T=(0:.1:2.5)';Y=[ones(size(T))exp(-T)T.exp(-T)]*a;plot(T,Y,'-',t,y,'o'),gridon曲线拟合向导Genial@USTC2004-4-18方法3:多元回归如果y是一个包含多个独立变量的函数,表示变量间的相邻关系的矩阵方程可以通过附加数据进行扩展。假设我们测量参数x1、x2的少数几个值的输出y,观测值如下:x1=[.2.5.6.81.01.1]';x2=[.1.3.4.91.11.4]';y=[.17.26.28.23.27.24]';本数据的一个多元模型是:多元回归解决的是通过最小二乘拟合求未知系数a0,a1,a2。通过构造回归矩阵X构造和解决同步方程,依然采用反斜线操作符。X=[ones(size(x1))x1x2];a=X\y;为了评价模型,求取绝对误差的最大值:Y=X*a;MaxErr=max(abs(Y-y));实例分析:曲线拟合(本节来自matlab的在线帮助文档)本节提供了以实际数据分析形式的在MATLAB中的数据分析基本能力的概貌。下面的例子是以收集的人口普查数据为基础,采用MATLAB函数对数据进行实验拟合:?多项式拟合?残差分析?指数拟合?误差界限1.导入数据loadcensus(census.mat包含了美国1790年到1990年的人口数据)其中包括两个变量:cdate与popcdate是从1790以10递增到1990的一个列向量,是年份数;pop是cdate中年份相应的人口数据向量曲线拟合向导Genial@USTC2004-4-182.多项式拟合首先我们想通过简单的多项式对普查数据进行拟合。利用MATLAB中的两个函数进行处理:polyfit与polyval。polyfit函数是在给定阶次多项式上对数据进行最小二乘意思上的最优拟合。假设采用4阶多项式,拟合过程为:>>p=polyfit(cdate,pop,4)Warning:Polynomialisbadlyconditioned.RemoverepeateddatapointsortrycenteringandscalingasdescribedinHELPPOLYFIT.p=1.0e+005*0.0000-0.00000.0000-0.01266.0020警告的产生是因为polyfit函数用很大的值cdate作为基本数据,用他来产生范德蒙矩阵(Vandermondematrix),具体细节的可以在polyfit的m文件中看到。cdate的展开导致尺度标准问题,一个解决办法就是标准化cdate数据。预处理:标准化数据标准化处理是为了提高后期数值计算精度而进行的尺度变化处理。一个处理办法是:sdate=(cdate-mean(cdate))./std(cdate);然后再以标准化后数据进行4阶多项式拟合:>>p=polyfit(sdate,pop,4)p=0.70470.921023.470673.859862.2285通过图形我们来观察其拟合的好坏:>>pop4=polyval(p,sdate);>>plot(cdate,pop4,'-',cdate,pop,'+'),gridon曲线拟合向导Genial@USTC2004-4-18另外一个规范化数据的方法就是通过结果与单位的知识进行转换。如,对于本数据集,选择1790作为0年也可以得到较为满意的解。3.残差分析一个评价拟合好坏的测度就是残差――观测值与预测值的差异。对不同的拟合,利用残差进行比较。从拟合图形和残差上,我们显而易见,采用标准化数据比简单的多项式可能对数据有更好的拟合。利用如下命令,分别对数据进行1阶,2阶,4阶的拟合,作图,并比较其残差:>>loadcensus>>sdate=(cdate-mean(cdate))./std(cdate);>>p1=polyfit(sdate,pop,1);>>pop1=polyval(p1,sdate);>>plot(cdate,pop1,'b-',cdate,pop,'g+');>>res1=pop-pop1;>>figure,plot(cdate,res1,'g+');>>p=polyfit(sdate,pop,2);>>pop2=polyval(p,sdate);>>figure,plot(cdate,pop2,'b-',cdate,pop,'g+')>>res2=pop-pop2;>>figure,plot(cdate,res2,'g+');>>p=polyfit(sdate,pop,4);>>pop4=polyval(p,sdate);>>figure,plot(cdate,pop4,'b-',cdate,pop,'g+')>>res4=pop-pop4;>>figure,plot(cdate,res4,'g+');>>max(abs(res1))ans=41.3987>>max(abs(res2))ans=7.5361>>max(abs(res4))ans=6.3455曲线拟合向导Genial@USTC2004-4-184.指数拟合看前面的人口图形,发现人口数据曲线有些与指数曲线相似。利用这一点,我们试着对人口数据值的对数进行拟合,依然采用前面的标准化方法。>>logp1=polyfit(sdate,log10(pop),1);>>logpred1=10.^polyval(logp1,sdate);>>semilogy(cdate,logpred1,'-',cdate,pop,'+');gridon>>logp2=polyfit(sdate,log10(pop),2);>>logpred2=10.^polyval(logp2,sdate);>>figure,semilogy(cdate,logpred2,'-',cdate,pop,'+');gridon>>logres2=log10(pop)-polyval(logp2,sdate);>>figure,plot(cdate,logres2,'+');>>r=pop-10.^(polyval(logp2,sdate));>>figure,plot(cdate,r,'+')可以看出,残差更加随机性强一些。或许,残差随着人口数的增加而在数量级方面增长很快,但是总体而言,对数模型提供了更精确的拟合。曲线拟合向导Genial@USTC2004-4-185.误差界限误差界限对于判别你的拟合是否是个合理的模型很有用。你可以通过从polyfit选择任意两个输出参数作为polyfit的两个输入参数。本例子采用普查例子断乎机和前面讲的规范化方法,利用polyfit和polyval得到二阶多项式模型的误差界限。对年度值进行规范化,本例子采用+-2△间隔,相应的其置信度的95%。>>loadcensus>>sdate=(cdate-mean(cdate))./std(cdate);>>[p2,S2]=polyfit(sdate,pop,2);>>[pop2,del2]=polyval(p2,sdate,S2);>>plot(cdate,pop,'+',cdate,pop2,'g-',cdate,pop2+2*del2,'r:',cdate,pop2-2*del2,'r:'),gridon优化工具箱的利用(接1)函数描述LSQLIN有约束线性最小二乘优化LSQNONNEG非负约束线性最小二乘优化问题当有约束问题存在的时候,应该采用上面的方法代替Polyfit与反斜线(\)。具体例子请参曲线拟合向导Genial@USTC2004-4-18阅优化工具箱文档中的相应利用这两个函数的例子。d.非线性曲线拟合利用MATLAB的内建函数函数名描述FMINBND只解决单变量固定区域的最小值问题FMINSEARCH多变量无约束非线性最小化问题(Nelder-Mead方法)。下面给出一个小例子展示一下如何利用FMINSEARCH1.首先生成数据>>t=0:.1:10;>>t=t(:);>>Data=40*exp(-.5*t)+rand(size(t));%将数据加上随机噪声2.写一个m文件,以曲线参数作为输入,以拟合误差作为输出functionsse=myfit(params,Input,Actural_Output)A=params(1);lamda=params(2);Fitted_Curve=A.*exp(-lamda*Input);Error_Vector=Fitted_Curve-Actural_Output;%当曲线拟合的时候,一个典型的质量评价标准就是误差平方和sse=sum(Error_Vector.^2);%当然,也可以将sse写作:sse=Error_Vector(:)'*Error_Vector(:);3.调用FMINSEARCH>>Strarting=rand(1,2);>>options=optimset('Display','iter');>>Estimates=fiminsearch(@myfit,Strarting,options,t,Data);>>plot(t,Data,'*');>>holdon>>plot(t,Estimates(1)*exp(-Estimates(2)*t),'r');Estimates将是一个包含了对原数据集进行估计的参数值的向量。附图见后面:曲线拟合向导Genial@USTC2004-4-18FMINSEARCH通常能够用来解决不连续情况,特别是如果他们不出现在解的附近的时候。它得到的通常也是局部解。FMINSEARCH只能够最小化实数值(也就是说,解的域必须只能包括实数,函数的输出只能够为实数值)。当感兴趣的是复数变量的域的时候,他们必须被分割为实部与虚部。MATLAB的FIGURE窗口:最基本的拟合界面与数据统计工具MATLAB通过基本的拟合界面也支持基本曲线拟合。利用这个界面,你可以快速地在简单易用的环境中实现许多基本的曲线拟合。这个界面可以实现以下功能:a.通过比样条插值(splineinterpolant)、hermite插值、或者是高达10阶的多项式插值实现数据的拟合;b.对给定数据同时实现多样插值的绘制;c.绘制残差图;d.检查拟合结果的残差的数值;e.通过内插值或者外推插值评价一个拟合结果;f.对拟合结果和残差的模进行图形绘制;g.将拟合结果保存入MATLAB工作空间。开发你的拟合应用的时候,你可以通过基本拟合(BasicFitting)界面,也可以通过命曲线拟合向导Genial@USTC2004-4-18令行函数,也可以同时作用。你可以通过基本拟合界面只能够实现2-D数据的拟合。然而,如果你用subplot绘制多个数据集,只要有至少一个数据集是2D的,那么就可以用基本拟合界面。可以通过如下步骤激活基本拟合界面:1.绘制数据;2.从figure窗口的Tools菜单条下面选择BasicFitting菜单项;有关BasicFitting界面的更多信息,请查阅MATLAB帮助文档的相应部分。注意:对于HP,IBM以及SGI平台,MATLAB6.0(R12.0)以及MATLAB6.1(R12.1)的基本拟合界面不受支持。数据统计界面可以用来对图形中的每个数据集进行统计量的计算。可以通过如下步骤将数据统计界面激活:1.制数据;2.从figure窗口的Tools菜单条下面选择DataStatistics菜单项;优化工具箱函数LSQNONLIN解决非线性最小二乘法问题,包括非线性数据拟合问题LSQCURVEFIT解决非线性数据拟合问题下面给出利用这两个函数的例子:LSQNONLIN:利用这个函数最小化连续函数只能够找到句柄解。下面的例子说明利用LSQNONLIN函数用下面的函数进行拟合:f=A+Bexp(C*x)+D*exp(E*x)对数据集x与y进行拟合,其中y是在给定x的情况下的期望输出。为了解决这个问题,先建立下面的名为fit_simp.m的函数,它利用数据x与y,将他们作为优化输入参数传递给LSQNONLIN。利用给定的数据x计算f的值,再与原始数据y进行比较。经验值与实际计算出的值之间的差异作为输出值返回。LSQNOLIN函数就是最小化这些差的平方和。functiondiff=fit_simp(x,X,Y)%此函数被LSQNONLIN调用%x是包含等式系数的向量%X与Y是作为操作数传递给lsnonlinA=x(1);B=x(2);C=x(3);曲线拟合向导Genial@USTC2004-4-18D=x(4);E=x(5);diff=A+B.*exp(C.*X)+D.*exp(E.*X)-Y;下面的脚本是利用上面定义的fit_simp.m函数的一个例子:%定义你打算拟合的数据集合>>X=0:.01:.5;>>Y=2.0.*exp(5.0.*X)+3.0.*exp(2.5.*X)+1.5.*rand(size(X));%初始化方程系数>>X0=[11111]';%设置用中等模式(memdium-scale)算法>>options=optimset('Largescale','off');%通过调用LSQNONLIN重现计算新的系数>>x=lsqnonlin(@fit_simp,X0,[],[],options,X,Y);%调用LSQNONLIN结果输出表明拟合是成功的Optimizationterminatedsuccessfully:GradientinthesearchdirectionlessthantolFunGradientlessthan10*(tolFun+tolX)%绘制原始数据与新的计算的数据>>Y_new=x(1)+x(2).*exp(x(3).*X)+x(4).*exp(x(5).*X);>>plot(X,Y,'+r',X,Y_new,'b');注意:LSQNONLIN只可以处理实数变量。在处理包括复数变量的实例的拟合的时候,数据集应该被切分成实数与虚数部分。下面给出一个例子演示如何对复数参数进行最小二乘拟合。曲线拟合向导Genial@USTC2004-4-18为了拟合复数变量,你需要将复数分解为实数部分与虚数部分,然后把他们传递到函数中去,这个函数被LEASTSQ作为单个输入调用。首先,将复数分解为实部与虚部两个向量。其次,将这两个向量理解成诸如第一部分是实部、第二部分是虚部。在MATLAB函数中,重新装配复数数据,并用你想拟合的复数方程计算。将输出向量分解实部与虚部,将这两部分连接为一个单一的输出向量传递回LEASTSQ。下面,给出一个例子演示如何根据两个复数指数拟合实数X与Y。建立方程:functionzero=fit2(x,X,Y)%根据输入x重建复数输入cmpx=x(1:4)+i.*x(5:8);%利用复数计算函数zerocomp=cmpx(1).*exp(cmpx(2).*X)+cmpx(3).*exp(cmpx(4).*X)-Y;%将结果转换成一个列向量%其中第一部分是实部,第二部分是虚部numx=length(X);%实部长度zero=real(zerocomp);%实部zero(numx+1:2*numx)=imag(zerocomp);%虚部为了评价计算这个函数,需要X与Y数据集。LSQNONLIN将根据它拟合出下面方程中的参数a,b,c与d:Y=a*exp(b*X)+c*exp(d*X);其中,a,b,c与d是复数变量。>>X=0:.1:5;>>Y=sin(X);>>Y=Y+.1*rand(size(Y))-.05;>>cmpx0=[1i22*i];>>x0(1:4)=real(cmpx0);>>x0(5:8)=imag(cmpx0);>>x=leastsq(@fit2,x0,[],[],X,Y);>>cmpx=x(1:4)+i.*x(5:8);>>Y1=real(cmpx(1).*exp(cmpx(2).*X)+cmpx(3).*exp(cmpx(4).*X));曲线拟合向导Genial@USTC2004-4-18>>plot(X,Y1,'r');>>holdon>>plot(X,Y,'+');LSQCURVEFIT:利用此函数可以在最小二乘意义上解决非线性曲线拟合(数据拟合)问题。也就是说,给定输入数据xdata,以及观测的输出数据ydata,找到系数x,使得函数F(x,xdata)能够最好的拟合向量值。LSQCURVEFIT利用与LSQNONLIN相同的算法。它的目的在于专门为数据拟合问题提供一个接口。在拟合的时候,2维、3维或者N维参数拟合是没有什么差别的。下面给出一个3维参数拟合的例子。待拟合函数是:z=a1*y.*x..^2+a2*sin(x)+a3*y.^3;建立的myfun.m的函数如下:functionF=myfun(a,data);x=data(1,:);y=data(2,:);F=a(1)*y.*x.^2+a(2)*sin(x)+a(3)*y.^3;下面的脚本展示了这么利用上面的函数:曲线拟合向导Genial@USTC2004-4-18>>xdata=[3.67.79.34.18.62.81.37.910.05.4];>>ydata=[16.5150.6263.124.7208.59.92.7163.9325.054.3];>>zdata=[95.0923.1160.6348.5989.1276.9745.681.8482.1744.47];>>data=[xdata;ydata];>>a0=[10,10,10];%初识揣测>>[a,resnorm]=lsqcurvefit(@myfun,a0,data,zdata)Maximumnumberoffunctionevaluationsexceeded;increaseoptions.MaxFunEvalsa=0.0088-34.2886-0.0000resnorm=2.2636e+004>>formatlong>>aa=0.00881645527493-34.28862491919983-0.00000655131499>>option=optimset('MaxFunEvals',800);>>[a,resnorm]=lsqcurvefit(@myfun,a0,data,zdata,[],[],option)Optimizationterminatedsuccessfully:RelativefunctionvaluechangingbylessthanOPTIONS.TolFunresnorm统计工具箱函数函数名描述nlinfit(非线性回归)采用Gauss-Newton法进行非线性最小二乘数据拟合lscov(线性回归)根据已知协方差矩阵进行最小二乘估计regressregstatsridgerstoolstepwise多元线性回归回归诊断脊回归(?Ridgeregress)多维响应表面可视化(RSV)交互式逐步回归具体例子请参阅相应文档曲线拟合向导Genial@USTC2004-4-18第3节加权曲线回归方法当拟合数据包含随机变量时,通常在针对误差有两个主要假设:●误差只在响应数据中存在,而不在预测数据中存在;●误差是满足零均值常数方差正态分布的数据变量。第二条假设方差为常数严重影响野点的出现。因为野点原来真实模式数据,他们可能引起真实拟合的潜在错误。为了改善拟合,你可以领用附加的尺度因子(也就是权值)来提高拟合的质量。将野点的权值设置得比较小,因此可以获得较好的拟合。你可以利用下面的三个工具箱来实施加权拟合。a.CurveFittingToolbox此工具箱对线性与非线性数据有通用的最小二乘拟合能力。权值是操作数设置中的一部分,你可以通过fitoptions进行设置。在曲线拟合工具箱中,权值可以是与数据相联系的一个权向量。b.StatisticsToolbox统计工具箱中的robustfit函数具有加权自动回归的能力。robustfit采用robust回归对数据进行拟合,其输出为回归系数。它也可以进行线性加权回归。调用语法结构是:ROBUSTFIT(X,Y,'WFUN',TUNE,'CONST')c.OptimizationToolbox你也可以利用优化工具箱的最小二乘求解器-----LSQNONLIN和LSQCURVEFIT函数实施加权最小二乘拟合。为了利用LSQNONLIN和LSQCURVEFIT实现加权最小二乘拟合,你需要针对你的拟合数据建立起一个方程。你可以在Solution27840中找到相应的例子。附:Solution27840如何利用优化工具箱的LSQNONLIN函数实现加权最小二乘拟合例子:1.制造准备拟合的样本数据。在本例子中,数据是叠加了噪声的负指数模型:>>xdata=0:.01:1;>>ydata=exp(-3*xdata)+randn(size(xdata))*.05;2.在图形中查看数据,即用plot画出xdata与ydata,用蓝色的点表示:>>plot(xdata,ydata,'b.');曲线拟合向导Genial@USTC2004-4-183.建立一个函数作为LSQNONLIN的输入,该函数包含你打算拟合的数据的方程。建立名为Mycurve.m的m文件:functionerr_weithted=mycurv(parameter,real_x,real_y)%想拟合的方程是:exp(parameter*xdata)%其中,parameter是未知的%fit=exp(parameter*real_x);fit=exp(parameter*real_x);err=fit-real_y;%对误差进行加权%在本例子中,,我们只对最后一项进行加权,并设置其他的项为0(这将%使得例子根据清楚)weight=[zeros(1,length(real_x)-1)1];%误差向量的权重err_weithted=err.*weight;4.调用优化程序,返回parameter_hat参数>>parameter_hat=lsqnonlin(@mycurv,3,[],[],[],xdata,ydata)Optimizationterminatedsuccessfully:First-orderoptimalitylessthanOPTIONS.TolFun,andnonegative/zerocurvaturedetectedparameter_hat返回利用m文件Mycurv的指定方程的产生值。5.获取了拟合的方程式,将parameter_hat带入指数方程,并在同一张图上画出。>>fitted=exp(parameter_hat*xdata);holdon>>plot(xdata,fitted,'ro');>>parameter_hat2=lsqnonlin(@mycurv,3,[],[],[],xdata,ydata)%不加权拟合>>fitted2=exp(parameter_hat2*xdata);>>plot(xdata,fitted2,'y-');>>legend('待拟合数据','加权拟合结果','直接拟合结果');比较拟合结果可以看出不加权时,曲线从所有数据点的中间穿过去(如黄色的线所示)。加权的时候,拟合曲线只通过最后一个点(因为只有该点权值非0)。曲线拟合向导Genial@USTC2004-4-18第4节:利用CurveFittingToolbox改善拟合结果很多因素对曲线拟合造成影响。下面列出各种提示有助于你提高拟合质量:●模型的选择:或者从MATLAB的模型库、或者用户自定义的模型的选择,是最主要的一个因素,试着用各种不同的模型对你的数据进行拟合比较;●数据预处理:在拟合前对数据进行预处理也很有用。这包括:▲对响应数据进行变换▲剔除Infs,NaNs,以及野点更多的细节请查阅CurveFittingToolbox的文档。●合理的拟合应该具有处理出现奇异而使得预测趋于无穷大的时候的能力。具体细节请查阅CurveFittingToolbox的文档●如果你提供越多的系数的估计信息,你的拟合越容易收敛。下面的提示有利于你加快拟合的速度,提高拟合的精度:▲在开始拟合的时候进行一些智能的揣测。如果你认为系数可能是某些值,那么就用那些值作为起始值▲如果缺少起始值的信息,试着用大量不同的起始值▲尽量重复训练参数。例如,如果你知道参数必须是正的,那么设置它的下限是0使得循环拟合过程。▲调整各种拟合操作数,例如:a.采用不同的算法b.增加迭代与函数评价的次数c.减小容许误差▲将数据分解为几个子集,对不同的子集采用不同的曲线拟合●复杂的问题最好通过进化的方式解决,即一个问题的少量独立变量先解决。低阶问题的解通常通过近似映射作为高阶问题解的起始点。例如,如果你的模型最好被描述为:y=c+a*exp(b*x)+d*sin(f*x)那么它经常最好每次拟合一个项,通常从最重要的项开始。你可以先拟合:y=c1+a1*exp(b1*x)然后利用拟合出的结果系数作为上式中的a,b,c的起始值进行完整的拟合。曲线拟合向导Genial@USTC2004-4-18第5节:其他相近方法或许MATLAB2002年2月的NewsandNotes杂志中有关曲线拟合的文章:AtmosphericCarbonDi-OxideModelingandtheCurveFittingToolbox或许对你有用。附:一个用fminsearch进行园的拟合的例子:function[xc,yc,r,fval,exitflag,output]=tlscirc(x,y)%TLScirclefitoptions=optimset('TolFun',1e-10);[x0,y0]=circfit(x,y);%centerestimate[z,fval,exitflag,output]=fminsearch(@circobj,[x0,y0],options,x,y);[f,r]=circobj(z,x,y);xc=z(1);yc=z(2);function[f,r]=circobj(z,x,y)%TLScirclefitobjectivefandradiusrn=length(x);X=x-z(1);Y=y-z(2);X2=X'*X;Y2=Y'*Y;r=sum(sqrt(X.^2+Y.^2))/n;f=X2+Y2-n*r^2;Thecircfitfunctionisusedaboveasaninitialestimator.Theobjectivevaluesoftlscircandcircfitdifferbynearly14%intheexamplebelow.x=[1;2;3;5;7;9];y=[7;6;7;8;7;5];plot(x,y,'bo'),holdon[xc,yc,r,f]=tlscirc(x,y)%[xc,yc,r,f]=[4.7398,2.9835,4.7142,1.2276]rectangle('Position',[xc-r,yc-r,2*r,2*r],'Curvature',[1,1],'EdgeColor','b')[xc,yc,r]=circfit(x,y)X=x-xc;Y=y-yc;f=sum((sqrt(X.^2+Y.^2)-r).^2)%[xc,yc,r,f]=[4.7423,3.8351,4.1088,1.3983]rectangle('Position',[xc-r,yc-r,2*r,2*r],'Curvature',[1,1],'EdgeColor','r')holdoff,axisequalGenial@USTC2004-4-17matlab非线性曲线拟合最近在用matlab做非线性曲线拟合,发现matlab功能确实很强大,总结其方法有如下几种:一、Matlab非线性拟合工具箱单一变量的曲线逼近Matlab有一个功能强大的曲线拟合工具箱cftool,使用方便,能实现多种类型的线性、非线性曲线拟合。假设我们要拟合的函数形式是y=a+(b-a)*c^2*(c^2-x^2)/((c^2-x^2)^2+(2*d*x)^2);其中a,b,c,d是待定系数。在命令行输入数据:x=8:0.01:12.4;y=real(epsilon);2、启动曲线拟合工具箱》cftool3、进入曲线拟合工具箱界面“CurveFittingtool”(1)点击“Data”按钮,弹出“Data”窗口;(2)利用Xdata和Ydata的下拉菜单读入数据x,y,可修改数据集名“Datasetname”,然后点击“Createdataset”按钮,退出“Data”窗口,返回工具箱界面,这时会自动画出数据集的曲线图;(3)点击“Fitting”按钮,弹出“Fitting”窗口;(4)点击“Newfit”按钮,可修改拟合项目名称“Fitname”,通过“Dataset”下拉菜单选择数据集,然后通过下拉菜单“Typeoffit”选择拟合曲线的类型,工具箱提供的拟合类型有:CustomEquations:用户自定义的函数类型Exponential:指数逼近,有2种类型,a*exp(b*x)、a*exp(b*x)+c*exp(d*x)Fourier:傅立叶逼近,有7种类型,基础型是a0+a1*cos(x*w)+b1*sin(x*w)Gaussian:高斯逼近,有8种类型,基础型是a1*exp(-((x-b1)/c1)^2)Interpolant:插值逼近,有4种类型,linear、nearestneighbor、cubicspline、shape-preservingPolynomial:多形式逼近,有9种类型,linear~、quadratic~、cubic~、4-9thdegree~Power:幂逼近,有2种类型,a*x^b、a*x^b+cRational:有理数逼近,分子、分母共有的类型是linear~、quadratic~、cubic~、4-5thdegree~;此外,分子还包括constant型SmoothingSpline:平滑逼近SumofSinFunctions:正弦曲线逼近,有8种类型,基础型是a1*sin(b1*x+c1)Weibull:只有一种,a*b*x^(b-1)*exp(-a*x^b)选择好所需的拟合曲线类型及其子类型,并进行相关设置:——如果是非自定义的类型,根据实际需要点击“Fitoptions”按钮,设置拟合算法、修改待估计参数的上下限等参数;——如果选CustomEquations,点击“New”按钮,弹出自定义函数等式窗口,有“LinearEquations线性等式”和“GeneralEquations构造等式”两种标签。在本例中选CustomEquations,点击“New”按钮,选择“GeneralEquations”标签,输入函数类型y=a+(b-a)*c^2*(c^2-x^2)/((c^2-x^2)^2+(2*d*x)^2),设置参数a、b、c、d的上下限,然后点击OK。5)类型设置完成后,点击“Apply”按钮,就可以在Results框中得到拟合结果,如下例:Generalmodel:f(x)=a+(b-a)*c^2*(c^2-x^2)/((c^2-x^2)^2+(2*d*x)^2)Coefficients(with95%confidencebounds):a=3.155(3.129,3.181)b=3.025(2.998,3.051)c=9.577(9.572,9.582)d=0.1387(0.1312,0.1462)Goodnessoffit:SSE:32.94R-square:0.924AdjustedR-square:0.9235RMSE:0.2746拟合曲线如下二、利用nlinfit函数实现,代码如下:clc;x=8:0.01:12.4;x=x;y=real(epsilon);y=y';myfunc=inline('beta(1)+(beta(2)-beta(1))*beta(3)^2*(beta(3)^2-x.^2)./((beta(3)^2-x.^2).^2+(2*beta(4)*x).^2)','beta','x');my_opts=statset('MaxIter',300,'TolFun',1e-12,'TolX',1e-12);beta=nlinfit(x,y,myfunc,[11101],my_opts);%调整初值可能导致不同结果,但貌似增加一个options对结果没起什么作用beta(1)beta(2)beta(3)beta(4)%testthemodelxx=min(x):0.01:max(x);yy=beta(1)+(beta(2)-beta(1))*beta(3)^2*(beta(3)^2-x.^2)./((beta(3)^2-x.^2).^2+(2*beta(4)*x).^2);figure;plot(x,y,'ro',xx,yy,'b');三、利用nlintool函数实现,代码如下:clc;x=8:0.01:12.4;y=real(epsilon);y=y';myfunc=inline('beta(1)+(beta(2)-beta(1))*beta(3)^2*(beta(3)^2-x.^2)./((beta(3)^2-x.^2).^2+(2*beta(4)*x).^2)','beta','x');nlintool(x,y,myfunc,[11101]);上述中y的取值是:y=2.73322.73182.73032.72872.72722.72562.72402.72242.72072.71902.71732.71562.71382.71202.71012.70832.70642.70442.70242.70042.69842.69632.69412.69202.68972.68752.68522.68282.68042.67802.67552.67302.67042.66782.66512.66242.65962.65672.65382.65082.64782.64472.64152.63832.63502.63162.62822.62472.62112.61742.61362.60982.60582.60182.59772.59352.58922.58482.58022.57562.57092.56602.56102.55592.55072.54532.53982.53422.52842.52242.51632.51002.50362.49692.49012.48312.47592.46842.46082.45292.44482.43642.42782.41882.40962.40012.39032.38022.36972.35882.34762.33592.32392.31132.29832.28482.27082.25622.24102.22512.20862.19132.17332.15442.13472.11392.09212.06922.04512.01961.99271.96421.93391.90171.86731.83051.79101.74841.70231.65211.59731.53691.46981.39461.30931.21091.09510.95570.78470.59220.46380.43300.44960.48750.53700.59380.65590.72230.79210.86520.94131.02041.10231.18721.27511.36611.46031.55801.65931.76441.87361.98742.10592.22962.35912.49492.63762.78822.94743.11653.29693.49033.69893.92554.17384.44864.75665.10695.51225.98806.54167.10437.36137.11606.71306.35256.05825.81825.61945.45195.30845.18405.07484.97804.89154.81374.74324.67904.62024.56624.51644.47024.42734.38744.35004.31514.28234.25144.22234.19494.16894.14434.12094.09884.07774.05764.03844.02014.00273.98603.97003.95463.93993.92583.91233.89933.88673.87473.86303.85183.84103.83063.82063.81083.80143.79243.78363.77513.76683.75893.75123.74373.73643.72943.72253.71593.70943.70323.69713.69123.68553.67993.67443.66913.66403.65903.65413.64943.64473.64023.63583.63163.62743.62333.61943.61553.61173.60803.60453.60103.59753.59423.59093.58783.58473.58163.57873.57583.57293.57023.56753.56483.56233.55973.55733.55493.55253.55023.54803.54583.54373.54163.53953.53753.53553.53363.53183.52993.52813.52643.52473.52303.52143.51983.51823.51673.51523.51373.51233.51093.50953.50823.50693.50563.50443.50323.50203.50083.49973.49863.49753.49643.49543.49443.49343.49253.49153.49063.48973.48893.48803.48723.48643.48563.48483.48413.48343.48273.48203.48133.48073.48003.47943.47883.47833.47773.47723.47663.47613.47563.47513.47473.47423.47383.47343.47303.47263.47223.47193.47153.47123.47093.47063.47033.47003.46973.46953.46923.46903.46883.46863.46843.46823.46803.46793.46773.46763.46743.46733.46723.46713.46703.46703.46693.46693.46683.46683.46683.46673.46673.46673.46683.46683.46683.46693.46693.46703.46703.46713.46723.46733.46743.46753.46763.46773.46793.46803.46823.46833.46853.46873.46893.46913.46933.46953.46973.46993.47013.47033.47063.47083.47113.47143.47163.47193.47223.47253.47283.47313.47343.47373.47403.47443.47473.47503.47543.47573.47613.47653.47683.47723.47763.47803.47843.47883.47923.47963.48003.48043.48093.4813PS:纵观上面三种拟合非线性函数的结果来看都并非理想,曲线变化比较剧烈的地方就表现比较明显了,还有待寻求更好的办法来求得理想曲线。参考:MATLAB在非线性曲线拟合中的应用小结摘要:归纳总结了非线性曲线拟合的方法、求解步骤和上机操作过程关键词:曲线拟合非线性MATLAB正文:1.曲线拟合的基本原理已知一组测定的数据(例如N个点(xi,yi)去求得自变量x和因变量y的一个近似解析表达式y=φ(x)。若记误差δi=φ(xi)-yi,i=1,2,…N,则要使误差的平方和最小,即要求:Q=∑δi=1N2i为最小,这就是常用的最小二乘法原理。2.MATLAB曲线拟合的相关方法2.1.函数形式:(1)多项式拟合函数polyfit,调用格式为:p=polyfit(x,y,n)其中x,y为参与曲线拟合的实验数据,n为拟合多项式的次数,函数返回值为拟合多项式的系数(按降幂排列)。n=1时,就为线性拟合。例1:给出表1数据,试用最小二乘法求一次和二次拟合多项式。表1数据x-1.00-0.75-0.50-0.2500.250.500.751.00y-0.22090.32950.88261.43922.00032.56453.13343.70614.2836在MATLAB命令窗口中输入:clear;close;x=-1:0.25:1;y=[-0.2209,0.3295,0.8826,1.4392,2.0003,2.5645,3.1334,3.7061,4.2836]p1=polyfit(x,y,1)p2=polyfit(x,y,2)y1=polyval(p1,x);y2=polyval(p2,x);plot(x,y,'+',x,y1,'r:',x,y2,'k-.')运行结果:1拟合多项式为:y*=2.0516+2.0131和y*=0.0313x2+2.2516x+2.20001(2)非线性数据拟合函数lsqcurvefit调用格式为:c=lsqcurvefi(t'fun',x0,xdata,ydata)其中'fun'为拟合函数的M-函数文件名,x0为初始向量,xdata,ydata为参与曲线拟合的实验数据。函数返回值c为非线性函数fun的拟合系数。例2:2004年全国大学生数学建模竞赛C题(酒后驾车)中给出某人在短时间内喝下两瓶啤酒后,间隔一定的时间测量他的血液中酒精含量y(毫克/百毫升),得到数据如表2。表2酒精含量与饮酒时间的实验数据时间(小时)0.250.50.751酒精含量3068735758281.522.533.544.55418282910776811121512685813141075150151674时间(小时)6酒精含量382518通过建立微分方程模型得到短时间内喝酒后血液中酒精浓度与时间的关系为:y=c1(e?c2t?e?c3t)(2)根据实验数据,利用非线性拟合函数lsqcurvefit,确定模型(2)式中的参数c1,c2,c3。求解过程为:先编写一个M-函数文件Example2_1:functionf=Example2_1(c,tdata)f=c(1)*(exp(-c(2)*tdata)-exp(-c(3)*tdata));保存后,在命令窗口中输入:cleartdata=[0.250.50.7511.522.533.544.55678910111213141516];ydata=[306875828277686858515041383528258151210774];c0=[111];2fori=1:50;c=lsqcurvefit('Example2_1',c0,tdata,ydata);c0=c;end得到最优解为:c=117.05,0.1930,1.9546从而得出拟合曲线:y=117.05(e0.1930t?e1.9546t)2.2.图形窗口形式(1)利用
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年09月济南市南部山区管委会卫健系统事业单位招聘工作人员16名(23日900开通)笔试历年专业考点(难、易错点)附带答案详解
- 劳务派遣补偿协议书
- 开年第一课全员安全意识培训
- 橡胶板在电子设备防震包装中的应用考核试卷
- 2025年墙纸装饰的承包合同
- 2024年09月江苏宿迁泗阳县引进医疗卫生高层次人才人员笔试历年专业考点(难、易错点)附带答案详解
- 2024年09月新疆博尔塔拉蒙古自治州事业单位招聘医疗岗136人笔试历年专业考点(难、易错点)附带答案详解
- 糖批发企业客户关系持续优化考核试卷
- 2024年09月广东清远市卫生健康局直属公立医院招聘医疗卫生专业技术人员76人笔试历年专业考点(难、易错点)附带答案详解
- 2025大陆居民赴澳旅游合同范本
- 四川广播电视台招聘笔试真题2024
- 2025年中小学教师资格考试的重要试题及答案
- 2025届山东省济南市一模生物试题(原卷版+解析版)
- 2025年共青团应知应会知识考试题库及答案
- 血液透析贫血的护理查房
- 土地承包合同易懂一点(2025年版)
- 企业健康管理计划规划方案讨论
- 隧道高空作业施工方案
- 雨季三防知识培训
- 危险性较大的分部分项工程专项施工方案严重缺陷清单(试行)
- 2025年上半年第二次商务部国际贸易经济合作研究院招聘7人重点基础提升(共500题)附带答案详解
评论
0/150
提交评论