• 【Matlab算法】L-M法求解非线性最小二乘优化问题(附L-M法MATLAB代码)


    前言

    博主一头小山猪目前已开放所有文章:小山猪——经典算法专栏

    活动地址:CSDN21天学习挑战赛

    正文

    L-M法求解非线性最小二乘优化问题

    L-M法 (Levenberg-Marquardt法)原理
    当矩阵 ( J k ) T J k \left(J_{k}\right)^{T} J_{k} (Jk)TJk 为病态矩阵时,用G-N算法可能得不到正确的解,甚至当 ( J k ) T J k \left(J_{k}\right)^{T} J_{k} (Jk)TJk 不可逆时, 这时G-N算法就无法计算下去。L-M算法通过采用系数矩阵阻尼的方法改造矩阵 ( J k ) T J k \left(J_{k}\right)^{T} J_{k} (Jk)TJk 的性 态,使算法能够进行下去。
    L-M算法中有两个主要的步骤: 一是解方程 [ Q + μ I ] Δ x = − ∇ S ( x ( k ) ) [Q+\mu I] \Delta x=-\nabla S\left(x^{(k)}\right) [Q+μI]Δx=S(x(k)) (其中 μ \mu μ 为阻尼系 数)求出自变量的增量,另一个是阻尼系数 μ \mu μ 的调整算法。
    算法步骤
    用L-M法求解非线性最小二乘优化问题 min ⁡ S ( x ) \min S(x) minS(x) 的算法过程如下:
    【1】给定初始点 x ( 0 ) x^{(0)} x(0) ,选取参数 β ∈ ( 0 , 1 ) , μ > 1 \beta \in(0,1) , \mu>1 β(0,1)μ>1 及精度 ε > 0 \varepsilon>0 ε>0 ,置 k = 0 k=0 k=0
    【2】计算 f ( x ( k ) ) , S ( x ( k ) ) f\left(x^{(k)}\right), S\left(x^{(k)}\right) f(x(k)),S(x(k))
    【3】计算 ∇ f ( x ( k ) ) \nabla f\left(x^{(k)}\right) f(x(k))
    【4】计算 ∇ S ( x ( k ) ) = ( ∇ f ( x ( k ) ) ) T ∗ f ( x ( k ) ) \nabla S\left(x^{(k)}\right)=\left(\nabla f\left(x^{(k)}\right)\right)^{T} * f\left(x^{(k)}\right) S(x(k))=(f(x(k)))Tf(x(k))
    【5】令 Q = ( ∇ f ( x ( k ) ) ) T ∇ f ( x ( k ) ) Q=\left(\nabla f\left(x^{(k)}\right)\right)^{T} \nabla f\left(x^{(k)}\right) Q=(f(x(k)))Tf(x(k)) 解方程 [ Q + μ I ] Δ x = − ∇ S ( x ( k ) ) [Q+\mu I] \Delta x=-\nabla S\left(x^{(k)}\right) [Q+μI]Δx=S(x(k))
    【6】令 x ( k + 1 ) = x ( k ) + Δ x x^{(k+1)}=x^{(k)}+\Delta x x(k+1)=x(k)+Δx ,计算终止条件是否满足,不满足转【7】;
    【7】若 S ( x ( k + 1 ) ) < S ( x ( k ) ) + β ( ∇ S ( x ( k ) ) ) T Δ x S\left(x^{(k+1)}\right)S(x(k+1))<S(x(k))+β(S(x(k)))TΔx ,令 μ = μ / v \mu=\mu / v μ=μ/v ,转【8】,否则令 μ = μ ∗ v \mu=\mu * v μ=μv ,转【5】;
    【8】令 k = k + 1 k=k+1 k=k+1 ,转【2】。

    代码实现

    L-M法函数如下

    function [x,minf] = minLM(f,x0,beta,u,v,var,eps)
    format long;
    if nargin == 6
        eps = 1.0e-6;
    end
    S = transpose(f)*f;
    k = length(f);
    n = length(x0);
    x0 = transpose(x0);
    A = jacobian(f,var);
    tol = 1;
    
    while tol>eps
        Fx = zeros(k,1);
        for i=1:k
            Fx(i,1) = Funval(f(i),var,x0);
        end
        Sx = Funval(S,var,x0);
        Ax = Funval(A,var,x0);
        gSx = transpose(Ax)*Fx;
        Q = transpose(Ax)*Ax;
        
        while 1
            dx = -(Q+u*eye(size(Q)))\gSx;
    
            x1 = x0 + dx;
            for i=1:k
                Fx1(i,1) = Funval(f(i),var,x1);
            end
            Sx1 = Funval(S,var,x1);
            tol = norm(dx);
            if tol<=eps
                break;
            end
    
            if Sx1 >= Sx+beta*transpose(gSx)*dx
                u = v*u;
                continue;
            else
                u = u/v;
                break;
            end
        end
        x0 = x1;
    end
    x = x0;
    minf = Funval(S,var,x);
    format short;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48

    参考资料

    1. 小山猪——经典算法专栏
    2. 数据结构教程 第5版
  • 相关阅读:
    Elasticsearch语法知多少之Term query
    UNIAPP_ReferenceError: TextEncoder is not defined 解决
    Dataset 的一些 Java api 操作
    Tomcat
    android源码设计模式学习笔记(一)
    【web-攻击访问控制】(5.2.1)攻击访问控制:不同用户账户进行测试、测试多阶段过程
    2024免费的苹果电脑杀毒软件cleanmymac X
    MacOS Pro笔记本硬盘升级纪实
    python入门与实战--字符串
    【计算机网络实验】RIP的基本配置
  • 原文地址:https://blog.csdn.net/AlbertDS/article/details/126457007