I'm trying to apply steepest descent satifying strong wolfe conditions to the Rosenbruck function with inital x0=(1.2,1.2), however, although the function itself has a unique solution at (1,1), I'm getting (-inf,inf) as an optimal solution. Here are the codes:
function [X,Grad,ite] = steepest_descent_wolfe(fhandle,x0,tol,maxit,alpha0,c,cu,mu,amax)% Description:
% Obtains the iterations of a given function with given datas by using
% steepest descent method with wolfe condition
%
% Input:
% fhandle : objective function
% x0 : initial guess
% tol : tolerance
% maxit : maximum number of iterations
% alpha0 : initial step-length
% c : Armijo parameter
% cu : Strong curvature Parameter
% mu : backtracking parameter
% amax : maximum number of iteration for Wolfe contion
%% Output:
% X : solution containing each iteration
% Grad : gradient of solution
% ite : number of iteration
% Usage:
% steepest_descent_armijo(fhandle,x0,tol,maxit,alpha0,c,beta,amax)
ite = 1;% Calculate function values at initial guess
[~,fgrad] = feval(fhandle,x0);% Compute magnitude of gradient for stopping criteria
Grad(:,1) = norm(fgrad);% Allocate initial point
x(:,1) = x0;while( ite < maxit && norm(fgrad) > tol) % Compute the search direction
p = -fgrad; % Compute step-length, satisfying Armijo condition
alpha = wolfe(fhandle,x(:,ite),p,alpha0,c,cu,mu,amax); % Update the solution
x(:,ite+1) = x(:,ite) + alpha*p; % Compute gradient of function at current point for stopping criteria
[~,fgrad] = feval(fhandle,x(:,ite+1)); % Compute magnitude of gradient for stopping criteria Grad(:,ite+1) = norm(fgrad); % Increase the iteration number
ite = ite+1;end X = x; end%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%function alpha = wolfe(fhandle, x, p, alpha0, c, cu, mu, amax)% Description:% Compute step-length of an iteration satisfied by Wolfe condition
%% Input:% fhandle : function handle
% x : current point
% alpha0 : initial step-length
% c : Armijo parameter
% cu : Curvature parameter
% mu : backtracking parameter
% amax : maximum number of iteration
%% Output:% alpha: step-length of an iteration satisfied by Wolfe condition
%% Usage:% wolfe(fhandle, x, p, alpha0, c, cu, mu, amax)
j = 0;% Calculate function values at x
[f,gradx] = feval(fhandle,x);% Calculate function values at x + alpha*p
[fh,gradk] = feval(fhandle,x+alpha0*p);while ( ( fh > f + c*alpha0*gradx'*p ) && ( j < amax ) && ( abs(gradk)'*p > cu*abs(gradx)'*p )) % Update the step length by using backtracking with parameter mu
alpha0 = alpha0*mu; % Update the iterate
a = x + alpha0*p; % Calculate function values at x + alpha*p
[fh,gradk] = feval(fhandle,a); % Increase the iteration number j = j+1; endalpha = alpha0;end%where the objective function is
function [f,gradf] = rosenbrock(x)f = 100*(x(1)^2 - x(2))^2 + (x(1)-1)^2;gradf = [100*(2*(x(1)^2-x(2))*2*x(1)) + 2*(x(1)-1); ... 100*(-2*(x(1)^2-x(2))) ];end%%%the input values
x = [1.2,1.2]; tol = 1.0e-4; maxit = 100; alpha0 = 1; c = 1.0e-4; cu = 0.9; mu = 0.5; amax = 1000; %%%%%%%%
Best Answer