////////////////////////////////////////////////////////////////////////////
// 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
syntax highlighted by Code2HTML, v. 0.9.1