1 //% MCKINNON computes the McKinnon function.
2 //
3 //  Discussion:
4 //
5 //    This function has a global minimizer:
6 //
7 //      X* = ( 0.0, -0.5 ), F(X*) = -0.25
8 //
9 //    There are three parameters, TAU, THETA and PHI.
10 //
11 //    1 < TAU, then F is strictly convex.
12 //             and F has continuous first derivatives.
13 //    2 < TAU, then F has continuous second derivatives.
14 //    3 < TAU, then F has continuous third derivatives.
15 //
16 //    However, this function can cause the Nelder-Mead optimization
17 //    algorithm to "converge" to a point which is not the minimizer
18 //    of the function F.
19 //
20 //    Sample parameter values which cause problems for Nelder-Mead
21 //    include:
22 //
23 //      TAU = 1, THETA = 15, PHI =  10;
24 //      TAU = 2, THETA =  6, PHI =  60;
25 //      TAU = 3, THETA =  6, PHI = 400;
26 //
27 //    To get the bad behavior, we also assume the initial simplex has the form
28 //
29 //      X1 = (0,0),
30 //      X2 = (1,1),
31 //      X3 = (A,B),
32 //
33 //    where
34 //
35 //      A = (1+sqrt(33))/8 =  0.84307...
36 //      B = (1-sqrt(33))/8 = -0.59307...
37 //
38 //  Licensing:
39 //
40 //    This code is distributed under the GNU LGPL license.
41 //
42 //  Modified:
43 //
44 //    09 February 2008
45 //
46 //  Author:
47 //
48 //    John Burkardt
49 //
50 //  Reference:
51 //
52 //    Ken McKinnon,
53 //    Convergence of the Nelder-Mead simplex method to a nonstationary point,
54 //    SIAM Journal on Optimization,
55 //    Volume 9, Number 1, 1998, pages 148-158.
56 //
57 //  Parameters:
58 //
59 //    Input, real X(2), the argument of the function.
60 //
61 //    Output, real F, the value of the function at X.
62 //
63 // Copyright (C) 2009 - INRIA - Michael Baudin, Scilab port
64 function f = mckinnon1 ( x )
66   if ( length ( x ) ~= 2 )
67     error ( 'Error: function expects a two dimensional input\n' );
68   end
70   tau = 1.0;
71   theta = 15.0;
72   phi = 10.0;
74   if ( x(1) <= 0.0 )
75     f = theta * phi * abs ( x(1) ).^tau + x(2) * ( 1.0 + x(2) );
76   else
77     f = theta       *       x(1).^tau   + x(2) * ( 1.0 + x(2) );
78   end
79 endfunction
80 function f = mckinnon2 ( x )
82   if ( length ( x ) ~= 2 )
83     error ( 'Error: function expects a two dimensional input\n' );
84   end
86   tau = 2.0;
87   theta = 6.0;
88   phi = 60.0;
90   if ( x(1) <= 0.0 )
91     f = theta * phi * abs ( x(1) ).^tau + x(2) * ( 1.0 + x(2) );
92   else
93     f = theta       *       x(1).^tau   + x(2) * ( 1.0 + x(2) );
94   end
95 endfunction
96 function f = mckinnon3 ( x )
98   if ( length ( x ) ~= 2 )
99     error ( 'Error: function expects a two dimensional input\n' );
100   end
102   tau = 3.0;
103   theta = 6.0;
104   phi = 400.0;
106   if ( x(1) <= 0.0 )
107     f = theta * phi * abs ( x(1) ).^tau + x(2) * ( 1.0 + x(2) );
108   else
109     f = theta       *       x(1).^tau   + x(2) * ( 1.0 + x(2) );
110   end
111 endfunction