fminsearch: updated and fixed demos
[scilab.git] / scilab / modules / optimization / demos / neldermead / neldermead_dimension.sce
1 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
2 // Copyright (C) 2008-2009 - INRIA - Michael Baudin
3 //
4 // This file must be used under the terms of the CeCILL.
5 // This source file is licensed as described in the file COPYING, which
6 // you should have received as part of this distribution.  The terms
7 // are also available at
8 // http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
9
10 mprintf("Illustrates the sensitivity to dimension of the Nelder-Mead algorithm\n");
11
12 function [ f , index ] = quadracticn ( x , index )
13   f = sum(x.^2);
14 endfunction
15 //
16 // solvepb --
17 //   Find the solution for the given number of dimensions
18 //
19 function [nbfevals , niter , rho] = solvepb ( n )
20   rand("seed",0)
21   nm = neldermead_new ();
22   nm = neldermead_configure(nm,"-numberofvariables",n);
23   nm = neldermead_configure(nm,"-function",quadracticn);
24   nm = neldermead_configure(nm,"-x0",zeros(n,1));
25   nm = neldermead_configure(nm,"-maxiter",2000);
26   nm = neldermead_configure(nm,"-maxfunevals",2000);
27   nm = neldermead_configure(nm,"-tolxmethod",%f);
28   nm = neldermead_configure(nm,"-tolsimplexizerelative",0.0);
29   nm = neldermead_configure(nm,"-tolsimplexizeabsolute",1.e-8);
30   nm = neldermead_configure(nm,"-simplex0method","given");
31   coords (1,1:n) = zeros(1,n);
32   for i = 2:n+1
33     coords (i,1:n) = 2.0 * rand(1,n) - 1.0;
34   end
35   nm = neldermead_configure(nm,"-coords0",coords);
36   nm = neldermead_configure(nm,"-method","variable");
37   //nm = neldermead_configure(nm,"-verbose",1);
38   //nm = neldermead_configure(nm,"-verbosetermination",1);
39   //
40   // Perform optimization
41   //
42   nm = neldermead_search(nm);
43   //neldermead_display(nm);
44   si0 = neldermead_get ( nm , "-simplex0" );
45   sigma0 = optimsimplex_size ( si0 , "sigmaplus" );
46   siopt = neldermead_get ( nm , "-simplexopt" );
47   sigmaopt = optimsimplex_size ( siopt , "sigmaplus" );
48   niter = neldermead_get ( nm , "-iterations" );
49   rho = (sigmaopt/sigma0)^(1.0/niter);
50   nbfevals = neldermead_get ( nm , "-funevals" );
51   mprintf ( "%d %d %d %f\n", n , nbfevals , niter , rho );
52   nm = neldermead_destroy(nm);
53 endfunction
54
55
56 for n = 1:20
57   [nbfevals niter rho] = solvepb ( n );
58   array_rho(n) = rho;
59   array_nbfevals(n) = nbfevals;
60   array_niter(n) = niter;
61 end
62 // Plot rate of convergence
63 hh = scf();
64 plot(1:20,array_rho)
65 hh.children.x_label.text = "Number of parameters"
66 hh.children.y_label.text = "Rate of convergence"
67 hh.children.children.children.mark_mode = "on";
68 hh.children.children.children.mark_style = 9;
69 hh.children.children.children.mark_size = 10;
70
71 // Plot number of function evaluations
72 hh = scf();
73 plot(1:20,array_nbfevals)
74 hh.children.x_label.text = "Number of parameters"
75 hh.children.y_label.text = "Number of function evaluations"
76 hh.children.children.children.mark_mode = "on";
77 hh.children.children.children.mark_style = 9;
78 hh.children.children.children.mark_size = 10;
79 //
80 // Load this script into the editor
81 //
82 filename = 'neldermead_dimension.sce';
83 dname = get_absolute_file_path(filename);
84 editor ( dname + filename );
85