参考资料:

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

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

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

  1. % opti_LM_test1
  2. % 测试了 MATLAB最优化 书中的 L-M 的例子,结果是正确的
  3. clear all;clc;close all;
  4.  
  5. syms t;
  6. f = ...
  7. [t^2+t-1;
  8. 2*t^2-3];
  9. S = transpose(f)*f;
  10.  
  11. f_var = symvar(f);
  12.  
  13. t_init = -5 % 自变量的初始值
  14. %%
  15. u = 2
  16. v = 1.5
  17. beta = 0.4
  18. eps = 1.0e-6
  19.  
  20. x = t_init;
  21. x = transpose(x);%
  22.  
  23. jacobian_f = jacobian(f,f_var);
  24. tol = 1;
  25. %% subs以后居然不是数值,而是符号!还要转换成double类型!!!
  26. while tol>eps
  27. fxk = double(subs(f,f_var,x));
  28. Sxk = double(subs(S,f_var,x)); % step2: 计算 fxk Sxk
  29.  
  30. delta_fxk = double(subs(jacobian_f,f_var,x)); % step3: 计算 delta_fxk
  31.  
  32. delta_Sxk = transpose(delta_fxk)*fxk; % step4: 计算 delta_Sxk
  33.  
  34. while 1
  35. % step5: 计算Q,并解方程(Q+uI)delta_x = -delta_Sxk
  36. Q = transpose(delta_fxk)*delta_fxk;
  37. dx = -(Q+u*eye(size(Q)))\delta_Sxk;
  38.  
  39. x1 = x + dx;
  40.  
  41. fxk = double(subs(f,f_var,x1));
  42. Sxk_new = double(subs(S,f_var,x1));
  43.  
  44. tol = norm(dx); % step6: 计算中止条件 norm(dx)<eps 是否满足,不满足转step 7
  45. if tol<=eps
  46. break;
  47. end
  48.  
  49. % step7:
  50. if Sxk_new < Sxk+beta*transpose(delta_Sxk)*dx
  51. u = u/v;
  52. break;
  53. else
  54. u = u*v;
  55. continue;
  56. end
  57. end
  58.  
  59. x = x1;
  60. end
  61.  
  62. t = x1
  63. minf = double(subs(S,f_var,t))

测试的结果是正确的。

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

  1. % opti_LM_test2
  2. % 测试了 数值分析 Timothy Sauer 4.4节中的 4.19
  3. clear all;clc;close all;
  4.  
  5. x1 = -1; y1 = 0;
  6. x2 = 1; y2 = 1/2;
  7. x3 = 1; y3 = -1/2;
  8.  
  9. R1 = 1; R2 = 1/2; R3 = 1/2;
  10. %
  11. syms x y;
  12. r1 = sqrt( (x-x1)^2 + (y-y1)^2 )-R1;
  13. r2 = sqrt( (x-x2)^2 + (y-y2)^2 )-R2;
  14. r3 = sqrt( (x-x3)^2 + (y-y3)^2 )-R3;
  15.  
  16. r = ...
  17. [r1;
  18. r2;
  19. r3]
  20. %
  21. f = r
  22. clear r1 r2 r3 R1 R2 R3 x1 x2 x3 y1 y2 y3 x y r;
  23. %%
  24. S = transpose(f)*f
  25. f_var = symvar(f)
  26.  
  27. t_init = [0 0] % 初始值,要给出
  28. u = 2
  29. v = 1.5
  30. beta = 0.4
  31. eps = 1.0e-6
  32. tol = 1
  33. %%
  34. x = t_init
  35.  
  36. jacobian_f = jacobian(f,f_var)
  37. %%
  38. while tol>eps
  39. fxk = double(subs(f,f_var,x));
  40. Sxk = double(subs(S,f_var,x)); % step2: 计算 fxk Sxk
  41.  
  42. delta_fxk = double(subs(jacobian_f,f_var,x)); % step3: 计算 delta_fxk
  43.  
  44. delta_Sxk = transpose(delta_fxk)*fxk; % step4: 计算 delta_Sxk
  45.  
  46. while 1
  47. % step5: 计算Q,并解方程(Q+uI)delta_x = -delta_Sxk
  48. Q = transpose(delta_fxk)*delta_fxk;
  49. dx = -(Q+u*eye(size(Q)))\delta_Sxk;
  50.  
  51. x1 = x + dx'; % 注意转置
  52.  
  53. fxk = double(subs(f,f_var,x1));
  54. Sxk_new = double(subs(S,f_var,x1));
  55.  
  56. tol = norm(dx); % step6: 计算中止条件 norm(dx)<eps 是否满足,不满足转step 7
  57. if tol<=eps
  58. break;
  59. end
  60.  
  61. % step7:
  62. if Sxk_new < Sxk+beta*transpose(delta_Sxk)*dx
  63. u = u/v;
  64. break;
  65. else
  66. u = u*v;
  67. continue;
  68. end
  69. end
  70.  
  71. x = x1;
  72. end
  73. %%
  74. format short;
  75. opti_var_value = x1
  76. minf = double(subs(S,f_var,opti_var_value))

结果也是正确的

细节和原理以后再补充

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

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

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

  2. 如何加速MATLAB代码运行

    学习笔记 V1.0 2015/4/17 如何加速MATLAB代码运行 概述 本文源于LDPCC的MATLAB代码,即<CCSDS标准的LDPC编译码仿真>.由于代码的问题,在信息位长度很长 ...

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

    之前建立了一个SVM-based Ordinal regression模型,一种特殊的多分类模型,就想通过可视化的方式展示模型分类的效果,对各个分类区域用不同颜色表示.可是,也看了很多代码,但基本都是 ...

  4. 卷积相关公式的matlab代码

    取半径=3 用matlab代码实现上式公式: length=3;for Ki = 1:length for Kj = 1:length for Kk = 1:length Ksigma(Ki,Kj,K ...

  5. JAVA调用matlab代码

    做实验一直用的matlab代码,需要嵌入到java项目中,matlab代码拼拼凑凑不是很了解,投机取巧采用java调用matlab的方式解决. 1.    matlab版本:matlabR2014a ...

  6. 调试和运行matlab代码(源程序)的技巧和教程

    转载请标明出处:专注matlab代码下载的网站http://www.downma.com/ 本文主要给大家分享使用matlab编写代码,完成课程设计.毕业设计或者研究项目时,matlab调试程序的技巧 ...

  7. 直方图均衡化与Matlab代码实现

    昨天说了,今天要好好的来解释说明一下直方图均衡化.并且通过不调用histeq函数来实现直方图的均衡化. 一.直方图均衡化概述 直方图均衡化(Histogram Equalization) 又称直方图平 ...

  8. 将labelme 生成的.json文件进行可视化的代码+label.png 对比度处理的matlab代码

    labelme_to_dataset 指令的代码实现: show.py文件 #!E:\Anaconda3\python.exe import argparse import json import o ...

  9. SVM实例及Matlab代码

    ******************************************************** ***数据集下载地址 :http://pan.baidu.com/s/1geb8CQf ...

  10. Latex中Matlab代码的环境

    需要用到listings宏包 使用方法: 导言区\usepackage{listings}\lstset{language=Matlab}      %代码语言使用的是matlab\lstset{br ...

随机推荐

  1. hdu1907 John 博弈

    Little John is playing very funny game with his younger brother. There is one big box filled with M& ...

  2. 在java中(==)的用法

  3. 尚硅谷【SpringBoot】web(源码讲解太多不建议阅读)

    四.Web开发 1.简介 使用SpringBoot: 1).创建SpringBoot应用,选中我们需要的模块: 2).SpringBoot已经默认将这些场景配置好了,只需要在配置文件中指定少量配置就可 ...

  4. centos7安装的mysql无法启动(mysql daemon failed to start)

    不知道是什么原因,启动mysql时一直报这个错误,卸载重装mysql也没用 后来看到网上有人说,执行命令mysql_install_db就可以了 一试还真的行

  5. git配置config文件

    1.Git有一个工具被称为git config,它允许你获取和设置变量:这些变量可以控制Git的外观和操作的各个方面.这些变量以等级的不同可以被存储在三个不同的位置: (1) /etc/gitconf ...

  6. C# to il 9 Properties and Indexers(属性和索引器)

    A field is simply a memory location, whereas, a property is a collection of methods. Aproperty is re ...

  7. URL整理

    Airtest project官网 http://airtest.netease.com/ poco辅助文档:http://poco.readthedocs.io/zh_CN/latest/index ...

  8. 著名软件工程师与作家、极限编程的创始者、JUnit作者之Kent Beck

    Kent Beck,1961年出生,中文名肯特贝克,美国著名软件工程师与作家,在软件工程方面有很大的贡献.他是Smalltalk软件的开发者,设计模式的先驱,测试驱动开发的支持者,也是极限编程的创始者 ...

  9. jmeter --- 监控器 Plugins (&jconsole)

    jmeter --- 监控器 Plugins (&jconsole) Jmeter本身没有监控服务器资源的功能,需要添加额外插件 一.监控原理图 二.Jmeter-Plugs下载和安装 官网上 ...

  10. 基于MVC4+EasyUI的Web开发框架形成之旅(6)--基类控制器CRUD的操作

    在上一篇随笔中,我对Web开发框架的总体界面进行了介绍,其中并提到了我的<Web开发框架>的控制器的设计关系,Web开发框架沿用了我的<Winform开发框架>的很多架构设计思 ...