拟牛顿法-DFP算法举例与matlab代码实现(转载+整理)

算法来自于[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+2x222x1x24x1
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)=(2x12x24,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α220α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=x1x0=(1,0.5)T,y0=g1g0=(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=H0y0TH0y0H0y0y0TH0+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α24α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 [2224]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算法

评论 23
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值