参考资料:

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 代码的更多相关文章

  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. GinKgoCTF-Misc

    一:谁动了我的校徽? Jpg改txt——>寻找——>GKCTF{This_is_a_huaji} 二:奇怪的压缩包1 六位数字的密码一点也不安全!!!!!! 下载压缩包——>有密码( ...

  2. day 06Hadoop

    更换虚拟机以后操作的步奏1.到每一台机器上修改ip地址 ,然后修改hosts1.5 给每台机器配置免密码登录 2.修改hadoop 的配置文件,发送到每台机器上3.启动dfs start-dfs.sh ...

  3. (惊艳)基于谷底最小值的阈值的图像分割(改进HSV中的H分量可以用imhist(H)提取)

    任务概述:将这张图片作为输入 , 然后抠出只有斑点的图片 灵感来源: 1. 黄色部分用绿色的掩盖掉得到图片B,然后A和B进行∩运算,相同的设置为0 2.统计单词的子母数,开辟一个26个元素的数组,进来 ...

  4. Singer 学习十 同步模式

    sync 模式是属于tap 的操作,同步模式下,tap 需要提交 schema. record .state message, singer 指南对于每种 类型有详细的说明 streams 每个str ...

  5. inux下C中怎么让才干安全关闭线程

    前言:     多线程程序中,特别是频繁申请.释放线程的情况下,就要注意线程的关闭,最好使用线程池. 一,线程退出方式     (1) 运行完毕后隐式退出:     (2) 由线程本身显示调用pthr ...

  6. MQ介绍 & 实例

    阅读目录 定义 优秀MQ特点 产品比较 实例(简单的实战) 关于消息队列与分布式的那些事 定义: 消息队列(MQ)是一种应用程序对应用程序的通信方法,应用程序通过队列进行通信,而不是通过直接调用彼此来 ...

  7. 图的最短路径——dijkstra算法和Floyd算法

    dijkstra算法 求某一顶点到其它各个顶点的最短路径:已知某一顶点v0,求它顶点到其它顶点的最短路径,该算法按照最短路径递增的顺序产生一点到其余各顶点的所有最短路径. 对于图G={V,{E}};将 ...

  8. KiCad 的 Digikey 元件库

    KiCad 的 Digikey 元件库 KiCad 最初由法国人Jean-Pierre Charras于1992年推出,目前由 CERN(欧洲核子研究组织)接手开发. 而且现在有很多大公司的加入,比如 ...

  9. Node 内存控制

    Node 只能使用部分内存,原因: node 基于 V8 构建,V8 的内存管理机制限制了内存的用量. 在实际的使用中,不小心触碰到这个内存界限,会造成进程退出. V8 是通过堆来进行内存分配的:在代 ...

  10. npm安装教程(vue.js)

    https://www.cnblogs.com/goldlong/p/8027997.html 首先理清nodejs和npm的关系: node.js是javascript的一种运行环境,是对Googl ...