Uvažujme systém Země-Měsíc a družici, která má vhodně zvolenou počáteční pozici a rychlost. Takový systém můžeme popsat takto:
// druzice.cc -- model Země--Měsíc--družice #include "simlib.h" #include "simlib3D.h" typedef Value3D Position, Speed, Force; const double gravity_constant = 6.67e-11; // gravitační konstanta const double m0 = 1000; // hmotnost družice const double m1 = 5.983e24; // hmotnost Země const double m2 = 7.374e22; // hmotnost Měsíce const Position p0(36.0e6, 0, 0); // poloha družice const Position p2(384.405e6, 0, 0); // poloha Měsíce const Speed v0(0, 4.5e3, 0); // počáteční rychlost družice const Speed v2(0, 1022.6, 0); // oběžná rychlost Měsíce Constant3D Zero(0,0,0); // pomocný objekt struct MassPoint { double m; // hmotnost Expression3D inforce; // vstupní síla Integrator3D v; // rychlost Integrator3D p; // pozice MassPoint(const double mass, Position p0, Speed v0=Speed(0,0,0)) : m(mass), inforce(Zero), v(inforce/m, v0), p(v,p0) {} void SetInput(Input3D i) { inforce.SetInput(i); } }; struct MyWorld { // digitální svět enum { MAX=10 }; MassPoint *m[MAX]; unsigned n; MyWorld(); }; MyWorld *w; // vznikne až později :-) // gravitační síla pusobící na hmotný bod p class GravityForce : public aContiBlock3D { MassPoint *p; MyWorld *w; public: GravityForce(MassPoint *_p, MyWorld *_w) : p(_p), w(_w) {} Force Value() { Force f(0,0,0); // gravitační síla for(int i=0; i < w->n; i++) { MassPoint *m = w->m[i]; if (m == p) continue; Value3D distance = m->p.Value() - p->p.Value(); double d = abs(distance); // vzdálenost f = f + (distance * gravity_constant * p->m * m->m / (d*d*d)) ; } return f; // součet všech gravitačních sil } }; typedef MassPoint Planet, Satelite; // pohyblivé planety MyWorld::MyWorld() { // --- vytvoříme digitální svět n=0; m[n++] = new Planet(m1,Position(0,0,0),Speed(0,0,0)); m[n++] = new Planet(m2,p2,v2); m[n++] = new Satelite(m0,p0,v0); for(int i=0; i<n; i++) // --- zapneme silové působení m[i]->SetInput(new GravityForce(m[i],this)); }
Třída MassPoint
definuje model hmotného bodu. Vstupem tohoto modelu je
síla, která způsobí jeho pohyb. Protože model vytváříme postupně, je
implicitně tato síla nulová a nastaví se až po vytvoření všech hmotných bodů v
systému (viz konstruktor třídy MyWorld
). Celý model je tvořen třídou
MyWorld
,
která obsahuje seznam všech hmotných bodů.
Třída GravityForce
modeluje gravitační sílu a je pro každý hmotný bod
definována jako součet všech gravitačních sil působících na hmotný bod.
Gravitační síla se počítá se podle gravitačního zákona.
Výsledná dráha družice a Měsíce je uvedena na obrázku 8.
Figure: Družice v gravitačním poli