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

前言

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

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

G-N法求解非线性最小二乘优化问题

正文

非线性最小二乘优化问题

非线性最小二乘优化问题
非线性最小二乘优化也叫无约束极小平方和函数问题,它是如下无约束极小问题: min ⁡ S ( x ) \min S(x) minS(x) , 其中 S ( x ) = f ( x ) T f ( x ) = ∑ i = 1 m f i 2 ( x ) S(x)=f(x)^{T} f(x)=\sum_{i=1}^{m} f_{i}^{2}(x) S(x)=f(x)Tf(x)=i=1mfi2(x)
例如 min ⁡ S ( x ) = ( t − 2 + s 2 ) 2 + ( t 2 + 1 ) 2 \min S(x)=\left(t-2+s^{2}\right)^{2}+\left(t^{2}+1\right)^{2} minS(x)=(t2+s2)2+(t2+1)2 ,则 f ( x ) = [ t − 2 + s 2 t 2 + 1 ] f(x)=\left[\begin{array}{c}t-2+s^{2} \\ t^{2}+1\end{array}\right] f(x)=[t2+s2t2+1] ,其中 x = [ t s ] T x=\left[\begin{array}{ll}t & s\end{array}\right]^{T} x=[ts]T 。如果 f ( x ) f(x) f(x) x x x 的线性函数,即 f ( x ) = C x + d f(x)=\mathbf{C} x+\mathbf{d} f(x)=Cx+d ,其中 C \mathbf{C} C 为矩阵, d \mathbf{d} d 为向 量,此时问题变为线性最小二乘问题。对于线性最小二乘问题,处理起来非常简单,其实质是 n n n 变量的二次规划问题,MATLAB中对应有Isqnonlin函数求解线性最小二乘问题。
算法步骤
用G-N法求解非线性最小二乘优化问题 min ⁡ S ( x ) \min S(x) minS(x) 的算法过程如下:
【1】给定初始点 x ( 0 ) x^{(0)} x(0) ,及精度 ε > 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】 解方程 [ ( ∇ f ( x ( k ) ) ) T ∇ f ( x ( k ) ) ] Δ x = − ∇ S ( x ( k ) ) \left[\left(\nabla f\left(x^{(k)}\right)\right)^{T} \nabla f\left(x^{(k)}\right)\right] \Delta x=-\nabla S\left(x^{(k)}\right) [(f(x(k)))Tf(x(k))]Δ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】检验终止原则,否则令 k = k + 1 k=k+1 k=k+1 ,转【2】。

代码实现

G-N法函数如下

function [x,minf] = minGN(f,x0,var,eps)
format long;
if nargin == 3
    eps = 1.0e-6;
end
S = transpose(f)*f;
k = length(f);
n = length(x0);
x0 = transpose(x0);
tol = 1;
A = jacobian(f,var);

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;

    dx = -transpose(Ax)*Ax\gSx;
    x0 = x0 + dx;
    tol = norm(dx);
end
x = x0;
minf = Funval(S,var,x);
format short;

参考资料

  1. 小山猪——经典算法专栏
  2. 数据结构教程 第5版

猜你喜欢

转载自blog.csdn.net/AlbertDS/article/details/126417394