]> Creatis software - CreaPhase.git/blobdiff - octave_packages/optim-1.2.0/test_nelder_mead_min_2.m
Add a useful package (from Source forge) for octave
[CreaPhase.git] / octave_packages / optim-1.2.0 / test_nelder_mead_min_2.m
diff --git a/octave_packages/optim-1.2.0/test_nelder_mead_min_2.m b/octave_packages/optim-1.2.0/test_nelder_mead_min_2.m
new file mode 100644 (file)
index 0000000..b43bc52
--- /dev/null
@@ -0,0 +1,153 @@
+## Copyright (C) 2002 Etienne Grossmann <etienne@egdn.net>
+##
+## This program is free software; you can redistribute it and/or modify it under
+## the terms of the GNU General Public License as published by the Free Software
+## Foundation; either version 3 of the License, or (at your option) any later
+## version.
+##
+## This program is distributed in the hope that it will be useful, but WITHOUT
+## ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+## FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
+## details.
+##
+## You should have received a copy of the GNU General Public License along with
+## this program; if not, see <http://www.gnu.org/licenses/>.
+
+## Checks wether the function 'nelder_mead_min' accepts options properly
+
+ok = 1;
+cnt = 1;
+
+if ! exist ("verbose"), verbose = 0; end
+if ! exist ("inspect"), inspect = 0; end
+
+if verbose,
+  printf (["test_nelder_mead_2\n",\
+          "  Check whether nelder_mead_min accepts options properly\n\n"]);
+end
+
+N = 2;
+x1 = zeros (1,N);
+small = 1e-3;
+vol = (small^N) / factorial (N);
+
+## Define simple 2D function : [x,y] -> x^2, start from [0,0]
+## 
+
+function c = my_func (x)
+  c = x(1)^2;
+end
+
+######################################################################
+## Test using volume #################################################
+
+## Choose vtol and initial simplex so that algo should stop immediately.
+ctl = struct ("verbose",verbose, "isz",small, "vtol",vol*1.01, "rst",0);
+
+[x2,v,nev] = nelder_mead_min ("my_func", x1, ctl);
+
+if nev != N+1
+  if verbose || inspect, printf ("not ok %i\n",cnt); end
+  if inspect, keyboard; end
+  ok = 0 ;
+else 
+  if verbose, 
+    printf ("ok %i\n",cnt); 
+  end
+end
+cnt++;
+
+## Choose vtol and initial simplex so that algo should stop after one
+## iteration (should be a reflexion and a tentative extension). Total is 5
+## evaluations. 
+ctl = struct ("verbose",verbose, "isz",small, "vtol",vol*0.99, "rst",0);
+
+x1 = [0,0];
+
+[x2,v,nev] = nelder_mead_min ("my_func", x1, ctl);
+
+if nev != N+3
+  if verbose || inspect, printf ("not ok %i\n",cnt); end
+  if inspect, keyboard; end
+  ok = 0 ;
+else 
+  if verbose, 
+    printf ("ok %i\n",cnt);
+  end
+end
+cnt++;
+
+######################################################################
+## Test using radius #################################################
+
+## Choose rtol and initial simplex so that algo stops immediately.
+ctl = struct ("verbose",verbose, "isz",small, "rtol",small*2.01, "rst",0);
+
+[x2,v,nev] = nelder_mead_min ("my_func", x1, ctl);
+
+if nev != N+1
+  if verbose || inspect, printf ("not ok %i\n",cnt); end
+  if inspect, keyboard; end
+  ok = 0 ;
+else 
+  if verbose, 
+    printf ("ok %i\n",cnt); 
+  end
+end
+cnt++;
+
+## Choose rtol and initial simplex so that algo does not stop immediately.
+ctl = struct ("verbose",verbose, "isz",small, "rtol",small*1.99, "rst",0);
+
+[x2,v,nev] = nelder_mead_min ("my_func", x1, ctl);
+
+if nev <= N+1
+  if verbose || inspect, printf ("not ok %i\n",cnt); end
+  if inspect, keyboard; end
+  ok = 0 ;
+else 
+  if verbose, 
+    printf ("ok %i\n",cnt); 
+  end
+end
+cnt++;
+
+######################################################################
+## Test using values #################################################
+
+## Choose rtol and initial simplex so that algo should stop immediately.
+ctl = struct ("verbose",verbose, "isz",small, "ftol",1.01*small^2, "rst",0);
+
+[x2,v,nev] = nelder_mead_min ("my_func", x1, ctl);
+
+if nev != N+1
+  if verbose || inspect, printf ("not ok %i\n",cnt); end
+  if inspect, keyboard; end
+  ok = 0 ;
+else 
+  if verbose, 
+    printf ("ok %i\n",cnt); 
+  end
+end
+cnt++;
+
+## Choose rtol and initial simplex so that algo does not stop immediately.
+ctl = struct ("verbose",verbose, "isz",small, "ftol",0.99*small^2, "rst",0);
+
+[x2,v,nev] = nelder_mead_min ("my_func", x1, ctl);
+
+if nev <= N+1
+  if verbose || inspect, printf ("not ok %i\n",cnt); end
+  if inspect, keyboard; end
+  ok = 0 ;
+else 
+  if verbose
+    printf ("ok %i\n",cnt); 
+  end
+end
+cnt++;
+
+cnt--;
+if verbose && ok
+  printf ("All %i tests ok\n", cnt);
+end