资源描述:
《Matlab最小二乘法曲线拟合.doc》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、最小二乘法在曲线拟合中比较普遍。拟合的模型主要有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=Xypara中
2、包含了三个参数: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=Xy3.多重回归(乘积回归)设要拟合:y=a+b*x+c*t,其中x和t是预测变量,y是响应变量。设计矩阵为X=[ones(size(x))xt]%注意x,t大小相等!para=Xypolyfit函数polyfit函数不需要输入设计矩阵,在参数估计中,p
3、olyfit会根据输入的数据生成设计矩阵。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*
4、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
5、;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
6、=[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)例子例子例子例子例子例子例
7、子例子例子例子例子例子例子例子例子例子直线型例子2.多项式型的一个例子1900-2000年的总人口情况的曲线拟合clearall;closeall;%cftool提供了可视化的曲线拟合!t=[19001910192019301940195019601970198019902000]';y=[75.99591.972105.711123.203131.669150.697179.323203.212226.505249.633281.4220]';%t太大,以t的幂作为基函数会导致设计矩阵尺度太差,列变量几乎线性相依。变换为
8、[-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