////////////////////////////////////////////////////////////////////////////
// Model CTEST2.CPP               SIMLIB/C++
//
// filtr s přenosovou funkcí:
//
//      F(p) = 1 / (p^3 + 3.25p^2 + 16.5p + 17.5)
//
// model odezvy na jednotkový skok
//

#include "simlib.h"

#define OUTPUT_FILE "ctest.dat"

const double a1 = 1.0,          // koeficienty přenosu filtru
             a2 = 3.25,
             a3 = 16.5,
             a4 = 17.5;

const double InpValue = 1.0;    // vstup filtru -- jednotkový skok
const double StepPrn  = 0.05;   // krok tisku výsledků

class Filter : aContiBlock {
  Integrator y2, y1, y;         // použité integrátory
 public:
  Filter(Input inp, double a1, double a2, double a3, double a4) :
    // popis propojení bloků:
    y2((inp-a2*y2-a3*y1-a4*y)/a1),   // y''= int(y''')
    y1(y2),                          // y'= int(y'')
    y(y1) {}                         // y= int(y')
  double Value() { return y.Value(); }  // výstup bloku
};

Filter F(InpValue, a1, a2, a3, a4);

void Sample() {
  Print("%6.2f  %.4g \n", T.Value(), F.Value());
}
Sampler S(Sample, StepPrn);

int main() {                    // popis experimentu
  SetOutput(OUTPUT_FILE);
  _Print("# CTEST -- model odezvy přenosového filtru na jednotkový skok \n");
  Print("# Time  y\n");
  Init(0,7);                    // inicializace experimentu
  SetAccuracy(1e-3);            // požadovaná přesnost
  Run();                        // simulace
  Print("# konec \n");
  return 0;
}

// konec


syntax highlighted by Code2HTML, v. 0.9.1