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

# model.h

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