Mercurial > forge
changeset 899:369895f71c56 octave-forge
maximize and minimize
author | aadler |
---|---|
date | Sun, 04 May 2003 23:58:47 +0000 |
parents | e9a8cd8417f7 |
children | bd94f5c8280b |
files | main/optim/adsmax.m main/optim/mdsmax.m |
diffstat | 2 files changed, 13 insertions(+), 9 deletions(-) [+] |
line wrap: on
line diff
--- a/main/optim/adsmax.m Sun May 04 16:48:55 2003 +0000 +++ b/main/optim/adsmax.m Sun May 04 23:58:47 2003 +0000 @@ -52,6 +52,8 @@ if length(stopit) == 2, stopit(3) = inf; end % Default target for f-values. if length(stopit) < 5, stopit(5) = 1; end % Default: show progress. trace = stopit(5); +if length(stopit) == 5, stopit(6) = 1; end % Default: maximize +dirn= stopit(6); if nargin < 4, savit = []; end % File name for snapshots. if nargin < 5 | isempty(P) @@ -62,7 +64,7 @@ end end -fmax = feval(f,x,varargin{:}); nf = 1; +fmax = dirn*feval(f,x,varargin{:}); nf = 1; if trace, fprintf('f(x0) = %9.4e\n', fmax), end steps = zeros(n,1); @@ -81,7 +83,7 @@ h = sign(pi'*yi)*norm(pi.*yi)*mu; % Initial step size. if h == 0, h = max(norm(yi,inf),1)*mu; end y = yi + h*pi; - x(:) = y; fnew = feval(f,x,varargin{:}); nf = nf + 1; + x(:) = y; fnew = dirn*feval(f,x,varargin{:}); nf = nf + 1; if fnew > fmax fmax = fnew; if fmax >= stopit(3) @@ -98,7 +100,7 @@ for j=1:lim y = yi + h*pi; - x(:) = y; fnew = feval(f,x,varargin{:}); nf = nf + 1; + x(:) = y; fnew = dirn*feval(f,x,varargin{:}); nf = nf + 1; if fnew <= fmax, break, end fmax = fnew; k = k + 1; if fmax >= stopit(3)
--- a/main/optim/mdsmax.m Sun May 04 16:48:55 2003 +0000 +++ b/main/optim/mdsmax.m Sun May 04 23:58:47 2003 +0000 @@ -61,11 +61,13 @@ if length(stopit) == 3, stopit(4) = 0; end % Default initial simplex. if length(stopit) == 4, stopit(5) = 1; end % Default: show progress. trace = stopit(5); +if length(stopit) == 5, stopit(6) = 1; end % Default: maximize +dirn= stopit(6); if nargin < 4, savit = []; end % File name for snapshots. V = [zeros(n,1) eye(n)]; T = V; f = zeros(n+1,1); ft = f; -V(:,1) = x0; f(1) = feval(fun,x,varargin{:}); +V(:,1) = x0; f(1) = dirn*feval(fun,x,varargin{:}); fmax_old = f(1); if trace, fprintf('f(x0) = %9.4e\n', f(1)), end @@ -81,14 +83,14 @@ V(:,2:n+1) = (x0 + alpha(2)*ones(n,1)) * ones(1,n); for j=2:n+1 V(j-1,j) = x0(j-1) + alpha(1); - x(:) = V(:,j); f(j) = feval(fun,x,varargin{:}); + x(:) = V(:,j); f(j) = dirn*feval(fun,x,varargin{:}); end else % Right-angled simplex based on co-ordinate axes. alpha = scale*ones(n+1,1); for j=2:n+1 V(:,j) = x0 + alpha(j)*V(:,j); - x(:) = V(:,j); f(j) = feval(fun,x,varargin{:}); + x(:) = V(:,j); f(j) = dirn*feval(fun,x,varargin{:}); end end nf = n+1; @@ -136,7 +138,7 @@ for j=2:n+1 % ---Rotation (reflection) step. T(:,j) = 2*v1 - V(:,j); - x(:) = T(:,j); ft(j) = feval(fun,x,varargin{:}); + x(:) = T(:,j); ft(j) = dirn*feval(fun,x,varargin{:}); end nf = nf + n; @@ -145,7 +147,7 @@ if replaced for j=2:n+1 % ---Expansion step. V(:,j) = (1-mu)*v1 + mu*T(:,j); - x(:) = V(:,j); f(j) = feval(fun,x,varargin{:}); + x(:) = V(:,j); f(j) = dirn*feval(fun,x,varargin{:}); end nf = nf + n; % Accept expansion or rotation? @@ -157,7 +159,7 @@ else for j=2:n+1 % ---Contraction step. V(:,j) = (1+theta)*v1 - theta*T(:,j); - x(:) = V(:,j); f(j) = feval(fun,x,varargin{:}); + x(:) = V(:,j); f(j) = dirn*feval(fun,x,varargin{:}); end nf = nf + n; replaced = ( max(f(2:n+1)) > fmax );