From: Olaf T. <ola...@un...> - 2010-08-29 10:47:32
|
On Fri, Aug 27, 2010 at 05:23:05PM -0400, Bob Walton wrote: > The nmsmax.m function (Nelder-Mead maximization) in the Optim-1.0.12 > package contains three coding errors. Attached is a diff -c file with > fixes. These fixes reduce the number of function evaluations for my > test functions by about 40% and also greatly reduces the number of times > the procedure gets "stuck" at non-optimum points. The fixes conform the > function to the algorithm published by Nelder and Mead, and also cause > the routine's results to agree with other implementations of the > algorithm. > -- > Bob Walton > *** nmsmaxorig.m Sun Aug 20 09:37:58 2006 > --- nmsmax.m Thu Aug 26 12:36:46 2010 > *************** > *** 154,160 **** > x(:) = ve; > fe = dirn*feval(fun,x,varargin{:}); > nf = nf + 1; > ! if fe > f(1) > vk = ve; fk = fe; > how = 'expand, '; > end > --- 154,160 ---- > x(:) = ve; > fe = dirn*feval(fun,x,varargin{:}); > nf = nf + 1; > ! if fe > fr > vk = ve; fk = fe; > how = 'expand, '; > end > *************** > *** 168,178 **** > x(:) = vc; > fc = dirn*feval(fun,x,varargin{:}); > nf = nf + 1; > ! if fc > f(n) > vk = vc; fk = fc; > how = 'contract,'; > else > ! for j = 2:n > V(:,j) = (V(:,1) + V(:,j))/2; > x(:) = V(:,j); > f(j) = dirn*feval(fun,x,varargin{:}); > --- 168,178 ---- > x(:) = vc; > fc = dirn*feval(fun,x,varargin{:}); > nf = nf + 1; > ! if fc > f(n+1) > vk = vc; fk = fc; > how = 'contract,'; > else > ! for j = 2:n+1 > V(:,j) = (V(:,1) + V(:,j))/2; > x(:) = V(:,j); > f(j) = dirn*feval(fun,x,varargin{:}); > ------------------------------------------------------------------------------ nmsmax.m seems to be "foreign" code, only slightly modified for usage in Octave. If you know the nms algorithm well, I think we should just accept your correction. But I think for verification you should post one or more of your test-problems which work better with the correction. Olaf |