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))
结果也是正确的
细节和原理以后再补充
Levenberg-Marquardt 的 MATLAB 代码的更多相关文章
- matlab实现高斯牛顿法、Levenberg–Marquardt方法
高斯牛顿法: function [ x_ans ] = GaussNewton( xi, yi, ri) % input : x = the x vector of 3 points % y = th ...
- 如何加速MATLAB代码运行
学习笔记 V1.0 2015/4/17 如何加速MATLAB代码运行 概述 本文源于LDPCC的MATLAB代码,即<CCSDS标准的LDPC编译码仿真>.由于代码的问题,在信息位长度很长 ...
- 多分类问题中,实现不同分类区域颜色填充的MATLAB代码(demo:Random Forest)
之前建立了一个SVM-based Ordinal regression模型,一种特殊的多分类模型,就想通过可视化的方式展示模型分类的效果,对各个分类区域用不同颜色表示.可是,也看了很多代码,但基本都是 ...
- 卷积相关公式的matlab代码
取半径=3 用matlab代码实现上式公式: length=3;for Ki = 1:length for Kj = 1:length for Kk = 1:length Ksigma(Ki,Kj,K ...
- JAVA调用matlab代码
做实验一直用的matlab代码,需要嵌入到java项目中,matlab代码拼拼凑凑不是很了解,投机取巧采用java调用matlab的方式解决. 1. matlab版本:matlabR2014a ...
- 调试和运行matlab代码(源程序)的技巧和教程
转载请标明出处:专注matlab代码下载的网站http://www.downma.com/ 本文主要给大家分享使用matlab编写代码,完成课程设计.毕业设计或者研究项目时,matlab调试程序的技巧 ...
- 直方图均衡化与Matlab代码实现
昨天说了,今天要好好的来解释说明一下直方图均衡化.并且通过不调用histeq函数来实现直方图的均衡化. 一.直方图均衡化概述 直方图均衡化(Histogram Equalization) 又称直方图平 ...
- 将labelme 生成的.json文件进行可视化的代码+label.png 对比度处理的matlab代码
labelme_to_dataset 指令的代码实现: show.py文件 #!E:\Anaconda3\python.exe import argparse import json import o ...
- SVM实例及Matlab代码
******************************************************** ***数据集下载地址 :http://pan.baidu.com/s/1geb8CQf ...
- Latex中Matlab代码的环境
需要用到listings宏包 使用方法: 导言区\usepackage{listings}\lstset{language=Matlab} %代码语言使用的是matlab\lstset{br ...
随机推荐
- hdu1907 John 博弈
Little John is playing very funny game with his younger brother. There is one big box filled with M& ...
- 在java中(==)的用法
- 尚硅谷【SpringBoot】web(源码讲解太多不建议阅读)
四.Web开发 1.简介 使用SpringBoot: 1).创建SpringBoot应用,选中我们需要的模块: 2).SpringBoot已经默认将这些场景配置好了,只需要在配置文件中指定少量配置就可 ...
- centos7安装的mysql无法启动(mysql daemon failed to start)
不知道是什么原因,启动mysql时一直报这个错误,卸载重装mysql也没用 后来看到网上有人说,执行命令mysql_install_db就可以了 一试还真的行
- git配置config文件
1.Git有一个工具被称为git config,它允许你获取和设置变量:这些变量可以控制Git的外观和操作的各个方面.这些变量以等级的不同可以被存储在三个不同的位置: (1) /etc/gitconf ...
- 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 ...
- URL整理
Airtest project官网 http://airtest.netease.com/ poco辅助文档:http://poco.readthedocs.io/zh_CN/latest/index ...
- 著名软件工程师与作家、极限编程的创始者、JUnit作者之Kent Beck
Kent Beck,1961年出生,中文名肯特贝克,美国著名软件工程师与作家,在软件工程方面有很大的贡献.他是Smalltalk软件的开发者,设计模式的先驱,测试驱动开发的支持者,也是极限编程的创始者 ...
- jmeter --- 监控器 Plugins (&jconsole)
jmeter --- 监控器 Plugins (&jconsole) Jmeter本身没有监控服务器资源的功能,需要添加额外插件 一.监控原理图 二.Jmeter-Plugs下载和安装 官网上 ...
- 基于MVC4+EasyUI的Web开发框架形成之旅(6)--基类控制器CRUD的操作
在上一篇随笔中,我对Web开发框架的总体界面进行了介绍,其中并提到了我的<Web开发框架>的控制器的设计关系,Web开发框架沿用了我的<Winform开发框架>的很多架构设计思 ...