nmplot - McKinonn n1 and n2 demos : the labels on x axis were not visible.
[scilab.git] / scilab / modules / optimization / demos / neldermead / nmplot_mckinnon.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 function demo_mckinnon2()\r
14     filename = 'nmplot_mckinnon.sce';\r
15     dname = get_absolute_file_path(filename);\r
16 \r
17     mprintf(_("Defining McKinnon function...\n"));\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 \r
103     lambda1 = (1.0 + sqrt(33.0))/8.0;\r
104     lambda2 = (1.0 - sqrt(33.0))/8.0;\r
105     coords0 = [\r
106     1.0 1.0\r
107     0.0 0.0\r
108     lambda1 lambda2\r
109     ];\r
110 \r
111 \r
112     x0 = [1.0 1.0]';\r
113     mprintf(_("x0 = %s\n"),strcat(string(x0)," "));\r
114     mprintf(_("Creating object ...\n"));\r
115     nm = nmplot_new ();\r
116     nm = nmplot_configure(nm, "-numberofvariables",2);\r
117     nm = nmplot_configure(nm, "-function",mckinnon3);\r
118     nm = nmplot_configure(nm, "-x0",x0);\r
119     nm = nmplot_configure(nm, "-maxiter",200);\r
120     nm = nmplot_configure(nm, "-maxfunevals",300);\r
121     nm = nmplot_configure(nm, "-tolfunrelative",10*%eps);\r
122     nm = nmplot_configure(nm, "-tolxrelative",10*%eps);\r
123     nm = nmplot_configure(nm, "-simplex0method","given");\r
124     nm = nmplot_configure(nm, "-coords0",coords0);\r
125     //\r
126     // Setup output files\r
127     //\r
128     simplexfn = TMPDIR + filesep() + "history.simplex.txt";\r
129     fbarfn = TMPDIR + filesep() + "history.fbar.txt";\r
130     foptfn = TMPDIR + filesep() + "history.fopt.txt";\r
131     sigmafn = TMPDIR + filesep() + "history.sigma.txt";\r
132     nm = nmplot_configure(nm, "-simplexfn",simplexfn);\r
133     nm = nmplot_configure(nm, "-fbarfn",fbarfn);\r
134     nm = nmplot_configure(nm, "-foptfn",foptfn);\r
135     nm = nmplot_configure(nm, "-sigmafn",sigmafn);\r
136     //\r
137     // Perform optimization\r
138     //\r
139     mprintf(_("Searching (please wait) ...\n"));\r
140     nm = nmplot_search(nm);\r
141     //\r
142     // Print a summary\r
143     //\r
144     exec(fullfile(dname,"nmplot_summary.sci"),-1);\r
145     nmplot_summary(nm)\r
146     //\r
147     // Plot\r
148     //\r
149     mprintf(_("Plot contour (please wait) ...\n"));\r
150     xmin = -0.2; \r
151     xmax = 1.2 ; \r
152     ymin = -2.0 ; \r
153     ymax = 2.0 ; \r
154     nx = 50 ; \r
155     ny = 50;\r
156     xdata=linspace(xmin,xmax,nx);\r
157     ydata=linspace(ymin,ymax,ny);\r
158     scf();\r
159     f = gcf();\r
160     f.axes_size = [710, 560];\r
161     subplot(2,2,1)\r
162     xset("fpf"," ")\r
163     drawlater();\r
164     contour ( xdata , ydata , mckinnon3C , [-0.2 0.0 1.0 2.0 5.0 10.0 20.0] )\r
165     nmplot_simplexhistory ( nm );\r
166     drawnow();\r
167     subplot(2,2,2)\r
168     mytitle = _("Function Value Average"); \r
169     myxlabel = _("Iterations");\r
170     nmplot_historyplot ( nm , fbarfn, mytitle , myxlabel );\r
171     subplot(2,2,3)\r
172     mytitle = _("Minimum Function Value") ; \r
173     myxlabel = _("Iterations");\r
174     nmplot_historyplot ( nm , foptfn, mytitle , myxlabel );\r
175     subplot(2,2,4)\r
176     mytitle = _("Maximum Oriented length") ; \r
177     myxlabel = _("Iterations") ;\r
178     nmplot_historyplot ( nm , sigmafn, mytitle , myxlabel );\r
179     demo_viewCode(filename);\r
180     deletefile(simplexfn);\r
181     deletefile(fbarfn);\r
182     deletefile(foptfn);\r
183     deletefile(sigmafn);\r
184     nm = nmplot_destroy(nm);\r
185     mprintf(_("End of demo.\n"));\r
186 endfunction\r
187 \r
188 demo_mckinnon2()\r
189 clear demo_mckinnon2;\r
190 \r
191 \r
192 \r
193 \r
194 \r
195 \r