/* Soluzione numerica del problema del punto materiale lanciato con un certo angolo Variante di lancio_2D_file.c per scrivere csv */ #include #include #include #define HEADER "t, x, y, vx, vy" // mette i nomi all'inizio delle variabili int main(int argc, char *argv[]) { int step=0; float v0, theta, vx, vy, vxm, vym, ax, ay, dt; float t=0, x = 0., y = 0.; const float grad2rad = acos(-1) / 180.; const float g = 9.8; // m/s^2 FILE * fp; // puntatore al file char nomeFile[50]; // vettore di caratteri per il nome del file /* legge i parametri del lancio (v0 e theta e dt) da riga di comando ./lancio_2D 10 45 0.01 */ if (argc < 4) { puts("Devi dare anche velocità iniziale (m/s), angolo (gradi) e dt (s)"); return 0; } v0 = atof(argv[1]); theta = atof(argv[2]); dt = atof(argv[3]); printf("Parametri del lancio: v0 = %.2f m/s, theta = %.0f gradi\n", v0, theta); printf("Discretizzazione: dt = %f s\n", dt); vx = v0 * cos(theta * grad2rad); vy = v0 * sin(theta * grad2rad); printf("\nVelocità iniziale: (%.2f, %.2f) m/s\n", vx, vy); ax = 0.; // anche se è nulla (può servire per altri casi) ay = -g; // apertura file sprintf(nomeFile, "lancio_%s_%s_%s.csv", argv[1], argv[2], argv[3]); printf("I dati andranno sul file %s\n", nomeFile); fp = fopen(nomeFile, "w"); #ifdef HEADER printf("Header definito: %s\n", HEADER); fprintf(fp, "%s\n", HEADER); #endif fprintf(fp, "%.5f, %.5f, %.5f, %.5f, %.5f\n", t, x, y, vx, vy); while (y >= 0) { vxm = vx + ax * dt/2; // velocita' media: (v + (v+a*dt))/2 vym = vy + ay * dt/2; vx += ax * dt; // velocita' dopo intervallo dt vy += ay * dt; x += vxm * dt; /* posizione dopo intervallo dt in cui il corpo si e' mosso con v media vm */ y += vym * dt; t += dt; // tempo dopo intervallo dt fprintf(fp, "%.5f, %.5f, %.5f, %.5f, %.5f\n", t, x, y, vx, vy); } fclose(fp); return 0; }