- Main Page
- Related Pages
- Modules
- Classes
- Files

# work/git/mixpp/doprava/model.h

    00001 #ifndef MODEL_H
    00002 #define MODEL_H
    00003
    00004 #include <stat/libFN.h>
    00005
    00006 //Tady se naplni "popis" jednotlivych nahodnych velicin na kterych se pracuje
    00007 // Moznosti je velmi mnoho (viz doc/html/index.html): napriklad
    00008 RV RVstav ( "{stav }", "4");  // Vyrabim stav velikosti 4
    00009 RV RVut ( "{ut }", "2");     // Vstup velikosti 2
    00010 RV RVpozor ( "{I1 O1 }");     //Vystup je intenzita a obsazenost
    00011
    00013 class IMk1 : public diffbifn {
    00014 protected:
    00015         double alp1, alp2; // pomery odboceni...
    00016
    00017 public:
    00019         IMk1() :diffbifn (RVstav.count(), RVstav, RVut ) {};
    00021         void set_parameters ( double alp10,  double alp20) {alp1=alp10; alp2=alp20;}
    00022
    00023         vec eval ( const vec &x0, const vec &u0 ) {
    00024                 // napln stav nulami
    00025                 vec xk=zeros ( RVstav.count() );
    00026
    00027                 xk ( 0 ) = 0.2* x0(1) - 0.1* x0(2)+ u0(0);  // vycucane z prstu
    00028                 xk ( 1 ) = x0(0);
    00029                 xk ( 2 ) = x0(1);
    00030                 xk ( 3 ) = x0(2);
    00031
    00032                 return xk;
    00033         }
    00034
    00035         void dfdx_cond ( const vec &x0, const vec &u0, mat &A, bool full=true ) {
    00036                 // Vysledek se uklada do matice A
    00037
    00038                 if (full) { // priznak full se nastavi na zacatku => je treba naplnit celou matici
    00039                         A = eye(RVstav.count());
    00040                         A(0,1) = 0.2;
    00041                         A(0,2) = -0.1;
    00042                 } else {
    00043                 }; // pokud neni priznak full, staci naplnit jen to co se zmenilo. V tomhle pripade se nemeni nic
    00044         }
    00045
    00046         void dfdu_cond ( const vec &x0, const vec &u0, mat &A, bool full=true ) {it_error ( "not needed" );};
    00047
    00048 };
    00049
    00051 class OMk1 : public diffbifn {
    00052 public:
    00054         OMk1() :diffbifn (RVpozor.count(), RVstav, RVut ) {};
    00055         // Model pozorovani  je trivialni jen se zkopiruji stavy
    00056         vec eval(const vec &x0, const vec &u0 ){
    00057                 vec dt(RVpozor.count());
    00058                 // Pozoruji pouze prvni dva stavy
    00059                 dt(0) = x0(0);
    00060                 dt(1) = x0(1);
    00061                 return dt;
    00062         }
    00063         //
    00064         void dfdx_cond ( const vec &x0, const vec &u0, mat &A, bool full=true ) {
    00065                 // Vysledek se uklada do matice A
    00066
    00067                 if (full) { // priznak full se nastavi na zacatku => je treba naplnit celou matici
    00068                         A = zeros(RVpozor.count(),RVstav.count());
    00069                         A(0,0)=1.0;
    00070                         A(1,1)=1.0;
    00071                 } else {}; // pokud neni priznak full, staci naplnit jen to co se zmenilo. V tomhle pripade se nemeni nic
    00072         }
    00073 };
    00074
    00075 #endif //MODEL_H