上一篇博客中介绍的高斯牛顿算法可能会有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,否则结束。

代码如下:

  1. clear all;
  2. close all;
  3. clc;
  4. warning off all;
  5.  
  6. a=;b=;c=; %待求解的系数
  7.  
  8. x=(:0.01:)';
  9. w=rand(length(x),)*-; %生成噪声
  10. y=exp(a*x.^+b*x+c)+w; %带噪声的模型
  11. plot(x,y,'.')
  12.  
  13. pre=rand(,);
  14. update=;
  15. u=0.1;
  16. for i=:
  17. if update==
  18. f = exp(pre()*x.^+pre()*x+pre());
  19. g = y-f; %计算误差
  20.  
  21. p1 = exp(pre()*x.^+pre()*x+pre()).*x.^; %对a求偏导
  22. p2 = exp(pre()*x.^+pre()*x+pre()).*x; %对b求偏导
  23. p3 = exp(pre()*x.^+pre()*x+pre()); %对c求偏导
  24. J = [p1 p2 p3]; %计算雅克比矩阵
  25. H=J'*J;
  26. if i==
  27. e=dot(g,g);
  28. end
  29. end
  30.  
  31. delta = inv(H+u*eye(length(H)))*J'* g;
  32. pcur = pre+delta; %迭代
  33. fcur = exp(pcur()*x.^+pcur()*x+pcur());
  34. ecur = dot(y-fcur,y-fcur);
  35.  
  36. if ecur<e %比较两次差值,新模型好则使用
  37. if norm(pre-pcur)<1e-10
  38. break;
  39. end
  40. u=u/;
  41. pre=pcur;
  42. e=ecur;
  43. update=;
  44. else
  45. u=u*;
  46. update=;
  47. end
  48. end
  49.  
  50. hold on;
  51. plot(x,exp(a*x.^+b*x+c),'r');
  52. plot(x,exp(pre()*x.^+pre()*x+pre()),'g');
  53.  
  54. %比较一下
  55. [a b c]
  56. 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. vueAdmin ui基础包

    这个版本的vueAdmin ui是针对官网版本进行修改而成,主要修改了后端接口修改,登录等等,一个通用的前端工程基础包,即开即用,省去了前期繁琐配置 Demo Build Setup # Clone ...

  2. LintCode翻转字符串问题 - python实现

    题目描述:试实现一个函数reverseWords,该函数传入参数是一个字符串,返回值是单词间做逆序调整后的字符串(只做单词顺序的调整即可). 例如:传入参数为"the sky is blue ...

  3. canvas图片上传相关学习

    今天主要是研究了canvas的关于图片上传的相关知识, context.drawImage(img,sx,sy,swidth,sheight,x,y,width,height);  

  4. 博客维护停止,需要的伙伴们移步http://blog.csdn.net/panhouye

    两个博客的维护着实费心,方便大家共同学习.督促.进步.感兴趣的伙伴们移步CSDN博客:http://blog.csdn.net/panhouye,博客目录如下: 1.Android中通过实现线程更新P ...

  5. 【API知识】类型转换工具ConvertUtils引发的思考

    前言 在读取Excel文件数据,有时候不可避免地需要把获取到的字符串转型为基本类型的对象.以前都是自己写转换,难度也不大.后来听说,有可以直接用的轮子——Apache 的commons-beanuti ...

  6. xmldocument内嵌入另一个xmldocument,xmlnode的方法

    string xmlstr1 = @"<root><head>myHead</head><body></body></roo ...

  7. Shell 实例:备份最后一天内所有修改过的文件

    在一个"tarball"中(经过 tar 和 gzip 处理过的文件)备份最后 24 小时之内当前目录下所有修改的文件. 程序代码如下: #!/bin/bash BACKUPFIL ...

  8. 一张 JVM 相关的思维脑图(4.4M)

    楼主学习 JVM 总结的知识点,用思维脑图串起来,温故而知新,其中含有类加载器,内存布局,GC(右侧). 最多的就是 GC 的内容了. 内容有错误之处,还请指正. 大图地址

  9. SQL Server 中的 NOLOCK 到底是什么意思?

    以前遇到过,但仅限于听同事说加上NOLOCK好一些,今天仔细研究测试了下,终于理解了,那么加与不加到底区别在哪呢? 我先说下其区别,之后再做测试. 大家都知道,每新建一个查询,都相当于创建一个会话,在 ...

  10. DataTable不能通过已删除的行访问该行的信息解决方法

    使用dt.Rows[0]["name", DataRowVersion.Original]可以获取