//////////////////////////////////////////////////////////////////////////// // Model MICEK2.CPP SIMLIB/C++ // // Skákající míček (kombinovaný model, varianta 2) // #include "simlib.h" const unsigned MaxBang = 10; // maximální počet odrazů // popis modelu: //Problem!!! Constant g = 9.81; // gravitační zrychlení Constant g(9.81); // gravitační zrychlení struct Ball { // popis modelu míčku unsigned count; // počet odrazů // detektor stavových událostí: class LimitY : ConditionDown { Ball *b; void Action() { b->Bang(); } // stavová událost: poslání zprávy public: LimitY(Ball *ball) : ConditionDown(ball->y), // podmínka: (y>=0) TRUE --> FALSE b(ball) {} } ylim; Integrator v,y; // stav míčku Ball(double initialposition) : count(0), ylim(this), // podmínka dopadu v(-g - v*0.1), // popis volného pádu: y(v, initialposition) {} void Bang() { // stavová událost - odraz míčku Out(); // tisk stavu při dopadu Print("\n# Odraz %u\n", ++count); v = -0.9 * v.Value(); // ztráta energie y = 0; // toto je nutné z hlediska přesnosti! if(count>=MaxBang) // maximální počet odrazů Stop(); // konec simulace Out(); // tisk nového stavu } void Out() { Print("%g %g %g\n", T.Value(), y.Value(), v.Value()); } }; Ball b1(10); // vytvoření modelu míčku void Sample() { b1.Out(); } // vzorkování stavu míčku Sampler S(Sample, 0.05); int main() { // experiment // DebugON(); SetOutput("micek2.dat"); _Print("# MICEK2 - model skákajícího míčku\n"); Print("# Time y v \n"); Init(0); // od času 0 SetStep(1e-10, 0.5); SetAccuracy(1e-5, 0.001); Run(); // simulace return 0; } // konec