matlab最小二乘法的非线性参数拟合(精荐)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
---------------------------------------------------------------最新资料推荐------------------------------------------------------ matlab最小二乘法的非线性参数拟合(精荐)
matlab 最小二乘法的非线性参数拟合 matlab 最小二乘法的非线性参数拟合首先说一下匿名函数:
在创建匿名函数时,Matlab 记录了关于函数的信息,当使用句柄调用该函数的时候,Matlab 不再进行搜索,而是立即执行该函数,极大提高了效率。
所以首选匿名函数。
具体拟合时可以使用的方法如下:
1 曲线拟合工具箱1 曲线拟合工具箱提供了很多拟合函数,使用简单非线性拟合 nlinfit 函数 clear all; x1=[0.4search 或优化工具箱提供的极小化函数求解。
在 Matlab 中,曲线拟合工具箱也提供了曲线拟合的图形界面操作。
在命令提示符后键入:
cftool,即可根据数据,选择适当的拟合模型。
\命令\命令 1.假设要拟合的多项式是:
y=a+b*x+c*x.首先建立设计矩阵 X:
X=[ones(size(x)) x x]; 执行:
para=X\y para 中包含了三个参数:
para(1)=a;para(2)=b;para(3)=c; 这种方法对于系数是线性的模型也适应。
1 / 10
2.假设要拟合:
y=a+b*exp(x)+cx*exp(x) 设计矩阵 X 为 X=[ones(size(x)) exp(x) x.*exp(x.)]; 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 函数不需要输入设计矩阵,在参数估计中,polyfit 会根据输入的数据生成设计矩阵。
1.假设要拟合的多项式是:
y=a+b*x+c*x 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)).,p0) %可以输出 Hessian 矩阵 res=y-f(para,x)%拟合残差 3.多项式型 3.多项式型的一个例子 1900-2019 年的总人口情况的曲线拟合 clear all;close all; %cftool 提供了可视化的曲线拟合! t=[1900 1910 1920 1930 1940 1950 1960 1970 1980 1990 2019]’; 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); b=r*sy/sx; a=my-b*mx; rline=a+b.*s; figure; subplot(3,2,[1 2]) plot(s,y,’ro’,s,rline,’k’);% title(‘多项式拟合’); set(gca,’XTick’,s,’XTickLabel’,sprintf(‘%d|’,t)); %ho ld on; n=4; PreYear=[2010 2019 2020];%预测年份tPreYear=(PreYear-1950)/50; Y=zeros(length(t),n); res=zeros(size(Y)); delta=zeros(size(Y));
3 / 10
PrePo=zeros(length(PreYear),n); Predelta=zeros(size(PrePo));
for i=1:n [p S(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’,’regression line’,’1st poly’,’2nd poly’,’3rd poly’,’4th poly’,2) %
plot(tPreYear,PrePo,’’); % hold off % plot(Y,res,’o’);%
残差图r=corr(s,Y).%R%拟合误差估计CI YearAdd=[t;PreYear’]; tYearAdd=[s;tPreYear’]; CFtit={‘一
阶拟合’,’二阶拟合’,’三阶拟合’,’四阶拟合’}; for
col=1:n subplot(3,2,col+2); plot(s,y,’ro’,s,Y(:,col),’g-’);%原始数据和拟合数据legend(‘Original’,’Fitted’,2); hold on; plot(s,Y(:,col)+2*delta(:,col),’r:’);%95% CI plot(s,Y(:,col)-2*delta(:,col),’r:’);
plot(tPreYear,PrePo(:,col),’’);%预测值
plot(tPreYear,PrePo(:,col)+2*Predelta(:,col));%预测95% CI plot(tPreYear,PrePo(:,col)-2*Predelta(:,col));
axis([-1.2 1.8 0 400]); set(gca,’XTick’,tYearAdd,’XTickLabel’,sprintf(‘%d|’,Y earAdd)); title(CFtit{col}); hold off; end figure;%