高斯牛顿法做非线性拟合Word文件下载.docx
《高斯牛顿法做非线性拟合Word文件下载.docx》由会员分享,可在线阅读,更多相关《高斯牛顿法做非线性拟合Word文件下载.docx(2页珍藏版)》请在冰豆网上搜索。
t=Te*(1:
M)'
;
loadnoise;
%噪音可自己添加
Et1=0.4*exp(-t/50)+0.6*exp(-t/200);
Et2=0.4*exp(-(t/50).^2)+0.6*exp(-t/200);
Et3=0.3*exp(-t/50)+0.4*exp(-t/200)+0.3*exp(-t/800);
Et4=0.3*exp(-(t/50).^2)+0.4*exp(-t/200)+0.3*exp(-t/800);
Et=Et4+noise;
%%
%选择合适的初始值很重要
%p0=[0.5,10,0.5,100];
p0=[0.5,50,0.5,100,0.5,500]'
%迭代过程
fori=1:
M
[J,dF]=GNA(p0,t,Et);
p=p0+(J'
*J)\J'
*dF;
ifnorm(p-p0)/norm(p0)<
1e-6
break;
end
p0=p;
disp(p);
fit=p
(1)*exp(-(t/p
(2)).^2)+p(3)*exp(-t/p(4))+p(5)*exp(-t/p(6));
plot(t,Et,t,fit)
xlabel('
Measuredtime(\mus)'
);
ylabel('
Amplitude'
title('
ModelsVSFitting'
legend('
Model'
'
Fitting'
)
function[J,dE]=GNA(p,t,Et)
%计算Jacobi矩阵和拟合误差
%p为未知参数
p1=p
(1);
p2=p
(2);
p3=p(3);
p4=p(4);
p5=p(5);
p6=p(6);
f=p1*exp(-(t/p2).^2)+p3*exp(-t/p4)+p5*exp(-t/p6);
%拟合函数表达式
fp1=exp(-t.^2/p2^2);
fp2=(2*p1*t.^2.*exp(-t.^2/p2^2))/p2^3;
fp3=exp(-t/p4);
fp4=(p3*t.*exp(-t/p4))/p4^2;
fp5=exp(-t/p6);
fp6=(p5*t.*exp(-t/p6))/p6^2;
J=[fp1,fp2,fp3,fp4,fp5,fp6];
dE=Et-f;
计算结果如下:
0.303048.88010.3971198.67670.3057791.1436
仅7次迭代就能出结果,结果精度高,速度非常快。
对比Matlab自带函数nlinfit和lsqcurvefit的计算结果:
Nlinfit:
0.303048.88010.3971198.67680.3057791.1437
Lsqcurvefit:
0.303048.87950.3970198.66150.3057791.1156
三者结果差别很小,计算结果都相当准确。