Renamed mtlb_fminsearch into fminsearch. Added demos.
[scilab.git] / scilab / modules / optimization / demos / neldermead / nmplot_boxproblemA.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 //
11 // nmplot_boxproblemA.sce --
12 //   Show that the Box algorithm is able to reproduce the 
13 //   numerical experiment presented in Box's paper.
14 //
15
16 //
17 // boxproblemA --
18 //   Computes the Box problem A cost function and 
19 //   inequality constraints.
20 //
21 // Arguments
22 //   x: the point where to compute the function
23 //   index : the stuff to compute
24 //   data : the parameters of Box cost function
25 // Note
26 //  The following protocol is used
27 //  * if index=1, or no index, returns the value of the cost 
28 //    function (default case)
29 //  * if index=2, returns the value of the nonlinear inequality 
30 //    constraints, as a row array
31 //  * if index=3, returns an array which contains
32 //    at index #0, the value of the cost function  
33 //    at index #1 to the end is the list of the values of the nonlinear 
34 //    constraints
35 //  The inequality constraints are expected to be positive.
36 //
37 function f = boxproblemA ( x , index , data )
38   if (~isdef('index','local')) then
39     index = 1
40   end
41   b = x(2) + 0.01 * x(3)
42   x6 = (data.k1 + data.k2 * x(2) ...
43             + data.k3 * x(3) + data.k4 * x(4) + data.k5 * x(5)) * x(1)
44   y1 = data.k6 + data.k7 * x(2) + data.k8 * x(3) ...
45             + data.k9 * x(4) + data.k10 * x(5)
46   y2 = data.k11 + data.k12 * x(2) + data.k13 * x(3) ...
47             + data.k14 * x(4) + data.k15 * x(5)
48   y3 = data.k16 + data.k17 * x(2) + data.k18 * x(3) ...
49             + data.k19 * x(4) + data.k20 * x(5)
50   y4 = data.k21 + data.k22 * x(2) + data.k23 * x(3) ...
51             + data.k24 * x(4) + data.k25 * x(5)
52   x7 = ( y1 + y2 + y3 ) * x(1)
53   x8 = (data.k26 + data.k27 * x(2) + data.k28 * x(3) ...
54             + data.k29 * x(4) ...
55             + data.k30 * x(5) ) * x(1) + x6 + x7
56   if ( index==1 | index==3 ) then
57     f = (data.a2 * y1 + data.a3 * y2 + data.a4 * y3 + data.a5 * y4 ...
58              + 7840 * data.a6 - 100000 * data.a0 ...
59              - 50800 * $b * data.a7 + data.k31 + data.k32 * x(2) + data.k33 * x(3) ...
60              + data.k34 * x(4) + data.k35 * x(5)) * x(1) ...
61              - 24345 + data.a1 * x6
62     f = -f
63   end
64   if ( index==2 | index==3 ) then
65       c1 = x6
66       c2 = 294000 - x6
67       c3 = x7
68       c4 = 294000 - x7
69       c5 = x8
70       c6 = 277200 - x8
71   end
72   select index
73   case 1 then
74     result = f
75   case 2 then
76     result = [c1 c2 c3 c4 c5 c6]
77   case 3 then
78     result = [f c1 c2 c3 c4 c5 c6]
79   else
80     errmsg = sprintf("Unexpected index %d" , index);
81     error(errmsg);
82   end
83 endfunction
84
85 boxparams = struct()
86 boxparams.a0 = 9
87 boxparams.a1 = 15
88 boxparams.a2 = 50
89 boxparams.a3 = 9.583
90 boxparams.a4 = 20
91 boxparams.a5 = 15
92 boxparams.a6 = 6
93 boxparams.a7 = 0.75
94 boxparams.k1 = -145421.402
95 boxparams.k2 = 2931.1506
96 boxparams.k3 = -40.427932
97 boxparams.k4 = 5106.192
98 boxparams.k5 = 15711.36
99 boxparams.k6 = -161622.577
100 boxparams.k7 = 4176.15328
101 boxparams.k8 = 2.8260078
102 boxparams.k9 = 9200.476
103 boxparams.k10 = 13160.295
104 boxparams.k11 = -21686.9194
105 boxparams.k12 = 123.56928
106 boxparams.k13 = -21.1188894
107 boxparams.k14 = 706.834
108 boxparams.k15 = 2898.573
109 boxparams.k16 = 28298.388
110 boxparams.k17 = 60.81096
111 boxparams.k18 = 31.242116
112 boxparams.k19 = 329.574
113 boxparams.k20 = -2882.082
114 boxparams.k21 = 74095.3845
115 boxparams.k22 = -306.262544
116 boxparams.k23 = 16.243649
117 boxparams.k24 = -3094.252
118 boxparams.k25 = -5566.2628
119 boxparams.k26 = -26237.0
120 boxparams.k27 = 99.0
121 boxparams.k28 = -0.42
122 boxparams.k29 = 1300.0
123 boxparams.k30 = 2100.0
124 boxparams.k31 = 925548.252
125 boxparams.k32 = -61968.8432
126 boxparams.k33 = 23.3088196
127 boxparams.k34 = -27097.648
128 boxparams.k35 = -50843.766
129
130
131
132
133 nm = nmplot_new ();
134 nm = nmplot_configure(nm,"-numberofvariables",2);
135 nm = nmplot_configure(nm,"-function",boxproblemA);
136 nm = nmplot_configure(nm,"-costfargument",boxparams);
137 nm = nmplot_configure(nm,"-x0",[1.0 1.0]');
138 nm = nmplot_configure(nm,"-maxiter",200);
139 nm = nmplot_configure(nm,"-maxfunevals",300);
140 nm = nmplot_configure(nm,"-simplex0method","given");
141 nm = nmplot_configure(nm,"-tolsimplexizerelative",1.e-3);
142 nm = nmplot_configure(nm,"-coords0",coords0);
143 nm = nmplot_configure(nm,"-simplex0length",1.0);
144 nm = nmplot_configure(nm,"-method","box");
145 nm = nmplot_configure(nm,"-verbose",1);
146 nm = nmplot_configure(nm,"-verbosetermination",1);
147 // Configure like Box
148 nm = neldermead_configure(nm,"-boundsmin",[0.0 1.2 20.0 9.0 6.0]);
149 nm = neldermead_configure(nm,"-boundsmax",[5.0 2.5 60.0 9.3 7.0]);
150 nm = neldermead_configure(nm,"-simplex0method","randbounds");
151 nm = neldermead_configure(nm,"-nbineqconst",6);
152 //
153 // Perform optimization
154 //
155 nm = nmplot_search(nm);
156 nm = nmplot_destroy(nm);
157
158