nmplot - McKinonn n1 and n2 demos : the labels on x axis were not visible.
[scilab.git] / scilab / modules / optimization / demos / neldermead / nmplot_mckinnon2.sce
1 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab\r
2 // Copyright (C) 2008-2009 - INRIA - Michael Baudin\r
3 // Copyright (C) 2010 - DIGITEO - Allan CORNET\r
4 // Copyright (C) 2011 - DIGITEO - Michael Baudin\r
5 // Copyright (C) 2012 - Scilab Enterprises - Adeline CARNIS\r
6 //\r
7 // This file must be used under the terms of the CeCILL.\r
8 // This source file is licensed as described in the file COPYING, which\r
9 // you should have received as part of this distribution.  The terms\r
10 // are also available at\r
11 // http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt\r
12 \r
13 \r
14 function demo_mckinnon2()\r
15 \r
16     mprintf(_("Defining McKinnon function...\n"));\r
17 \r
18     //% MCKINNON computes the McKinnon function.\r
19     //\r
20     //  Discussion:\r
21     //\r
22     //    This function has a global minimizer:\r
23     //\r
24     //      X* = ( 0.0, -0.5 ), F(X*) = -0.25\r
25     //\r
26     //    There are three parameters, TAU, THETA and PHI.\r
27     //\r
28     //    1 < TAU, then F is strictly convex.\r
29     //             and F has continuous first derivatives.\r
30     //    2 < TAU, then F has continuous second derivatives.\r
31     //    3 < TAU, then F has continuous third derivatives.\r
32     //\r
33     //    However, this function can cause the Nelder-Mead optimization\r
34     //    algorithm to "converge" to a point which is not the minimizer\r
35     //    of the function F.\r
36     //\r
37     //    Sample parameter values which cause problems for Nelder-Mead \r
38     //    include:\r
39     //\r
40     //      TAU = 1, THETA = 15, PHI =  10;\r
41     //      TAU = 2, THETA =  6, PHI =  60;\r
42     //      TAU = 3, THETA =  6, PHI = 400;\r
43     //\r
44     //    To get the bad behavior, we also assume the initial simplex has the form\r
45     //\r
46     //      X1 = (0,0),\r
47     //      X2 = (1,1),\r
48     //      X3 = (A,B), \r
49     //\r
50     //    where \r
51     //\r
52     //      A = (1+sqrt(33))/8 =  0.84307...\r
53     //      B = (1-sqrt(33))/8 = -0.59307...\r
54     //\r
55     //  Licensing:\r
56     //\r
57     //    This code is distributed under the GNU LGPL license.\r
58     //\r
59     //  Modified:\r
60     //\r
61     //    09 February 2008\r
62     //\r
63     //  Author:\r
64     //\r
65     //    John Burkardt\r
66     //\r
67     //  Reference:\r
68     //\r
69     //    Ken McKinnon,\r
70     //    Convergence of the Nelder-Mead simplex method to a nonstationary point,\r
71     //    SIAM Journal on Optimization,\r
72     //    Volume 9, Number 1, 1998, pages 148-158.\r
73     //\r
74     //  Parameters:\r
75     //\r
76     //    Input, real X(2), the argument of the function.\r
77     //\r
78     //    Output, real F, the value of the function at X.\r
79     //\r
80     // Copyright (C) 2009 - INRIA - Michael Baudin, Scilab port\r
81 \r
82     function [ f , index ] = mckinnon3 ( x , index )\r
83 \r
84         if ( length ( x ) ~= 2 )\r
85             error (_('Error: function expects a two dimensional input\n'));\r
86         end\r
87 \r
88         tau = 3.0;\r
89         theta = 6.0;\r
90         phi = 400.0;\r
91 \r
92         if ( x(1) <= 0.0 )\r
93             f = theta * phi * abs ( x(1) ).^tau + x(2) * ( 1.0 + x(2) );\r
94         else\r
95             f = theta       *       x(1).^tau   + x(2) * ( 1.0 + x(2) );\r
96         end\r
97     endfunction\r
98     function y = mckinnon3C ( x1 , x2 )\r
99         y = mckinnon3 ( [x1 , x2] , 2 )\r
100     endfunction\r
101 \r
102     lambda1 = (1.0 + sqrt(33.0))/8.0;\r
103     lambda2 = (1.0 - sqrt(33.0))/8.0;\r
104     coords0 = [\r
105     1.0  1.0\r
106     0.0  0.0\r
107     lambda1 lambda2\r
108     ];\r
109 \r
110 \r
111     x0 = [1.0 1.0]';\r
112     mprintf(_("x0=%s\n"), strcat(string(x0)," "));\r
113     mprintf(_("Creating object...\n"));\r
114     nm = nmplot_new ();\r
115     nm = nmplot_configure(nm, "-numberofvariables",2);\r
116     nm = nmplot_configure(nm, "-function",mckinnon3);\r
117     nm = nmplot_configure(nm, "-x0",x0);\r
118     nm = nmplot_configure(nm, "-maxiter",200);\r
119     nm = nmplot_configure(nm, "-maxfunevals",300);\r
120     nm = nmplot_configure(nm, "-tolsimplexizerelative",1.e-6);\r
121     nm = nmplot_configure(nm, "-simplex0method","given");\r
122     nm = nmplot_configure(nm, "-coords0",coords0);\r
123     nm = nmplot_configure(nm, "-kelleystagnationflag",%t);\r
124     nm = nmplot_configure(nm, "-restartflag",%t);\r
125     nm = nmplot_configure(nm, "-restartdetection","kelley");\r
126     //\r
127     // Setup output files\r
128     //\r
129     simplexfn = TMPDIR + filesep() + "history.simplex.txt";\r
130     fbarfn = TMPDIR + filesep() + "history.fbar.txt";\r
131     foptfn = TMPDIR + filesep() + "history.fopt.txt";\r
132     sigmafn = TMPDIR + filesep() + "history.sigma.txt";\r
133     nm = nmplot_configure(nm, "-simplexfn",simplexfn);\r
134     nm = nmplot_configure(nm, "-fbarfn",fbarfn);\r
135     nm = nmplot_configure(nm, "-foptfn",foptfn);\r
136     nm = nmplot_configure(nm, "-sigmafn",sigmafn);\r
137     //\r
138     // Perform optimization\r
139     //\r
140     mprintf(_("Searching (please wait) ...\n"));\r
141     nm = nmplot_search(nm);\r
142     disp(nm);\r
143 \r
144     //\r
145     // Plot\r
146     //\r
147     mprintf(_("Plot contour (please wait) ...\n"));\r
148     xmin = -0.2; \r
149     xmax = 1.2 ; \r
150     ymin = -2.0 ; \r
151     ymax = 2.0 ; \r
152     nx = 50 ; \r
153     ny = 50;\r
154     xdata=linspace(xmin,xmax,nx);\r
155     ydata=linspace(ymin,ymax,ny);\r
156     scf();\r
157     f = gcf();\r
158     f.axes_size = [710, 560];\r
159     subplot(2,2,1)\r
160     xset("fpf"," ")\r
161     drawlater();\r
162     contour ( xdata , ydata , mckinnon3C , [-0.2 0.0 1.0 2.0 5.0 10.0 20.0] )\r
163     nmplot_simplexhistory ( nm );\r
164     drawnow();\r
165     subplot(2,2,2)\r
166     mytitle = _("Function Value Average"); \r
167     myxlabel = _("Iterations");\r
168     nmplot_historyplot ( nm , fbarfn, mytitle , myxlabel );\r
169     subplot(2,2,3)\r
170     mytitle = _("Minimum Function Value") ; \r
171     myxlabel = _("Iterations");\r
172     nmplot_historyplot ( nm , foptfn, mytitle , myxlabel );\r
173     subplot(2,2,4)\r
174     mytitle = _("Maximum Oriented length") ; \r
175     myxlabel = _("Iterations") ;\r
176     nmplot_historyplot ( nm , sigmafn, mytitle , myxlabel );\r
177     demo_viewCode("nmplot_mckinnon2.sce");\r
178     deletefile(simplexfn);\r
179     deletefile(fbarfn);\r
180     deletefile(foptfn);\r
181     deletefile(sigmafn);\r
182     nm = nmplot_destroy(nm);\r
183     mprintf(_("End of demo.\n"));\r
184 endfunction\r
185 \r
186 demo_mckinnon2();\r
187 clear demo_mckinnon2\r
188 \r
189 \r
190 \r