前言
博主一头小山猪
目前已开放所有文章:小山猪——经典算法专栏
活动地址: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;