* Function without output argument cannot be call in assignation expression
[scilab.git] / scilab / modules / optimization / tests / unit_tests / neldermead / fminsearch_output.dia.ref
1 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
2 // Copyright (C) 2008-2009 - INRIA - Michael Baudin
3 // Copyright (C) 2011 - DIGITEO - Michael Baudin
4 //
5 // Copyright (C) 2012 - 2016 - Scilab Enterprises
6 //
7 // This file is hereby licensed under the terms of the GNU GPL v2.0,
8 // pursuant to article 5.3.4 of the CeCILL v.2.1.
9 // This file was originally licensed under the terms of the CeCILL v2.1,
10 // and continues to be available under such terms.
11 // For more information, see the COPYING file which you should have received
12 // along with this program.
13 // <-- ENGLISH IMPOSED -->
14 function y = rosenbrock ( x )
15     y = 100*(x(2)-x(1)^2)^2 + (1-x(1))^2;
16 endfunction
17 //
18 // Use output function
19 //
20 // outfun --
21 //   A sample output function
22 // Arguments, input
23 //   x : the current point
24 //   optimValues : a tlist which contains the following fields
25 //     funccount : the number of function evaluations
26 //     fval : the current function value
27 //     iteration : the current iteration
28 //     procedure : a string containing the current type of step
29 //  state : the current state of the algorithm
30 //    "init", "iter", "done"
31 //
32 function stop = outfun ( x , optimValues , state )
33     plot( x(1),x(2),".");
34     // Unload all fields and check consistent values
35     fc = optimValues.funccount;
36     fv = optimValues.fval;
37     it = optimValues.iteration;
38     pr = optimValues.procedure;
39     select pr
40     case "initial simplex"
41         // OK
42     case "expand"
43         // OK
44     case "reflect"
45         // OK
46     case "shrink"
47         // OK
48     case "contract inside"
49         // OK
50     case "contract outside"
51         // OK
52     case ""
53         // OK
54     else
55         error ( sprintf ( "Unknown procedure %s." , pr ) )
56     end
57     select state
58     case "init"
59         // OK
60     case "iter"
61         // OK
62     case "done"
63         // OK
64     else
65         error ( sprintf ( "Unknown state %s." , state ) )
66     end
67     mprintf ( "%d %s %d -%s- %s\n" , fc , string(fv) , it , pr , state )
68     stop = %f
69 endfunction
70 opt = optimset ( "OutputFcn" , outfun);
71 opt = optimset ( opt , "MaxIter" , 10 );
72 [x fval] = fminsearch ( rosenbrock , [-1.2 1] , opt );
73 3 24.2 0 -- init
74 3 20.05 1 -initial simplex- iter
75 5 5.161796 2 -expand- iter
76 7 4.497796 3 -reflect- iter
77 9 4.497796 4 -contract outside- iter
78 11 4.3813601 5 -contract inside- iter
79 13 4.2452728 6 -contract inside- iter
80 15 4.2176247 7 -reflect- iter
81 17 4.2112906 8 -contract inside- iter
82 19 4.1355598 9 -expand- iter
83 21 4.1355598 10 -contract inside- iter
84 21 4.1355598 10 -- done
85 fminsearch: Exiting: Maximum number of iterations has been exceeded
86          - increase MaxIter option.
87          Current function value: 4.1355598
88 close(gcf());
89 //
90 // Use several output functions
91 //
92 function stop = outfun2 ( x , optimValues , state )
93     global __fig1__
94     scf ( __fig1__ );
95     plot( x(1),x(2),".");
96     stop = %f
97 endfunction
98 function stop = outfun3 ( x , optimValues , state )
99     global __fig2__
100     scf ( __fig2__ );
101     plot( x(1),x(2),"o");
102     stop = %f
103 endfunction
104 myfunctions = list ( outfun2 , outfun3 );
105 global __fig1__
106 global __fig2__
107 __fig1__ = scf();
108 __fig2__ = scf();
109 opt = optimset ( "OutputFcn" , myfunctions );
110 opt = optimset ( opt , "MaxIter" , 10 );
111 [x fval] = fminsearch ( rosenbrock , [-1.2 1] , opt );
112 fminsearch: Exiting: Maximum number of iterations has been exceeded
113          - increase MaxIter option.
114          Current function value: 4.1355598
115 close(__fig1__);
116 close(__fig2__);
117 //
118 // Use plot function
119 //
120 //
121 // plotfun --
122 //   A sample plot function
123 // Arguments, input
124 //   x : the current point
125 //   optimValues : a tlist which contains the following fields
126 //     funcCount" : the number of function evaluations
127 //     fval : the current function value
128 //     iteration : the current iteration
129 //     procedure : a string containing the current type of step
130 //  state : the current state of the algorithm
131 //    "init", "iter", "done"
132 //
133 function plotfun ( x , optimValues , state )
134     plot(x(1),x(2),".");
135 endfunction
136 opt = optimset ( "PlotFcns" , plotfun);
137 opt = optimset ( opt , "MaxIter" , 10 );
138 [x fval] = fminsearch ( rosenbrock , [-1.2 1] , opt );
139 fminsearch: Exiting: Maximum number of iterations has been exceeded
140          - increase MaxIter option.
141          Current function value: 4.1355598
142 close(gcf());
143 //
144 // Use several plot functions
145 //
146 function plotfun2 ( x , optimValues , state )
147     global __fig1__
148     scf ( __fig1__ );
149     plot( x(1),x(2),".");
150 endfunction
151 function plotfun3 ( x , optimValues , state )
152     global __fig2__
153     scf ( __fig2__ );
154     plot( x(1),x(2),"o");
155 endfunction
156 myfunctions = list ( plotfun2 , plotfun3 );
157 global __fig1__
158 global __fig2__
159 __fig1__ = scf();
160 __fig2__ = scf();
161 opt = optimset ( "PlotFcns" , myfunctions );
162 opt = optimset ( opt , "MaxIter" , 10 );
163 [x fval] = fminsearch ( rosenbrock , [-1.2 1] , opt );
164 fminsearch: Exiting: Maximum number of iterations has been exceeded
165          - increase MaxIter option.
166          Current function value: 4.1355598
167 close(__fig1__);
168 close(__fig2__);
169 //
170 // Use optimplotfval plot function
171 //
172 opt = optimset ( "PlotFcns" , optimplotfval );
173 opt = optimset ( opt , "MaxIter" , 10 );
174 [x fval] = fminsearch ( rosenbrock , [-1.2 1] , opt );
175 fminsearch: Exiting: Maximum number of iterations has been exceeded
176          - increase MaxIter option.
177          Current function value: 4.1355598
178 close(gcf());
179 //
180 // Use optimplotx plot function
181 //
182 opt = optimset ( "PlotFcns" , optimplotx );
183 opt = optimset ( opt , "MaxIter" , 10 );
184 [x fval] = fminsearch ( rosenbrock , [-1.2 1] , opt );
185 fminsearch: Exiting: Maximum number of iterations has been exceeded
186          - increase MaxIter option.
187          Current function value: 4.1355598
188 close(gcf());
189 //
190 // Use optimplotfunccount plot function
191 //
192 opt = optimset ( "PlotFcns" , optimplotfunccount );
193 opt = optimset ( opt , "MaxIter" , 10 );
194 [x fval] = fminsearch ( rosenbrock , [-1.2 1] , opt );
195 fminsearch: Exiting: Maximum number of iterations has been exceeded
196          - increase MaxIter option.
197          Current function value: 4.1355598
198 close(gcf());
199 //
200 // Use all 3 plot functions
201 //
202 myfunctions = list ( optimplotfval , optimplotx , optimplotfunccount );
203 opt = optimset ( "PlotFcns" , myfunctions );
204 opt = optimset ( opt , "MaxIter" , 10 );
205 [x fval] = fminsearch ( rosenbrock , [-1.2 1] , opt );
206 fminsearch: Exiting: Maximum number of iterations has been exceeded
207          - increase MaxIter option.
208          Current function value: 4.1355598
209 close(gcf());
210 close(gcf());
211 close(gcf());
212 //
213 // Use output function to stop the algorithm.
214 // This sets the exitflag to -1.
215 function stop = outfunStop ( x , optimValues , state )
216     fv = optimValues.fval;
217     stop = ( fv < 1.e-5 )
218 endfunction
219 opt = optimset ( "OutputFcn" , outfunStop);
220 [x , fval , exitflag , output] = fminsearch ( rosenbrock , [-1.2 1] , opt );
221 assert_checkalmostequal ( x , [1.0 1.0], 1.e-2 );
222 assert_checktrue ( fval < 1e-5 );
223 assert_checkequal ( exitflag , -1 );