Levenberg-Marquardt 的 MATLAB 代码

参考资料:

1,《精通MATLAB最优化计算(第2版)》作者:龚纯 等 的 第9章 9.3 小节 L-M 法

2,《数值分析》 作者:Timothy Sauer 的 第4章 4.4节 非线性最小二乘的 例子

第一本书里头虽然有代码,然而有错误,修正了错误之处

% opti_LM_test1
% 测试了 MATLAB最优化 书中的 L-M 的例子,结果是正确的
clear all;clc;close all;

syms t;
f = ...
    [t^2+t-1;
     2*t^2-3];
S = transpose(f)*f;

f_var = symvar(f);

t_init = -5  % 自变量的初始值
%%
u = 2
v = 1.5
beta = 0.4
eps = 1.0e-6

x = t_init;
x = transpose(x);% 删

jacobian_f = jacobian(f,f_var);
tol = 1;
%%  subs以后居然不是数值,而是符号!还要转换成double类型!!!
while tol>eps
    fxk = double(subs(f,f_var,x));
    Sxk = double(subs(S,f_var,x));  % step2: 计算 fxk Sxk

    delta_fxk = double(subs(jacobian_f,f_var,x));  % step3: 计算 delta_fxk

    delta_Sxk = transpose(delta_fxk)*fxk;   % step4: 计算 delta_Sxk

    while 1
        % step5: 计算Q,并解方程(Q+uI)delta_x = -delta_Sxk
        Q = transpose(delta_fxk)*delta_fxk;
        dx = -(Q+u*eye(size(Q)))\delta_Sxk;

        x1 = x + dx;

        fxk = double(subs(f,f_var,x1));
        Sxk_new = double(subs(S,f_var,x1));

        tol = norm(dx);   % step6: 计算中止条件 norm(dx)<eps 是否满足,不满足转step 7
        if tol<=eps
            break;
        end

        % step7:
        if Sxk_new < Sxk+beta*transpose(delta_Sxk)*dx
            u = u/v;
            break;
        else
            u = u*v;
            continue;
        end
    end

    x = x1;
end

t = x1
minf = double(subs(S,f_var,t))

测试的结果是正确的。

参考第二本书中的例子把上述算法改成了一个多变量的程序,基本上没什么改动

% opti_LM_test2
% 测试了 数值分析 Timothy Sauer 中 4.4节中的 4.19例
clear all;clc;close all;

x1 = -1; y1 = 0;
x2 = 1; y2 = 1/2;
x3 = 1; y3 = -1/2;

R1 = 1; R2 = 1/2; R3 = 1/2;
%
syms x y;
r1 = sqrt( (x-x1)^2 + (y-y1)^2 )-R1;
r2 = sqrt( (x-x2)^2 + (y-y2)^2 )-R2;
r3 = sqrt( (x-x3)^2 + (y-y3)^2 )-R3;

r = ...
    [r1;
     r2;
     r3]
%
f = r
clear r1 r2 r3 R1 R2 R3 x1 x2 x3 y1 y2 y3 x y r;
%%
S = transpose(f)*f
f_var = symvar(f)

t_init = [0 0]    %  初始值,要给出
u = 2
v = 1.5
beta = 0.4
eps = 1.0e-6
tol = 1
%%
x = t_init

jacobian_f = jacobian(f,f_var)
%%
while tol>eps
    fxk = double(subs(f,f_var,x));
    Sxk = double(subs(S,f_var,x));  % step2: 计算 fxk Sxk

    delta_fxk = double(subs(jacobian_f,f_var,x));  % step3: 计算 delta_fxk

    delta_Sxk = transpose(delta_fxk)*fxk;   % step4: 计算 delta_Sxk

    while 1
        % step5: 计算Q,并解方程(Q+uI)delta_x = -delta_Sxk
        Q = transpose(delta_fxk)*delta_fxk;
        dx = -(Q+u*eye(size(Q)))\delta_Sxk;

        x1 = x + dx‘; % 注意转置

        fxk = double(subs(f,f_var,x1));
        Sxk_new = double(subs(S,f_var,x1));

        tol = norm(dx);   % step6: 计算中止条件 norm(dx)<eps 是否满足,不满足转step 7
        if tol<=eps
            break;
        end

        % step7:
        if Sxk_new < Sxk+beta*transpose(delta_Sxk)*dx
            u = u/v;
            break;
        else
            u = u*v;
            continue;
        end
    end

    x = x1;
end
%%
format short;
opti_var_value = x1
minf = double(subs(S,f_var,opti_var_value))

结果也是正确的

细节和原理以后再补充

时间: 2024-08-04 01:20:38

Levenberg-Marquardt 的 MATLAB 代码的相关文章

SAR成像学习(四)距离方向成像matlab代码解析 2

如果发射信号是线性调频信号,上一次讲的距离成像算法流程(匹配滤波方法)依然可以用,但那个流程要求T x =4X 0 c >T p  .如果T x <T p  ,即幅宽相对较小的情况,上一讲中的流程会带来一个问题,解决这个问题的办法是pulse compression.本文将会讨论这个puse compression的原理和实现. 1 what is pulse compression 对于线性调频信号:p(t)=a(t)exp(jβt+jαt 2 ) ,信号持续时间为T p  ,瞬时频率为β+

Latex 中插入 Matlab 代码

这篇文章将介绍如何在 Latex 排版过程中添加 Matlab 代码 功能效果 主要有如下排版功能: 语法高亮 自动添加边框 自动添加行号 先上图,大家感受一下效果 listings 包 首先确保你能使用使用 listings 包 简单快捷的使用方法如下 \usepackage{listings} \lstset{language=Matlab} \begin{lstlisting} % Plot function f(x) = 2*x^3 - x - 2 ezplot('2*x^3-x-2',

Latex中Matlab代码的环境

需要用到listings宏包 使用方法: 导言区\usepackage{listings}\lstset{language=Matlab}      %代码语言使用的是matlab\lstset{breaklines}                   %自动将长的代码行换行排版\lstset{extendedchars=false}  %解决代码跨页时,章节标题,页眉等汉字不显示的问题 正文区:\begin{lstlisting}此处写下Matlab代码 \end{lstlisting}

多分类问题中,实现不同分类区域颜色填充的MATLAB代码(demo:Random Forest)

之前建立了一个SVM-based Ordinal regression模型,一种特殊的多分类模型,就想通过可视化的方式展示模型分类的效果,对各个分类区域用不同颜色表示.可是,也看了很多代码,但基本都是展示二分类,当扩展成多分类时就会出现问题,所以我的论文最后就只好画了boundary的图了.今天在研究Random Forest时,找到了下面的demo的MATLAB代码,该代码很好的实现了各分类区域的颜色填充,效果非常漂亮. 下面是一个Demo代码:Demo.m %% generate data

Poisson image editing算法实现的Matlab代码解析

之前我发了数篇系列博文来仔细研究Poisson Image Editing算法,每次重新审视和深入,仿佛都能有更为深刻的认识和很大的收获.这应该算是我这个系列的完结篇,会用用Matlab代码一点一点的演示,原文作者到底是如何设计和实现他那个强大且影响深远的算法的.希望你在看本文之前务必参考一下文章来了解算法原理,本文将主要讲解编程实现的问题,对于前面讲过的内容,我不会深究.但我个人总体的感觉是,现在图像处理算法对数学的要求是越来越高了,像泊松融合.泊松抠图这样的算法如果没有偏微分方程(本算法中涉

使用ecilpse(Java)调用Matlab代码

1 安装java环境: http://www.oracle.com/technetwork/java/javase/downloads/index.html 下载JDK最新版本并安装,CloudSim需要运行在jdk1.6以上版本. 以jdk1.6.0_24为例,默认的安装目录为C:\Program Files\Java\jdk1.6.0_24. 设置环境变量: 新建系统变量JAVA_HOME,变量值设为JDK安装目录,即C:\Program Files\Java\jdk1.6.0_24: 在P

hog特征原理详解及matlab代码学习笔记

1.HOG特征: 方向梯度直方图(Histogram of Oriented Gradient, HOG)特征是一种在计算机视觉和图像处理中用来进行物体检测的特征描述子.它通过计算和统计图像局部区域的梯度方向直方图来构成特征.Hog特征结合SVM分类器已经被广泛应用于图像识别中,尤其在行人检测中获得了极大的成功.需要提醒的是,HOG+SVM进行行人检测的方法是法国研究人员Dalal在2005的CVPR上提出的,而如今虽然有很多行人检测算法不断提出,但基本都是以HOG+SVM的思路为主. (1)主

在C#的Web项目中调用Matlab代码的方法

为了毕设的图形检索方向的研究,本人需要在信科的师兄师姐们已经完成的C#界面中,调用现在研究的算法的Matlab代码,以便看到实验的效果.前段时间已经拖延了1个多月,一方面因为实习越来越多事情,时间减少了很多:但更重要在于C#调用Matlab的方法真心麻烦,C#的Web项目中进行这个操作貌似会碰到更多细节上的问题.而且总是很不稳定,操作系统.Matlab或VS的版本.遗漏一些文件或步骤都会造成失败!这个问题本人已经搞了很长时间,直至前几天,在同学的帮助下,自己再弄一遍,总算成功了!下面我及时把这个

大脑提取每一个体素26领域的matlab代码

%-------------- outer loop for x= 1:40 for y =1:48 for z =1:34 %----------inter loop x=20; y=30; z=15; k = 1; for ztmp =-1:1 z_ztmp = z+ztmp; if z_ztmp <1 || z_ztmp >34 continue; end for ytmp =-1:1 y_ytmp = y+ytmp; if y_ytmp <1 || y_ytmp >48 c

【DPM】Deformable Part Models matlab代码在windows下的调试过程

我下载的是voc-release5 1.按照这篇文章,都操作了一遍:http://blog.csdn.net/pozen/article/details/7023742#quote 2.运行demo不成功 继续按照http://cfanz.cn/index.php?c=article&a=read&id=128978的方法修改 2.1在按这一篇运行  >> mex cascade.cpp model.cpp  时报错:  D:\PROGRA~1\MATLAB\R2012B\BI