无约束优化问题(二)

上一篇我们介绍了无约束优化问题的算法框架,初步了解了无约束优化问题的几种算法。本篇内容将会讲解线搜索方法中的一种古老的方法——梯度法(也称最速下降法)

在算法框架中我们提到,不同的方式确定搜索方向或搜索步长,就会得到不同的算法,而梯度法就是用负梯度方向作为搜索方向,即 dk=f(xk)

那么,为什么要用负梯度方向作为搜索方向? 因为负梯度方向是当前点的最速下降方向(就是说在 xk 的某个邻域内,在这个方向上往前走,函数值一定是下降最快的),下面我们给出数学上的证明:设 f(x) xk 附近连续可微, gk=f(xk) ,由泰勒展式得,

f(xk+αdk)=f(xk)+αgTkdk+o(α)α>0
那么目标函数 f(x) xk 处沿下降方向 dk 的变化率为:

limα0f(xk+αdk)f(xk)α=limα0αgTkdk+o(α)α=gTkdk=gkdkcosθk

θk gk dk 的夹角。显然当 dk 取 - gk 时,上式有最小值,且为负值。

由上一篇的算法框架,我们可以很容易写出代码:

function [t,k,xk,val]=grad(x0,n)
%非精确线搜索(armijo准则)的梯度法
%EPS为精度,k为迭代次数,最大设为10000次
%fun为优化目标函数,gfun为其梯度
%t为迭代所用时间
tic;
xk=x0;
EPS=1e-4;
k=0;
maxk=10000;
gk=gfun(xk,n);                 %初始点代入求得梯度
while norm(gk)>EPS && k<maxk   %停算条件:梯度接近0或迭代次数达到最大
    dk=-gk;
    %非精确线搜索armijo准则
    beta = 0.55; sigma = 0.4;
    m = 0; mk = 0;
    while (m<20)   %防止搜索距离过小
          if(fun(xk+beta^m*dk,n)>fun(xk,n)+sigma*beta^m*gfun(xk,n)'*dk)  %'
             mk = m;break;
          end
          m=m+1;
    end
    xk=xk+alphak*dk;           
    gk=gfun(xk,n);
    k=k+1;
end
val=fun(xk,n);                 %此时的函数值(极小值)
t=toc;
  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值