Page 296 - MATLAB an introduction with applications
P. 296

Optimization ———  281

                   function [xMin,fMin,nCyc] = FletcherReeves(h,tol)
                   % Fletcher–Reeves method
                   % h = initial search increment = 0.1
                   % tol = error tolerance = 1.0e–6
                   % X = starting point
                   % FUNC = handle of function that returns f
                   % DFUNC = handle of function that returns grad(f)
                   % xMin = minimum point
                   % fMin = miminum value of f
                   % nCyc = # of cycles to convergence
                   global X FUNC DFUNC V
                   if nargin < 2; tol = 1.0e–6; end
                   if nargin < 1; h = 0.1; end
                   if size(X,2) > 1; X = X’; end
                   n = length(X);
                   g0 = –feval(DFUNC,X);
                   V = g0;
                   for i = 1:50
                   [a,b] = goldBracket(@fLine,0.0,h);
                   [s,fMin] = goldSearch(@fLine,a,b);
                   X = X + s*V;
                   g1 = –feval(DFUNC,X);
                   if sqrt(dot(g1,g1)) <= tol
                   xMin = X; nCyc = i; return
                   end
                   gamma = dot((g1 – g0),g1)/dot(g0,g0);
                   V = g1 + gamma*V;
                   g0 = g1;
                   end
                   error(‘Method did not converge’)
                   function z = fLine(s)
                   global X FUNC V
                   z = feval(FUNC,X+s*V);
                   function [a,b] = goldBracket(func,x1,h)
                   % Brackets the minimum point of f(x)
                   % func = returns f(x)
                   % x1= starting value of x
                   % h = initial step size
                   % a, b = limits on x
                   c = 1.618033989;
                   f1 = feval(func,x1);
   291   292   293   294   295   296   297   298   299   300   301