最近科研中用到LM算法,在研究,其基本原理可以再如下网页查看到:
http://blog.sina.com.cn/s/blog_4a8e595e01014tvb.html
讲解比较深刻。基本能看懂。用matlab也能跑通。下面的代码是这个博客上的,也是别的很多地方的LM范例。
代码如下:(下面的代码直接粘贴在上面的后面就可以了。)
a0=[1,2];
options=optimset('Algorithm','Levenberg-Marquardt',...
'Display','iter');
a=lsqnonlin(@EFunctionEst,a0,[],[],options,data_1,obs_1)
plot(data_1,obs_1,'o');
hold on
plot(data_1,a(1)*exp(-a(2)*data_1));
hold off
其中EFunctionEst的代码如下:
function E = EFunctionEst(a, x,y )
%这是一个测试文件用于测试 lsqnonlin
% Detailed explanation goes here
x=x(:);
y=y(:);
Y=a(1)*exp(-a(2)*x);
E=y-Y;
end
迭代13次就可以完成了。结果如下:
First-Order Norm of
Iteration Func-count Residual optimality Lambda step
0 3 1436 20.8 0.01
1 9 1277.57 64.1 10 2.1744
2 13 1125.58 166 100 0.687293
3 17 1058.07 227 1000 0.167484
4 20 932.671 340 100 0.216115
5 24 827.557 327 1000 0.225789
6 27 810.124 63.5 100 0.0731397
7 30 737.768 60.2 10 0.598774
8 33 402.19 341 1 3.89167
9 36 51.9641 265 0.1 8.27918
10 39 1.15523 6.36 0.01 3.76119
11 42 1.0659 0.0597 0.001 0.208848
12 45 1.06589 0.00305 0.0001 0.00278028
13 48 1.06589 6.09e-005 1e-005 3.51923e-005