////////////////////////////////////////////////////////////////////////////
// Model KOLO2.CPP SIMLIB/C++
//
// kmitání kola (verze 2 - několik experimentů)
// popis systému kola:
// y'' = ( F - D * y' - k * y ) / M
//
#include "simlib.h"
#include <stdlib.h>
struct Kolo { // popis systému
Parameter M, D, k;
Integrator v, y;
Kolo(Input F, double _M, double _D, double _k):
M(_M), D(_D), k(_k), // parametry systému
v( (F - D*v - k*y) / M ),
y( v ) { }
void SetM(double _M) { M=_M; }
void SetD(double _D) { D=_D; }
void Setk(double _k) { k=_k; }
void PrintParameters() {
Print("# hmotnost = %g kg ", M.Value());
Print(" tlumeni = %g ", D.Value());
Print(" tuhost = %g \n", k.Value());
}
};
// objekty modelu ...
double _m=5, _d=500, _k=5e4; // implicitní hodnoty parametrů
//Problem!!! Constant F = 100; // síla působící na kolo k
Constant F(100); // síla působící na kolo k
Kolo k(F, _m, _d, _k);
// sledování stavu modelu ...
void Sample() {
Print("%6.3f %.4g %.4g\n", T.Value(), k.y.Value(), k.v.Value());
}
Sampler S(Sample, 0.001);
// popis experimentu ...
int main(int argc, char *argv[]) {
SetOutput("kolo2.dat");
_Print("# KOLO2 - model tlumení kola (více experimentů)\n");
if(argc==4) {
_m = atof(argv[1]);
_d = atof(argv[2]);
_k = atof(argv[3]);
}
for(double m=_m/2; m<=_m*5; m*=1.2) {
Print("\n"); // oddělí výstupy
k.SetM(m); // nastaví parametr M
k.SetD(_d); // nastaví parametr D
k.Setk(_k); // nastaví parametr k
k.PrintParameters();
Print("# Time y v \n");
Init(0,0.3); // inicializace parametrů experimentu
SetAccuracy(1e-6,0.001); // max. povolená chyba integrace
Run(); // simulace
}
Print("# konec \n");
return 0;
}
// konec
syntax highlighted by Code2HTML, v. 0.9.1