上一篇博客中介绍的高斯牛顿算法可能会有J'*J为奇异矩阵的情况,这时高斯牛顿法稳定性较差,可能导致算法不收敛。比如当系数都为7或更大的时候,算法无法给出正确的结果。

Levenberg-Marquardt法一定程度上修正了这个问题。

计算迭代系数deltaX公式如下:

当lambda很小的时候,H占主要地位,公式变为高斯牛顿法,当lambda很大的时候,H可以忽略,公式变为最速下降法。该方法提供了更稳定的deltaX。

算法步骤如下:

1.给定初始系数,以及初始优化半径u。

2.计算使用当前系数的模型得到的结果与测量结果差值e。

3.使用迭代公式更新带解算系数。

4.计算更新后系数的模型得到的结果与测量结果差值ecur。

5.如果ecur>e,则u=2*u;否则u=u/2,并且更新模型系数x(k+1)=x(k)+deltaX。

6.判断算法是否收敛,不收敛返回2,否则结束。

代码如下:

clear all;
close all;
clc;
warning off all; a=;b=;c=; %待求解的系数 x=(:0.01:)';
w=rand(length(x),)*-; %生成噪声
y=exp(a*x.^+b*x+c)+w; %带噪声的模型
plot(x,y,'.') pre=rand(,);
update=;
u=0.1;
for i=:
if update==
f = exp(pre()*x.^+pre()*x+pre());
g = y-f; %计算误差 p1 = exp(pre()*x.^+pre()*x+pre()).*x.^; %对a求偏导
p2 = exp(pre()*x.^+pre()*x+pre()).*x; %对b求偏导
p3 = exp(pre()*x.^+pre()*x+pre()); %对c求偏导
J = [p1 p2 p3]; %计算雅克比矩阵
H=J'*J;
if i==
e=dot(g,g);
end
end delta = inv(H+u*eye(length(H)))*J'* g;
pcur = pre+delta; %迭代
fcur = exp(pcur()*x.^+pcur()*x+pcur());
ecur = dot(y-fcur,y-fcur); if ecur<e %比较两次差值,新模型好则使用
if norm(pre-pcur)<1e-10
break;
end
u=u/;
pre=pcur;
e=ecur;
update=;
else
u=u*;
update=;
end
end hold on;
plot(x,exp(a*x.^+b*x+c),'r');
plot(x,exp(pre()*x.^+pre()*x+pre()),'g'); %比较一下
[a b c]
pre'

迭代结果,其中散点为带噪声数据,红线为原始模型,绿线为解算模型

参考:

《视觉slam十四讲》

http://www.docin.com/p-63281100.html

matlab练习程序(Levenberg-Marquardt法最优化)的更多相关文章

  1. matlab练习程序(射线法判断点与多边形关系)

    依然是计算几何. 射线法判断点与多边形关系原理如下: 从待判断点引出一条射线,射线与多边形相交,如果交点为偶数,则点不在多边形内,如果交点为奇数,则点在多边形内. 原理虽是这样,有些细节还是要注意一下 ...

  2. matlab练习程序(高斯牛顿法最优化)

    计算步骤如下: 图片来自<视觉slam十四讲>6.2.2节. 下面使用书中的练习y=exp(a*x^2+b*x+c)+w这个模型验证一下,其中w为噪声,a.b.c为待解算系数. 代码如下: ...

  3. matlab实现高斯牛顿法、Levenberg–Marquardt方法

    高斯牛顿法: function [ x_ans ] = GaussNewton( xi, yi, ri) % input : x = the x vector of 3 points % y = th ...

  4. matlab练习程序(SUSAN检测)

    matlab练习程序(SUSAN检测) SUSAN算子既可以检测角点也可以检测边缘,不过角点似乎比不过harris,边缘似乎比不过Canny.不过思想还是有点意思的. 主要思想就是:首先做一个和原图像 ...

  5. atitit.添加win 系统服务 bat批处理程序服务的法总结instsrv srvany java linux

    atitit.添加win 系统服务 bat批处理程序服务的法总结instsrv srvany  java linux 系统服务不同于普通视窗系统应用程式.不可能简简单单地通过运行一个EXE就启动视窗系 ...

  6. atitit.加入win 系统服务 bat批处理程序服务的法总结instsrv srvany java linux

    atitit.加入win 系统服务 bat批处理程序服务的法总结instsrv srvany  java linux 系统服务不同于普通视窗系统应用程式.不可能简简单单地通过执行一个EXE就启动视窗系 ...

  7. (转)matlab练习程序(HOG方向梯度直方图)

    matlab练习程序(HOG方向梯度直方图)http://www.cnblogs.com/tiandsp/archive/2013/05/24/3097503.html HOG(Histogram o ...

  8. matlab练习程序(对应点集配准的四元数法)

    这个算是ICP算法中的一个关键步骤,单独拿出来看一下. 算法流程如下: 1.首先得到同名点集P和X. 2.计算P和X的均值up和ux. 3.由P和X构造协方差矩阵sigma. 4.由协方差矩阵sigm ...

  9. matlab练习程序(点集配准的SVD法)

    上一篇博客中我们使用了四元数法计算ICP. 本篇我们使用SVD计算ICP. 下面是<视觉slam十四讲>中的计算方法: 计算步骤如下: 我们看到,只要求出了两组点之间的旋转,平移是非常容易 ...

随机推荐

  1. redis epoll 原理梗概

    redis 是一个单线程却性能非常好的内存数据库, 主要用来作为缓存系统. redis 采用网络IO多路复用技术来保证在多连接的时候, 系统的高吞吐量.为什么 Redis 中要使用 I/O 多路复用这 ...

  2. Base 64 加密、解密

    1.写一个公共类 package com.boyutec.oss.sys.utils; import java.io.UnsupportedEncodingException; import java ...

  3. Ubuntu18.04 下修改 root密码

    首先打开终端输入命令 sudo passwd root 然后依次是当前用户密码,将要设置root密码,确认root密码.切换root看一下 备注: #符号 是系统用户 root$符号 是你创建的用户 ...

  4. Xpath定位方法深入探讨及元素定位失败常见情况

    一.Xpath定位方法深入探讨 (1)常用的Xpath定位方法及其特点 使用绝对路径定位元素. 例如: driver.findElement(By.xpath("/html/body/div ...

  5. 带分页功能的SSH整合,DAO层经典封装

    任何一个封装讲究的是,使用,多状态.Action:     任何一个Action继承分页有关参数类PageManage,自然考虑的到分页效果,我们必须定义下几个分页的参数.并根据这个参数进行查值. 然 ...

  6. Adam

    Adam 方法 Adam 方法将惯性保持和环境感知这两个优点集于一身.一方面, Adam 记录梯度的一阶矩(first moment),即过往梯度与当前梯度的平均,这体现了惯性保持:另一方面,Adam ...

  7. Python机器学习笔记:深入学习Keras中Sequential模型及方法

    Sequential 序贯模型 序贯模型是函数式模型的简略版,为最简单的线性.从头到尾的结构顺序,不分叉,是多个网络层的线性堆叠. Keras实现了很多层,包括core核心层,Convolution卷 ...

  8. #17 random&json模块

    前言 本节将讲解两个模块,一个是随机模块random,一个是字符串和字典之间的转换模块json,这两个模块使用率还是很高的,来认识一下! 一.random模块 random的官方文档:https:// ...

  9. netty源码解解析(4.0)-1 核心架构

    netty是java开源社区的一个优秀的网络框架.使用netty,我们可以迅速地开发出稳定,高性能,安全的,扩展性良好的服务器应用程序.netty封装简化了在服务器开发领域的一些有挑战性的问题:jdk ...

  10. Springboot项目打包成jar运行2种方式

    最近公司有个项目需要移植到SpringBoot框架上,项目里面又有许多第三方jar包,在linux服务器上最方便的就是用jar的方式来运行SpringBoot项目了,因此我研究了2种打jar包的方式, ...