您好,欢迎访问三七文档
当前位置:首页 > 办公文档 > 求职简历 > Matlab最小二乘法曲线拟合
最小二乘法在曲线拟合中比较普遍。拟合的模型主要有1.直线型2.多项式型3.分数函数型4.指数函数型5.对数线性型6.高斯函数型......一般对于LS问题,通常利用反斜杠运算“\”、fminsearch或优化工具箱提供的极小化函数求解。在Matlab中,曲线拟合工具箱也提供了曲线拟合的图形界面操作。在命令提示符后键入:cftool,即可根据数据,选择适当的拟合模型。“\”命令1.假设要拟合的多项式是:y=a+b*x+c*x^2.首先建立设计矩阵X:X=[ones(size(x))xx^2];执行:para=X\ypara中包含了三个参数:para(1)=a;para(2)=b;para(3)=c;这种方法对于系数是线性的模型也适应。2.假设要拟合:y=a+b*exp(x)+cx*exp(x^2)设计矩阵X为X=[ones(size(x))exp(x)x.*exp(x.^2)];para=X\y3.多重回归(乘积回归)设要拟合:y=a+b*x+c*t,其中x和t是预测变量,y是响应变量。设计矩阵为X=[ones(size(x))xt]%注意x,t大小相等!para=X\ypolyfit函数polyfit函数不需要输入设计矩阵,在参数估计中,polyfit会根据输入的数据生成设计矩阵。1.假设要拟合的多项式是:y=a+b*x+c*x^2p=polyfit(x,y,2)然后可以使用polyval在t处预测:y_hat=polyval(p,t)polyfit函数可以给出置信区间。[pS]=polyfit(x,y,2)%S中包含了标准差[y_fit,delta]=polyval(p,t,S)%按照拟合模型在t处预测在每个t处的95%CI为:(y_fit-1.96*delta,y_fit+1.96*delta)2.指数模型也适应假设要拟合:y=a+b*exp(x)+c*exp(x.?2)p=polyfit(x,log(y),2)fminsearch函数fminsearch是优化工具箱的极小化函数。LS问题的基本思想就是残差的平方和(一种范数,由此,LS产生了许多应用)最小,因此可以利用fminsearch函数进行曲线拟合。假设要拟合:y=a+b*exp(x)+c*exp(x.?2)首先建立函数,可以通过m文件或函数句柄建立:x=[......]';y=[......]';f=@(p,x)p(1)+p(2)*exp(x)+p(3)*exp(x.?2)%注意向量化:p(1)=a;p(2)=b;p(3)=c;%可以根据需要选择是否优化参数%opt=options()p0=ones(3,1);%初值para=fminsearch(@(p)(y-f(p,x)).^2,p0)%可以输出Hessian矩阵res=y-f(para,x)%拟合残差曲线拟合工具箱提供了很多拟合函数,对大样本场合比较有效!非线性拟合nlinfit函数clearall;x1=[0.42920.42690.3810.40150.41170.3017]';x2=[0.000140.000590.01260.00610.004250.0443]';x=[x1x2];y=[0.5170.5090.440.4660.4790.309]';f=@(p,x)2.350176*p(1)*(1-1/p(2))*(1-(1-x(:,1).^(1/p(2))).^p(2)).^2.*(x(:,1).^(-1/p(2))-1).^(-p(2)).*x(:,1).^(-1/p(2)-0.5).*x(:,2);p0=[80.5]';opt=optimset('TolFun',1e-3,'TolX',1e-3);%[pR]=nlinfit(x,y,f,p0,opt)例子例子例子例子例子例子例子例子例子例子例子例子例子例子例子例子直线型例子2.多项式型的一个例子1900-2000年的总人口情况的曲线拟合clearall;closeall;%cftool提供了可视化的曲线拟合!t=[19001910192019301940195019601970198019902000]';y=[75.99591.972105.711123.203131.669150.697179.323203.212226.505249.633281.4220]';%t太大,以t的幂作为基函数会导致设计矩阵尺度太差,列变量几乎线性相依。变换为[-11]上s=(t-1950)/50;%plot(s,y,'ro');%回归线:y=a+bxmx=mean(s);my=mean(y);sx=std(s);sy=std(y);r=corr(s,y);b=r*sy/sx;a=my-b*mx;rline=a+b.*s;figure;subplot(3,2,[12])plot(s,y,'ro',s,rline,'k');%title('多项式拟合');set(gca,'XTick',s,'XTickLabel',sprintf('%d|',t));%holdon;n=4;PreYear=[201020152020];%预测年份tPreYear=(PreYear-1950)/50;Y=zeros(length(t),n);res=zeros(size(Y));delta=zeros(size(Y));PrePo=zeros(length(PreYear),n);Predelta=zeros(size(PrePo));fori=1:n[pS(i)]=polyfit(s,y,i);[Y(:,i)delta(:,i)]=polyval(p,s,S(i));%拟合的Y[PrePo(:,i)Predelta(:,i)]=polyval(p,tPreYear,S(i));%预测res(:,i)=y-Y(:,i);%残差end%plot(s,Y);%2009a自动添加不同颜色%legend('data','regressionline','1stpoly','2ndpoly','3rdpoly','4thpoly',2)%plot(tPreYear,PrePo,'');%holdoff%plot(Y,res,'o');%残差图r=corr(s,Y).^2%R^2%拟合误差估计CIYearAdd=[t;PreYear'];tYearAdd=[s;tPreYear'];CFtit={'一阶拟合','二阶拟合','三阶拟合','四阶拟合'};forcol=1:nsubplot(3,2,col+2);plot(s,y,'ro',s,Y(:,col),'g-');%原始数据和拟合数据legend('Original','Fitted',2);holdon;plot(s,Y(:,col)+2*delta(:,col),'r:');%95%CIplot(s,Y(:,col)-2*delta(:,col),'r:');plot(tPreYear,PrePo(:,col),'');%预测值plot(tPreYear,PrePo(:,col)+2*Predelta(:,col));%预测95%CIplot(tPreYear,PrePo(:,col)-2*Predelta(:,col));axis([-1.21.80400]);set(gca,'XTick',tYearAdd,'XTickLabel',sprintf('%d|',YearAdd));title(CFtit{col});holdoff;endfigure;%残差图forcol=1:nsubplot(2,2,col);plot(Y(:,i),res(:,i),'o');end一个非线性的应用例子(多元情况)在百度知道中,要拟合y=a*x1^n1+b*x2^n2+c*x3^n3%注:只是作为应用,模型不一定正确!!!%x2=x3!!!y=[1080.941083.031162.801155.611092.821099.261161.061258.051299.031298.301440.221641.301672.211612.731658.641752.421837.992099.292675.472786.332881.07]';x1=[11.051.11.151.21.251.31.351.41.451.51.551.61.651.71.751.81.851.91.952]';x2=[11.0251.051.0751.11.1251.151.1751.21.2251.2501.2751.31.3251.3501.3751.41.4251.451.4751.5]';x3=[11.0251.051.0751.11.1251.151.1751.21.2251.2501.2751.31.3251.3501.3751.41.4251.451.4751.5]';x=[x1x2x3];f=@(p,x)p(1)*x(:,1).^p(2)+p(3)*x(:,2).^p(4)+p(5)*x(:,3).^p(6);p0=ones(6,1);p=fminsearch(@(p)sum(y-f(p,x)).^2,p0)res=y-f(p,x);res2=res.^2%失败的模型
本文标题:Matlab最小二乘法曲线拟合
链接地址:https://www.777doc.com/doc-6977497 .html