590420ad29c4a8d5c096f9d0cdd15693e674dc54
[scilab.git] / scilab / modules / optimization / demos / icse / icsuq.sci
1 //
2 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3 // Copyright (C) ????-2008 - INRIA
4 // Copyright (C) 2010 - DIGITEO - Yann COLLETTE
5 //
6 // This file is distributed under the same license as the Scilab package.
7 //
8
9 function [co,u,g,itv,dtv,cof]=icsuq(u,simu,nap,imp,obs,ytob)
10     // Computation of the optimal control with weighting of the initial control
11     // and geometric weighting of the observation weights.
12     // A scaling bring all the componant of the control to 1.
13     // The componant initially null will stay null.
14     // Only works if the lower bound is positive.
15     // Weighting formula :
16     // cof(i,j) = 1/2*[(ytob(i,j)-ob(1,j,i))**2+..+(ytob(i,j)-ob(nex,j,i)**2]
17     //
18     // Syntax
19     // [co,u,g,itv,dtv,cof]=icsuq(u,nap,imp,obs,ytob)
20     // input variables :
21     // u(nu)         : initial parameters
22     // simu          : string which contains the name of the sub program
23     //                 which describes the problem (second member,
24     //                 criterion and initial state)
25     // nap           : maximum number of call to the simulator
26     // imp           : debug value during optimization
27     // obs(nob,ny)   : observation matrix
28     // ytob(ny,ntob) : initial value of the state at measure time instants
29     //                 obtained by icob after using icse,icsu,icsua or icsuq
30     // output variables :
31     // co            : final cost
32     // u(nu)         : final parameters
33     // g(nu)         : final gradient
34     // itv(nitv)     : work area (fortran integers)
35     // dtv(ndtv)     : work area (fortran double precision)
36     // cof(nob,ntob) : weighting coefficients of the cost
37     // Use the macros icot and icob to extract the state
38
39     df0 = 1;
40     if min(binf) <=0 then
41         error("call to icsuq with binf not strictly positive");
42     end
43     for i=1:nu
44         u(1,i)=max([ binf(1,i),min([u(1,i),bsup(1,i)])] );
45     end
46     ech  = u;
47     binf = binf./u;
48     bsup = bsup./u;
49     u    = ones(1,nu);
50     ico  = 2;
51     yob  = obs*ytob;
52     ob   = don;
53
54     [cof] = fort("icscof",ico,1,"i",ntob,2,"i",nex,3,"i",...
55     nob,4,"i",yob,5,"d",ob,6,"d","sort",[1,nob*ntob],7,"d");
56
57     [co,u,g,itv,dtv] = icsegen(u,simu,nap,imp);
58
59     u = ech.*u;
60 endfunction