matlab最小二乘法的非线性参数拟合

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

matlab最小二乘法的非线性参数拟合

首先说一下匿名函数:在创建匿名函数时,Matlab记录了关于函数的信息,当使用句柄调用该函数的时候,Matlab不再进行搜索,而是立即执行该函数,极大提高了效率。所以首选匿名函数。具体拟合时可以使用的方法如下:

1 曲线拟合工具箱提供了很多拟合函数,使用简单

非线性拟合nlinfit函数

clear all;

x1=[0.4292 0.4269 0.381 0.4015 0.4117 0.3017]';

x2=[0.00014 0.00059 0.0126 0.0061 0.00425 0.0443]';

x=[x1 x2];

y=[0.517 0.509 0.44 0.466 0.479 0.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=[8 0.5]';

opt=optimset('TolFun',1e-3,'TolX',1e-3);%

[p R]=nlinfit(x,y,f,p0,opt)

2 最小二乘法在曲线拟合中比较普遍。拟合的模型主要有

1.直线型

2.多项式型

3.分数函数型

4.指数函数型

5.对数线性型

6.高斯函数型

一般对于LS问题,通常利用反斜杠运算“\”、fminsearch或优化工具箱提供的极小化函数求解。在Matlab中,曲线拟合工具箱也提供了曲线拟合的图形界面操作。在命令提示符后键入:cftool,即可根据数据,选择适当的拟合模型。

“\”命令

1.假设要拟合的多项式是:y=a+b*x+c*x^

2.首先建立设计矩阵X:

X=[ones(size(x)) x x^2];

执行:

para=X\y

para中包含了三个参数: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\y

3.多重回归(乘积回归)

设要拟合:y=a+b*x+c*t,其中x和t是预测变量,y是响应变量。设计矩阵为X=[ones(size(x)) x t] %注意x,t大小相等!

para=X\y

polyfit函数

polyfit函数不需要输入设计矩阵,在参数估计中,polyfit会根据输入的数据生成设计矩阵。

1.假设要拟合的多项式是:y=a+b*x+c*x^2

p=polyfit(x,y,2)

然后可以使用polyval在t处预测:

y_hat=polyval(p,t)

polyfit函数可以给出置信区间。

[p S]=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)%拟合残差

3.多项式型的一个例子

1900-2000年的总人口情况的曲线拟合

clear all;close all;

%cftool提供了可视化的曲线拟合!

t=[1900 1910 1920 1930 1940 1950 1960 1970 1980 1990 2000]';

y=[75.995 91.972 105.711 123.203 131.669 150.697 179.323 203.212 226.505 249.633 281.4220]';

%t太大,以t的幂作为基函数会导致设计矩阵尺度太差,列变量几乎线性相依。变换为[-1 1]上

s=(t-1950)/50;

%plot(s,y,'ro');

%回归线:y=a+bx

mx=mean(s);my=mean(y);

sx=std(s);sy=std(y);

r=corr(s,y);

相关文档
最新文档