function [x,N]=steep_desc(grad,xnew,options); %Matlab routine for steepest descent algorithm %using secant method for line search. %-- by E. K. P. Chong, Feb. 11, 1994 % % STEEP_DESC('grad',x0); % STEEP_DESC('grad',x0,OPTIONS); % % x = STEEP_DESC('grad',x0); % x = STEEP_DESC('grad',x0,OPTIONS); % % [x,N] = STEEP_DESC('grad',x0); % [x,N] = STEEP_DESC('grad',x0,OPTIONS); % %The first variant finds the minimizer of a function whose gradient %is described in grad (usually an M-file: grad.m), using a gradient %descent algorithm with initial point x0. The line search used in the %secant method. %The second variant allows a vector of optional parameters to %defined. OPTIONS(1) controls how much display output is given; set %to 1 for a tabular display of results, (default is no display: 0). %OPTIONS(2) is a measure of the precision required for the final point. %OPTIONS(3) is a measure of the precision required of the gradient. %OPTIONS(14) is the maximum number of iterations. %For more information type HELP FOPTIONS. % %The next two variants returns the value of the final point. %The last two variants returns a vector of the final point and the %number of iterations. if nargin ~= 3 options = []; if nargin ~= 2 disp('Wrong number of arguments.'); return; end end if length(options) >= 14 if options(14)==0 options(14)=1000*length(xnew); end else options(14)=1000*length(xnew); end if length(options) < 18 options(18)=0.002; %optional step size end %clc; format compact; format short e; options = foptions(options); print = options(1); epsilon_x = options(2); epsilon_g = options(3); max_iter=options(14); ros_cnt; if length(xnew) == 2 plot(xnew(1),xnew(2),'o') text(xnew(1),xnew(2),'Start Point') end for k = 1:max_iter, xcurr=xnew; g_curr=feval(grad,xcurr); if norm(g_curr) <= epsilon_g disp('Terminating: Norm of gradient less than'); disp(epsilon_g); k=k-1; break; end %if if options(7) == 0, alpha=secant(grad,xcurr,-g_curr); else alpha=options(18); end %if xnew = xcurr-alpha*g_curr; if print, disp('Iteration number k =') disp(k); %print iteration index k disp('alpha ='); disp(alpha); %print alpha disp('Gradient = '); disp(g_curr'); %print gradient disp('New point ='); disp(xnew'); %print new point end %if if norm(xnew-xcurr) <= epsilon_x*norm(xcurr) disp('Terminating: Norm of difference between iterates less than'); disp(epsilon_x); break; end %if pltpts(xnew,xcurr); if k == max_iter disp('Terminating with maximum number of iterations'); end %if end %for if nargout >= 1 x=xnew; if nargout == 2 N=k; end else disp('Final point ='); disp(xnew'); disp('Number of iterations ='); disp(k); end %if