上一篇我们介绍了无约束优化问题的算法框架,初步了解了无约束优化问题的几种算法。本篇内容将会讲解线搜索方法中的一种古老的方法——梯度法(也称最速下降法)
在算法框架中我们提到,不同的方式确定搜索方向或搜索步长,就会得到不同的算法,而梯度法就是用负梯度方向作为搜索方向,即 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=∥gk∥∥dk∥cosθ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;