算法来自于[1],如下:
值得一提的是,[1]中的python代码实现了对Rosenbrock函数的求极值测试.
例子来自于[2]:
----------------------------------------------------
用DFP算法求解:
m
i
n
f
(
x
)
=
x
1
2
+
2
x
2
2
−
2
x
1
x
2
−
4
x
1
minf(x)=x_1^2+2x_2^2-2x_1x_2-4x_1
minf(x)=x12+2x22−2x1x2−4x1
取
x
0
=
(
1
,
1
)
T
,
H
0
=
x_0=(1,1)^T,H_0=
x0=(1,1)T,H0=
[
1
0
0
1
]
\left[ \begin{matrix} 1 & 0 \\ 0&1 \\ \end{matrix} \right]
[1001]
----------------------------------------------------
解答:
g
(
x
)
=
(
2
x
1
−
2
x
2
−
4
,
−
2
x
1
+
4
x
2
)
T
g(x)=(2x_1-2x_2-4,-2x_1+4x_2)^T
g(x)=(2x1−2x2−4,−2x1+4x2)T
g
0
=
(
−
4
,
2
)
T
g_0=(-4,2)^T
g0=(−4,2)T
p
0
=
−
H
0
g
0
=
(
4
,
−
2
)
T
p_0=-H_0g_0=(4,-2)^T
p0=−H0g0=(4,−2)T,
(i)求迭代点
x
1
x_1
x1,令
ϕ
0
(
α
)
=
f
(
x
0
+
α
p
0
)
=
40
α
2
−
20
α
−
3
\phi_0(\alpha)=f(x_0+\alpha p_0)=40\alpha^2-20\alpha-3
ϕ0(α)=f(x0+αp0)=40α2−20α−3,
得到
ϕ
(
α
)
\phi(\alpha)
ϕ(α)的极小值点为
α
0
=
1
4
\alpha_0=\frac{1}{4}
α0=41,
所以得:
x
1
=
x
0
+
α
0
p
0
=
(
2
,
0.5
)
T
,
g
1
=
(
−
1
,
−
2
)
T
,
x_1=x_0+\alpha_0p_0=(2,0.5)^T,g_1=(-1,-2)^T,
x1=x0+α0p0=(2,0.5)T,g1=(−1,−2)T,
s
0
=
x
1
−
x
0
=
(
1
,
−
0.5
)
T
,
y
0
=
g
1
−
g
0
=
(
3
,
−
4
)
T
s_0=x_1-x_0=(1,-0.5)^T,y_0=g_1-g_0=(3,-4)^T
s0=x1−x0=(1,−0.5)T,y0=g1−g0=(3,−4)T
这里的
s
0
s_0
s0是因为需要满足一个拟Newton条件,可以参考[4]
于是,
由DFP修正公式有
H
1
=
H
0
−
H
0
y
0
y
0
T
H
0
y
0
T
H
0
y
0
+
s
0
s
0
T
y
0
T
s
0
=
1
100
H_1=H_0-\frac{H_0 y_0 y_0^TH_0}{y_0^TH_0y_0}+\frac{s_0s_0^T}{y_0^Ts_0}=\frac{1}{100}
H1=H0−y0TH0y0H0y0y0TH0+y0Ts0s0s0T=1001
[
84
38
38
41
]
\left[ \begin{matrix} 84 & 38 \\ 38&41 \\ \end{matrix} \right]
[84383841]
所以下一个搜索方向为 p 1 = − H 1 g 1 = 1 5 ( 8 , 6 ) T p_1=-H_1g_1=\frac{1}{5}(8,6)^T p1=−H1g1=51(8,6)T
(2)求迭代点x2
令
ϕ
1
(
α
)
=
f
(
x
1
+
α
p
1
)
=
8
5
α
2
−
4
α
−
5.5
\phi_1(\alpha)=f(x_1+\alpha p_1)=\frac{8}{5}\alpha^2-4\alpha -5.5
ϕ1(α)=f(x1+αp1)=58α2−4α−5.5,
得到
ϕ
(
α
)
\phi(\alpha)
ϕ(α)的极小值点
α
1
=
5
4
\alpha_1=\frac{5}{4}
α1=45
于是得:
x
2
=
x
1
+
α
1
p
1
=
(
4
,
2
)
T
,
g
2
=
(
0
,
0
)
T
,
所
以
:
x
∗
=
x
2
=
(
4
,
2
)
T
,
f
∗
=
−
8
x_2=x_1+\alpha_1p_1=(4,2)^T,g_2=(0,0)^T,所以:x^*=x_2=(4,2)^T,f^*=-8
x2=x1+α1p1=(4,2)T,g2=(0,0)T,所以:x∗=x2=(4,2)T,f∗=−8
因为Hessian矩阵G(x)=G=
[
2
−
2
−
2
4
]
T
\left[ \begin{matrix} 2 & -2 \\ -2&4 \\ \end{matrix} \right]^T
[2−2−24]T
为正定矩阵,
f
(
x
)
f(x)
f(x)为严格凸函数,所以
x
∗
x*
x∗为整体极小点
[3]提供了matlab代码,建立一个文件DFP.m(文件名必须和代码中的函数名保持一致),代码如下:
function [best_x,best_fx,count]=DFP(x0,ess)
colormap Jet
% ###########################
syms x1 x2 t;
f=x1*x1+2*x2*x2-2*x1*x2-4*x1;
fx=diff(f,x1);%求表达式f对x1的一阶求导
fy=diff(f,x2);%求表达式f对x2的一阶求导
fi=[fx fy];%构造函数f的梯度函数
%初始点的梯度和函数值
g0=subs(fi,[x1 x2],x0);
f0=subs(f,[x1 x2],x0);
H0=eye(2); %输出x0,f0,g0
x0
f0
g0
xk=x0;
fk=f0;
gk=g0;
Hk=H0;
k=1;
while(norm(gk)>ess)%迭代终止条件||gk||<=ess
disp('************************************************************')
disp(['第' num2str(k) '次寻优'])
%确定搜索方向
pk=-Hk*gk';
%由步长找到下一点x(k+1)
xk=xk+t*pk';
f_t=subs(f,[x1 x2],xk); %构造一元搜索的一元函数φ(t) %由一维搜索找到最优步长
df_t=diff(f_t,t);
tk=solve(df_t);
if tk~=0
tk=double(tk);
else
break;
end
%计算下一点的函数值和梯度
xk = subs(xk,t,tk)
fk=subs(f,[x1 x2],xk)
gk0=gk;
gk=subs(fi,[x1 x2],xk)
%DPF校正公式,找到修正矩阵
yk=gk-gk0;
sk=tk*pk';
Hk=Hk-(Hk*yk'*yk*Hk)/(yk*Hk*yk')+sk'*sk/(yk*sk')%修正公式
k=k+1;
end
disp('结果如下:')
best_x=xk;%最优点
best_fx=fk;%最优值
count=k-1;
end
matlab终端运行方法如下:
>> x0=[1 1];
>> ess=1e-6
>> [best_x,best_fx,count]=DFP(x0,ess)
输出如下:
x0 =
1 1
f0 =
-3
g0 =
[ -4, 2]
************************************************************
第1次寻优
xk =
[ 2, 1/2]
fk =
-11/2
gk =
[ -1, -2]
Hk =
[ 21/25, 19/50]
[ 19/50, 41/100]
************************************************************
第2次寻优
xk =
[ 4, 2]
fk =
-8
gk =
[ 0, 0]
Hk =
[ 1, 1/2]
[ 1/2, 1/2]
结果如下:
best_x =
[ 4, 2]
best_fx =
-8
count =
2
>> x0=[1 1];
>> ess=1e-6
ess =
1.0000e-06
Reference:
[1]优化算法——拟牛顿法之DFP算法
[2]拟牛顿法-最优化方法-百度文库
[3]DFP算法及Matlab程序
[4]DFP算法