不精确的一维搜索
%给定目标函数,梯度,初始值以及方向通过迭代确定步长
function [alpha,xknew,fk,fknew,j]=wolfe(f,g,xk,dk)
lambda=0.1;
sigma=0.5;
a=0;
b=inf;
alpha=1;
j=0; %迭代次数
while 1
if ~((f(xk)-f(xk+alpha*dk)>=(-lambda*alpha*g(xk)'*dk)))
%没有满足函数是下降的
j=j+1;
b=alpha;
alpha=(a+alpha)/2;
continue; %终止此次循环进行下一次循环
end
if ~(g(xk+alpha*dk)'*dk>=sigma*g(xk)'*dk)
%没有满足可接受点的切线斜率>=初始斜率的sigma倍
a=alpha;
alpha=min([2*alpha,(alpha+b)/2]);
continue;
end
break
end
xknew=xk+alpha*dk;
fknew=f(xknew);
fk=f(xk);
end
f=@(x) 100*(x(2)-x(1)^2)^2+(1-x(1))^2;
g=@(x) [-400*(x(2)-x(1)^2)*x(1)-2*(1-x(1));200*(x(2)-x(1)^2)];
[alpha,xknew,fk,fknew,j]=wolfe(f,g,[0,0]',[1,0]')