////////////////////////////////////////////////////////////////////////////
// Model MICEK.CPP                SIMLIB/C++
//
// Skákající míček (kombinovaný model, varianta 1)
//

#include "simlib.h"

const double g = 9.81;          // gravitační zrychlení

class Micek : ConditionDown {   // popis modelu míčku
  Integrator v,y;               // stav
  unsigned count;               // čítač dopadů
  void Action()  {              // je dopad
      Print("# Odraz %u:\n", ++count);
      Out();                    // tiskneme stav při dopadu
      v = -0.8 * v.Value();     // ztráta energie...
      y = 0;            // je nutné pro detekci dalšího dopadu !!!
      if(count>=20)             // povolíme max. 20 odrazů
        Stop();                 // konec simulace
  }
public:
  Micek(double initialposition) :
    ConditionDown(y),           // podmínka dopadu: (y>=0) z TRUE na FALSE
    v(-g),                      // y' = INTG( - m * g )
    y(v, initialposition),      // y  = INTG( y' )
    count(0) {}                 // počet dopadů
  void Out() {
    Print("%-9.3f  % -9.3g  % -9.3g\n",
          T.Value(), y.Value(), v.Value());
  }
};

Micek m1(1.0);                  // model systému

void Sample() { m1.Out(); }     // výstup stavu míčku
Sampler S(Sample,0.01);

int main() {                    // popis experimentu
  SetOutput("micek.dat");
  _Print("# MICEK - model skákajícího míčku\n");
  Print("# Time y v \n");
  Init(0);                      // inicializace parametrů experimentu
  SetStep(1e-10,0.5);           // rozsah kroku integrace
  SetAccuracy(1e-5,0.001);      // max. povolená chyba integrace
  Run();                        // simulace
  return 0;
}

// konec


syntax highlighted by Code2HTML, v. 0.9.1