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 ...
随机推荐
- php-isset和empty
<?php $a = null; if(isset($a)){ echo "is set"."\n"; } else{ echo "not se ...
- Django---模版层
---https://www.cnblogs.com/liuqingzheng/articles/9509806.html 一.处理浏览器转义字符串的两种方式 1.{{ str|safe }} 2.在 ...
- web前端的问题整理
css实现三列布局?如果中间又是自适应布局怎么做?
- struts2参数转换器用法
贴代码 struts的action中接收简单类型参数,struts2可以自动转化,但是复杂类型需要自定义转换器转换 public class ConvertAction extends ActionS ...
- java黑魔法-反射机制-01
在java的帮助文档中,java.lang包中有一个Class类,注意这里的"C“是大写,所以这个不是表示类的声明,而是一个真正的类.在java的帮助文档中,这样定义的Class类: pub ...
- H3C路由器映射端口到外网
登录路由器web管理端 选择高级设置->虚拟服务器->新增虚拟服务器
- python基础(七)——网络编程
服务端 我们使用 socket 模块的 socket 函数来创建一个 socket 对象.socket 对象可以通过调用其他函数来设置一个 socket 服务. 现在我们可以通过调用 bind(hos ...
- MySQL--派生表临时结果集中的AutoKey
在某些场景中,需要对派生表生成临时结果集进行materialized,如果该临时结果集中包含索引键,那么查询有可能通过该索引键来进行优化. 如对下面查询: SELECT T2.purpose_code ...
- What are long running processes?
转自:https://blog.bernd-ruecker.com/what-are-long-running-processes-b3ee769f0a27 Some communities have ...
- FastAdmin 新年福袋进行中
FastAdmin 新年福袋进行中 2019新年福袋活动正在进行中 https://www.fastadmin.net/act/20190101/springfestival.html