# include # include # include # include # include using namespace std; const int P = 110000; double G, M, m; // Anche se introdotti da file, vanno dichiararli prima, o nella funzione accelerazione! double T[P], X[P], Y[P], Z[P], Vx[P], Vy[P], Vz[P], Ep[P], Ec[P], Et[P], Lx[P], Ly[P], Lz[P], Lt[P]; // vettori tempo, posizioni, velocita', energie, momento double ax, ay, az, Epot, Ecin, Lax, Lay, Laz; // accelerazioni, energie, momento angolare // procedure di integrazione: tutte sono funzione della stessa "parentesi" di variabili/parametri void euler(const double& Ti, const double& Tf, const double& X0, const double& Vx0, const double& Y0, const double& Vy0, const double& Z0, const double& Vz0, const int& Nt); void euler_cromer(const double& Ti, const double& Tf, const double& X0, const double& Vx0, const double& Y0, const double& Vy0, const double& Z0, const double& Vz0, const int& Nt); void velocity_verlet(const double& Ti, const double& Tf, const double& X0, const double& Vx0, const double& Y0, const double& Vy0, const double& Z0, const double& Vz0, const int& Nt); void RK(const double& Ti, const double& Tf, const double& X0, const double& Vx0, const double& Y0, const double& Vy0, const double& Z0, const double& Vz0, const int& Nt); void RKSTEP(double& t, double& x, double& vx, double& y, double& vy, double& z, double& vz, const double& dt); // funzioni accelerazione, velocita', energia potenziale e cinetica, momento angolare double acc(double& x, double& y, double& z, double& vx, double& vy, double& vz, double& ax, double& ay, double& az, double& t); double vel(double& x, double& y, double& z, double& vx, double& vy, double& vz, double& t); double En(double& x, double& y, double& z, double& vx, double& vy, double& vz, double& Ecin, double& Epot); double La(double& x, double& y, double& z , double& vx, double& vy, double& vz, double& Lax, double& Lay, double& Laz); // PROGRAMMA PRINCIPALE int main() { double Ti, Tf, X0, Y0, Z0, Vx0, Vy0, Vz0; // parametri di integrazione: tempo, posizioni e velocita' iniziali, passi int Nt, i; ifstream ifile("input.txt"); while (!ifile.eof()) { ifile >> G >> M >> m >> Ti >> Tf >> Nt >> X0 >> Y0 >> Z0 >> Vx0 >> Vy0 >> Vz0;} ifile.close(); if(Nt>=P) {cerr << "Error : Nt>=P\n"; exit(1);} // Nt deve essere minore della dimensione P // output delle caratteristiche del sistema cout << "Massa Sole del sistema: M=" << M << "\n"; cout << "Massa Terra del sistema m=" << m << "\n"; cout << "Posizione Sole (fissa): x=" << 0 << " y=" << 0 << "\n"; cout << "Posizione iniziale Terra: x=" << X0 << " y=" << Y0 << " z=" << Z0 << "\n"; cout << "Velocita' iniziale Terra: vx=" << Vx0 << " vy=" << Vy0 << " vz=" << Vz0 << "\n"; cout << "Tempo di simulazione: " << Ti << "-" << Tf << " e numero passi: " << Nt << "\n"; // INTEGRAZIONI CON FUNZIONI DIVERSE, con output in estensione .xls, o .txt per il RK4 RK(Ti, Tf, X0, Vx0, Y0, Vy0, Z0, Vz0, Nt); // Runge-Kutta 4 ofstream myfile4 ("rk4.xls"); myfile4.precision(17); for(i=0; i