* Bug #9789 fixed - Optimization: optim printing its termination status
[scilab.git] / scilab / modules / optimization / tests / unit_tests / optim_costflist.dia.ref
1 // =============================================================================
2 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3 // Copyright (C) 2008 - INRIA - Michael Baudin
4 //
5 //  This file is distributed under the same license as the Scilab package.
6 // =============================================================================
7 // <-- CLI SHELL MODE -->
8 // optim_costflist.tst --
9 //   Test the optim command in the case where the cost function is a list.
10 //
11 //
12 // In the following case, costf is equal to list(sipn,sip2,ne,nc,cpen)
13 // where sipn is a function.
14 // The case is even more complex, since the 3d argument
15 // of sipn is the dummy argument sip1, which is, in turn, 
16 // a function which real value is sip2.
17 // penalization (see doc)
18 //
19 // min (x1^2 +x2^2)/2 ; x1>=0, x1 + x2 =1 (solution [0.5 0.5] )
20 function [f,g,ind]=sip2(x,ind)
21   f= [ x(1)+x(2)-1, -x(1), (x(1)^2+x(2)^2)/2]
22   g= [ 1, -1, x(1); 1,  0, x(2)]
23 endfunction
24 cpen=50; 
25 ne=1; 
26 nc=2;
27 bi=[0 0]; 
28 bs=[2 2];
29 function [fpen,gpen,ind]=sipn(x,ind,sip1,ne,nc,cpen)
30   [f,g,indic]=sip1(x,ind)
31   if indic < 0 then 
32     ind=indic
33     return
34   end
35   if nc >ne then 
36     for i=ne+1:nc
37       f(i)=max([0 f(i)])
38     end
39   end
40   fpen=f(nc+1) + cpen*norm(f(1:nc))^2/2';
41   if ind==2 then 
42     return
43   end
44   gpen=g(:,nc+1)
45   if ne > 0 then
46     for i=1:ne
47       gpen=gpen + cpen*f(i)*g(:,i)
48     end
49   end
50   if nc > ne then
51     for i=ne+1:nc
52       if f(i) > 0 then 
53          gpen=gpen + cpen*f(i)*g(:,i)
54       end
55     end
56   end;
57 endfunction
58 [f,x,g]=optim(list(sipn,sip2,ne,nc,cpen),...
59               'b',bi,bs,[1 1],'ar',20,20,1.e-15);
60 Norm of projected gradient lower than   0.1000000D-14.
61
62 if norm(x-[0.5 0.5]) + norm(g) > 0.1 then bugmes();quit;end