前言
博主一头小山猪
目前已开放所有文章:小山猪——经典算法专栏
活动地址: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)=(t−2+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)=[t−2+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)))T∗f(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)))T∇f(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;