//etude des orbites de deux etoiles binaires //methode de Runge #include #include #include "dislin.h" /* fonction SLEEP(ms) malheureusement la fonction SLEEP est differente sur Windows et Unix :-( pour pouvoir utiliser le meme programme sur Windows et Unix, on utilise le directives de precompilation pour choisir la bonne fonction */ #ifdef __UNIX__ #include #define SLEEP(ms) usleep(ms*1000); #else #include #define SLEEP(ms) Sleep(ms); #endif using namespace std; int main() { const int steps = 30000; const double GN = 1.; //attention aux conditions initiales //etoile A const double MA = 1.; double xposA[steps], yposA[steps], xvelA[steps], yvelA[steps]; xposA[0] = 0.3; yposA[0] = 0.; xvelA[0] = 0.; yvelA[0] = 1.0; //etoile B const double MB = MA; double xposB[steps], yposB[steps], xvelB[steps], yvelB[steps]; xposB[0] = -xposA[0]; yposB[0] = 0.; xvelB[0] = 0.; yvelB[0] = -yvelA[0]; double dT = 0.005; //methode de Runge double dist, xaccA, yaccA, xaccB, yaccB; //variables auxiliares //redefinition des vitesses initiales dist = sqrt(pow((xposA[0]-xposB[0]),2) + pow((yposA[0]-yposB[0]),2)); //etoile A xaccA = -GN*MB / pow(dist,3) * (xposA[0]-xposB[0]); yaccA = -GN*MB / pow(dist,3) * (yposA[0]-yposB[0]); xvelA[0] = xvelA[0] -xaccA*dT/2.; //vitesse yvelA[0] = yvelA[0] -yaccA*dT/2.; //etoile B xaccB = -GN*MA / pow(dist,3) * (xposB[0]-xposA[0]); yaccB = -GN*MA / pow(dist,3) * (yposB[0]-yposA[0]); xvelB[0] = xvelB[0] -xaccB*dT/2.; //vitesse yvelB[0] = yvelB[0] -yaccB*dT/2.; for (int i=1; i