nmplot - McKinonn n1 and n2 demos : the labels on x axis were not visible.
[scilab.git] / scilab / modules / optimization / demos / neldermead / nmplot_mckinnon.sce
index b23b4ac..0261c7e 100644 (file)
-// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
-// Copyright (C) 2008-2009 - INRIA - Michael Baudin
-//
-// This file must be used under the terms of the CeCILL.
-// This source file is licensed as described in the file COPYING, which
-// you should have received as part of this distribution.  The terms
-// are also available at
-// http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
-
-
-mprintf("Defining McKinnon function...\n");
-//% MCKINNON computes the McKinnon function.
-//
-//  Discussion:
-//
-//    This function has a global minimizer:
-//
-//      X* = ( 0.0, -0.5 ), F(X*) = -0.25
-//
-//    There are three parameters, TAU, THETA and PHI.
-//
-//    1 < TAU, then F is strictly convex.
-//             and F has continuous first derivatives.
-//    2 < TAU, then F has continuous second derivatives.
-//    3 < TAU, then F has continuous third derivatives.
-//
-//    However, this function can cause the Nelder-Mead optimization
-//    algorithm to "converge" to a point which is not the minimizer
-//    of the function F.
-//
-//    Sample parameter values which cause problems for Nelder-Mead 
-//    include:
-//
-//      TAU = 1, THETA = 15, PHI =  10;
-//      TAU = 2, THETA =  6, PHI =  60;
-//      TAU = 3, THETA =  6, PHI = 400;
-//
-//    To get the bad behavior, we also assume the initial simplex has the form
-//
-//      X1 = (0,0),
-//      X2 = (1,1),
-//      X3 = (A,B), 
-//
-//    where 
-//
-//      A = (1+sqrt(33))/8 =  0.84307...
-//      B = (1-sqrt(33))/8 = -0.59307...
-//
-//  Licensing:
-//
-//    This code is distributed under the GNU LGPL license.
-//
-//  Modified:
-//
-//    09 February 2008
-//
-//  Author:
-//
-//    John Burkardt
-//
-//  Reference:
-//
-//    Ken McKinnon,
-//    Convergence of the Nelder-Mead simplex method to a nonstationary point,
-//    SIAM Journal on Optimization,
-//    Volume 9, Number 1, 1998, pages 148-158.
-//
-//  Parameters:
-//
-//    Input, real X(2), the argument of the function.
-//
-//    Output, real F, the value of the function at X.
-//
-// Copyright (C) 2009 - INRIA - Michael Baudin, Scilab port
-
-function [ f , index ] = mckinnon3 ( x , index )
-
-  if ( length ( x ) ~= 2 )
-    error ( 'Error: function expects a two dimensional input\n' );
-  end
-
-  tau = 3.0;
-  theta = 6.0;
-  phi = 400.0;
-
-  if ( x(1) <= 0.0 )
-    f = theta * phi * abs ( x(1) ).^tau + x(2) * ( 1.0 + x(2) );
-  else
-    f = theta       *       x(1).^tau   + x(2) * ( 1.0 + x(2) );
-  end
-endfunction
-
-
-lambda1 = (1.0 + sqrt(33.0))/8.0;
-lambda2 = (1.0 - sqrt(33.0))/8.0;
-coords0 = [
-1.0 1.0
-0.0 0.0
-lambda1 lambda2
-];
-
-
-x0 = [1.0 1.0]';
-mprintf("x0=%s\n",strcat(string(x0)," "));
-mprintf("Creating object...\n");
-nm = nmplot_new ();
-nm = nmplot_configure(nm,"-numberofvariables",2);
-nm = nmplot_configure(nm,"-function",mckinnon3);
-nm = nmplot_configure(nm,"-x0",x0);
-nm = nmplot_configure(nm,"-maxiter",200);
-nm = nmplot_configure(nm,"-maxfunevals",300);
-nm = nmplot_configure(nm,"-tolfunrelative",10*%eps);
-nm = nmplot_configure(nm,"-tolxrelative",10*%eps);
-nm = nmplot_configure(nm,"-simplex0method","given");
-nm = nmplot_configure(nm,"-coords0",coords0);
-nm = nmplot_configure(nm,"-simplex0length",1.0);
-nm = nmplot_configure(nm,"-method","variable");
-//nm = nmplot_configure(nm,"-verbose",1);
-nm = nmplot_configure(nm,"-verbosetermination",1);
-//
-// Setup output files
-//
-nm = nmplot_configure(nm,"-simplexfn","mckinnon.history.simplex.txt");
-nm = nmplot_configure(nm,"-fbarfn","mckinnon.history.fbar.txt");
-nm = nmplot_configure(nm,"-foptfn","mckinnon.history.fopt.txt");
-nm = nmplot_configure(nm,"-sigmafn","mckinnon.history.sigma.txt");
-//
-// Perform optimization
-//
-nm = nmplot_search(nm);
-nmplot_display(nm);
-//
-// Plot
-//
-mprintf("Plot contour...\n");
-[nm , xdata , ydata , zdata ] = nmplot_contour ( nm , xmin = -0.2 , xmax = 1.2 , ymin = -2.0 , ymax = 2.0 , nx = 50 , ny = 50 );
-f = scf(100001);
-xset("fpf"," ")
-drawlater();
-contour ( xdata , ydata , zdata , [-0.2 0.0 1.0 2.0 5.0 10.0 20.0] )
-nmplot_simplexhistory ( nm );
-drawnow();
-f = scf(100002);
-nmplot_historyplot ( nm , "mckinnon.history.fbar.txt" , ...
-  mytitle = "Function Value Average" , myxlabel = "Iterations" );
-f = scf(100003);
-nmplot_historyplot ( nm , "mckinnon.history.fopt.txt" , ...
-  mytitle = "Minimum Function Value" , myxlabel = "Iterations" );
-f = scf(100004);
-nmplot_historyplot ( nm , "mckinnon.history.sigma.txt" , ...
-  mytitle = "Maximum Oriented length" , myxlabel = "Iterations" );
-deletefile("mckinnon.history.simplex.txt");
-deletefile("mckinnon.history.fbar.txt");
-deletefile("mckinnon.history.fopt.txt");
-deletefile("mckinnon.history.sigma.txt");
-nm = nmplot_destroy(nm);
-
-//
-// Load this script into the editor
-//
-filename = 'nmplot_mckinnon.sce';
-dname = get_absolute_file_path(filename);
-editor ( dname + filename );
-
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab\r
+// Copyright (C) 2008-2009 - INRIA - Michael Baudin\r
+// Copyright (C) 2010 - DIGITEO - Allan CORNET\r
+// Copyright (C) 2011 - DIGITEO - Michael Baudin\r
+// Copyright (C) 2012 - Scilab Enterprises - Adeline CARNIS\r
+//\r
+// This file must be used under the terms of the CeCILL.\r
+// This source file is licensed as described in the file COPYING, which\r
+// you should have received as part of this distribution.  The terms\r
+// are also available at\r
+// http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt\r
+\r
+function demo_mckinnon2()\r
+    filename = 'nmplot_mckinnon.sce';\r
+    dname = get_absolute_file_path(filename);\r
+\r
+    mprintf(_("Defining McKinnon function...\n"));\r
+    //% MCKINNON computes the McKinnon function.\r
+    //\r
+    //  Discussion:\r
+    //\r
+    //  This function has a global minimizer:\r
+    //\r
+    //    X* = ( 0.0, -0.5 ), F(X*) = -0.25\r
+    //\r
+    //  There are three parameters, TAU, THETA and PHI.\r
+    //\r
+    //  1 < TAU, then F is strictly convex.\r
+    //       and F has continuous first derivatives.\r
+    //  2 < TAU, then F has continuous second derivatives.\r
+    //  3 < TAU, then F has continuous third derivatives.\r
+    //\r
+    //  However, this function can cause the Nelder-Mead optimization\r
+    //  algorithm to "converge" to a point which is not the minimizer\r
+    //  of the function F.\r
+    //\r
+    //  Sample parameter values which cause problems for Nelder-Mead \r
+    //  include:\r
+    //\r
+    //    TAU = 1, THETA = 15, PHI =  10;\r
+    //    TAU = 2, THETA =  6, PHI =  60;\r
+    //    TAU = 3, THETA =  6, PHI = 400;\r
+    //\r
+    //  To get the bad behavior, we also assume the initial simplex has the form\r
+    //\r
+    //    X1 = (0,0),\r
+    //    X2 = (1,1),\r
+    //    X3 = (A,B), \r
+    //\r
+    //  where \r
+    //\r
+    //    A = (1+sqrt(33))/8 =  0.84307...\r
+    //    B = (1-sqrt(33))/8 = -0.59307...\r
+    //\r
+    //  Licensing:\r
+    //\r
+    //  This code is distributed under the GNU LGPL license.\r
+    //\r
+    //  Modified:\r
+    //\r
+    //  09 February 2008\r
+    //\r
+    //  Author:\r
+    //\r
+    //  John Burkardt\r
+    //\r
+    //  Reference:\r
+    //\r
+    //  Ken McKinnon,\r
+    //  Convergence of the Nelder-Mead simplex method to a nonstationary point,\r
+    //  SIAM Journal on Optimization,\r
+    //  Volume 9, Number 1, 1998, pages 148-158.\r
+    //\r
+    //  Parameters:\r
+    //\r
+    //  Input, real X(2), the argument of the function.\r
+    //\r
+    //  Output, real F, the value of the function at X.\r
+    //\r
+    // Copyright (C) 2009 - INRIA - Michael Baudin, Scilab port\r
+\r
+    function [ f , index ] = mckinnon3 ( x , index )\r
+\r
+        if ( length ( x ) ~= 2 )\r
+            error (_('Error: function expects a two dimensional input\n'));\r
+        end\r
+\r
+        tau = 3.0;\r
+        theta = 6.0;\r
+        phi = 400.0;\r
+\r
+        if ( x(1) <= 0.0 )\r
+            f = theta * phi * abs ( x(1) ).^tau + x(2) * ( 1.0 + x(2) );\r
+        else\r
+            f = theta     *     x(1).^tau   + x(2) * ( 1.0 + x(2) );\r
+        end\r
+    endfunction\r
+    function y = mckinnon3C ( x1 , x2 )\r
+        y = mckinnon3 ( [x1 , x2] , 2 )\r
+    endfunction\r
+\r
+\r
+    lambda1 = (1.0 + sqrt(33.0))/8.0;\r
+    lambda2 = (1.0 - sqrt(33.0))/8.0;\r
+    coords0 = [\r
+    1.0 1.0\r
+    0.0 0.0\r
+    lambda1 lambda2\r
+    ];\r
+\r
+\r
+    x0 = [1.0 1.0]';\r
+    mprintf(_("x0 = %s\n"),strcat(string(x0)," "));\r
+    mprintf(_("Creating object ...\n"));\r
+    nm = nmplot_new ();\r
+    nm = nmplot_configure(nm, "-numberofvariables",2);\r
+    nm = nmplot_configure(nm, "-function",mckinnon3);\r
+    nm = nmplot_configure(nm, "-x0",x0);\r
+    nm = nmplot_configure(nm, "-maxiter",200);\r
+    nm = nmplot_configure(nm, "-maxfunevals",300);\r
+    nm = nmplot_configure(nm, "-tolfunrelative",10*%eps);\r
+    nm = nmplot_configure(nm, "-tolxrelative",10*%eps);\r
+    nm = nmplot_configure(nm, "-simplex0method","given");\r
+    nm = nmplot_configure(nm, "-coords0",coords0);\r
+    //\r
+    // Setup output files\r
+    //\r
+    simplexfn = TMPDIR + filesep() + "history.simplex.txt";\r
+    fbarfn = TMPDIR + filesep() + "history.fbar.txt";\r
+    foptfn = TMPDIR + filesep() + "history.fopt.txt";\r
+    sigmafn = TMPDIR + filesep() + "history.sigma.txt";\r
+    nm = nmplot_configure(nm, "-simplexfn",simplexfn);\r
+    nm = nmplot_configure(nm, "-fbarfn",fbarfn);\r
+    nm = nmplot_configure(nm, "-foptfn",foptfn);\r
+    nm = nmplot_configure(nm, "-sigmafn",sigmafn);\r
+    //\r
+    // Perform optimization\r
+    //\r
+    mprintf(_("Searching (please wait) ...\n"));\r
+    nm = nmplot_search(nm);\r
+    //\r
+    // Print a summary\r
+    //\r
+    exec(fullfile(dname,"nmplot_summary.sci"),-1);\r
+    nmplot_summary(nm)\r
+    //\r
+    // Plot\r
+    //\r
+    mprintf(_("Plot contour (please wait) ...\n"));\r
+    xmin = -0.2; \r
+    xmax = 1.2 ; \r
+    ymin = -2.0 ; \r
+    ymax = 2.0 ; \r
+    nx = 50 ; \r
+    ny = 50;\r
+    xdata=linspace(xmin,xmax,nx);\r
+    ydata=linspace(ymin,ymax,ny);\r
+    scf();\r
+    f = gcf();\r
+    f.axes_size = [710, 560];\r
+    subplot(2,2,1)\r
+    xset("fpf"," ")\r
+    drawlater();\r
+    contour ( xdata , ydata , mckinnon3C , [-0.2 0.0 1.0 2.0 5.0 10.0 20.0] )\r
+    nmplot_simplexhistory ( nm );\r
+    drawnow();\r
+    subplot(2,2,2)\r
+    mytitle = _("Function Value Average"); \r
+    myxlabel = _("Iterations");\r
+    nmplot_historyplot ( nm , fbarfn, mytitle , myxlabel );\r
+    subplot(2,2,3)\r
+    mytitle = _("Minimum Function Value") ; \r
+    myxlabel = _("Iterations");\r
+    nmplot_historyplot ( nm , foptfn, mytitle , myxlabel );\r
+    subplot(2,2,4)\r
+    mytitle = _("Maximum Oriented length") ; \r
+    myxlabel = _("Iterations") ;\r
+    nmplot_historyplot ( nm , sigmafn, mytitle , myxlabel );\r
+    demo_viewCode(filename);\r
+    deletefile(simplexfn);\r
+    deletefile(fbarfn);\r
+    deletefile(foptfn);\r
+    deletefile(sigmafn);\r
+    nm = nmplot_destroy(nm);\r
+    mprintf(_("End of demo.\n"));\r
+endfunction\r
+\r
+demo_mckinnon2()\r
+clear demo_mckinnon2;\r
+\r
+\r
+\r
+\r
+\r
+\r