matlab ,lsqnonlin的使用 LM算法

最近科研中用到LM算法,在研究,其基本原理可以再如下網頁查看到:

 http://blog.sina.com.cn/s/blog_4a8e595e01014tvb.html

講解比較深刻。基本能看懂。用matlab也能跑通。下面的代碼是這個博客上的,也是別的很多地方的LM範例。

Levenberg-Marquardt快速入門教程(薦)
例子程序(MATLAB源程序)
本程序不到100行,實現了求雅克比矩陣的解析解,Levenberg-Marquardt最優化迭代,演示瞭如何求解擬合問題。採用蕭樹鐵主編的《數學試驗》(第二版)(高等教育出版社)中p190例2(血藥濃度)來演示。在MATLAB中可直接運行得到最優解。

 

*************************************************************************

% 計算函數f的雅克比矩陣,是解析式
syms a b y x real;
f=a*exp(-b*x);
Jsym=jacobian(f,[a b])


% 擬合用數據。參見《數學試驗》,p190,例2
data_1=[0.25 0.5 1 1.5 2 3 4 6 8];
obs_1=[19.21 18.15 15.36 14.10 12.89 9.32 7.45 5.24 3.01];

% 2. LM算法
% 初始猜測s
a0=10; b0=0.5;
y_init = a0*exp(-b0*data_1);
% 數據個數
Ndata=length(obs_1);
% 參數維數
Nparams=2;
% 迭代最大次數
n_iters=50;
% LM算法的阻尼係數初值
lamda=0.01;

% step1: 變量賦值
updateJ=1;
a_est=a0;
b_est=b0;

% step2: 迭代
for it=1:n_iters
    if updateJ==1
        % 根據當前估計值,計算雅克比矩陣
        J=zeros(Ndata,Nparams);
        for i=1:length(data_1)
            J(i,:)=[exp(-b_est*data_1(i)) -a_est*data_1(i)*exp(-b_est*data_1(i))];
        end
        % 根據當前參數,得到函數值
        y_est = a_est*exp(-b_est*data_1);
        % 計算誤差
        d=obs_1-y_est;
        % 計算(擬)海塞矩陣
        H=J'*J;
        % 若是第一次迭代,計算誤差
        if it==1
            e=dot(d,d);
        end
   

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章