I'm getting an error in obtaining the optimal solution for a nonlinear equation
Show older comments
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;
end
alpha = 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;
%%%%%%%%
Accepted Answer
More Answers (0)
Categories
Find more on Symbolic Math Toolbox in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!