测试:
>> [alpha, newxk, fk, newfk] = Opt_Wolfe([0 0]', [1 0]')
alpha =
0.1250
newxk =
0.1250
0
fk =
1
newfk =
0.7900
- 代码如下:
function [alpha, newxk, fk, newfk] = Opt_Wolfe(xk, dk)
rho = 0.25;
sigma = 0.75;
alpha = 1;
a = 0;
b = 1;
while a < b
if fun(xk + alpha*dk) <= fun(xk) + rho*alpha*gfun(xk)'*dk
if gfun(xk + alpha*dk)'*dk >= sigma*gfun(xk)'*dk
break;
else
a = alpha;
alpha = 0.5*(a + b);
end
else
b = alpha;
alpha = (alpha+a)/2;
end
end
newxk = xk + alpha*dk;
fk = fun(xk);
newfk = fun(newxk);
function f=fun(x)
f = 100*(x(1)^2 - x(2))^2 + (x(1)-1)^2;
function gf=gfun(x)
gf = [400*x(1)*(x(1)^2 - x(2)) + 2*(x(1) - 1);
-200*(x(1)^2 - x(2))];