Matlab学习手记——Matlab非线性数据拟合:高斯牛顿法

本文介绍了一种使用高斯牛顿法进行非线性数据拟合的方法,并通过具体实例展示了该方法的有效性和高效性。通过适当选择初始值并进行迭代计算,可以快速获得精确的拟合结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

函数功能:高斯牛顿法实现非线性数据拟合。

  • 代码
clear;clc;
M=1000;
Te=20;
% 模型
t=Te*(1:M)';
load noise;  % 噪音可自己添加
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]';
% 迭代过程
for i=1:M
  [J,dF] = GNA(p0,t,Et);
  p = p0+(J'*J)\J'*dF;
if norm(p-p0)/norm(p0)<1e-6
    break;
  end
  p0 = p;
end
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('Measured time(\mus)');
ylabel('Amplitude');
title('Models VS Fitting');
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.3030   48.8801    0.3971  198.6767    0.3057  791.1436;

    仅七次迭代就得到了结果,速度快,精度高。

    对比Matlab自带函数nlinfit和lsqcurvefit的计算结果:

    Nlinfit:0.3030   48.8801    0.3971  198.6768    0.3057  791.1437

    Lsqcurvefit:0.3030   48.8795    0.3970  198.6615    0.3057  791.1156

 

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值