Dopo 3 giorni di prove mi arrendo...
Il programma calcola le posizioni di 4 stelle che sono disposte in modo simmetrico in un immaginario piano cartesiano 2D. Il fatto è che disposte in questo mode le 4 stelle dovrebbero conservare, teoricamente la loro simmetria sia nelle posizioni, sia nelle velocità sia nelle accelerazioni...
Invece che succede? Il programma sbaglia il calcolo, piano piano sclera...![]()
![]()
![]()
E nn è che sbaglia di tanto (come se mi fossi scordato di considerare una stella o di aggiornare una variabile...), sbaglia all'ultima cifra decimale!!![]()
![]()
![]()
![]()
Vi posto il codice... Io mi vado uccidere![]()
![]()
![]()
codice:#include <stdio.h> #include <stdlib.h> #include <math.h> //#include <iostream> #define G 6.6725985E-11 // Costante di gravitazione universale #define TI 20 using namespace std; class Vect { public: double x, y, module; }; class Bodies { public: double mass; Vect acc; Vect pos; Vect vel; }; class Universe { public: int n; Bodies * body; }; Universe * u; void loop ( ) { int i, j; // Calcolo delle accelerazioni Vect dist; if ( u->n != 1 ) { for ( i = 0; i < u->n; i++ ) { u->body[i].acc.x = u->body[i].acc.y = 0; dist.x = dist.y = 0; for ( j = 0; j < u->n; j++ ) { if ( j != i ) { dist.x = u->body[i].pos.x - u->body[j].pos.x; dist.y = u->body[i].pos.y - u->body[j].pos.y; dist.module = sqrt ( dist.x * dist.x + dist.y * dist.y ); if ( dist.module != 0 ) { u->body[i].acc.x -= u->body[j].mass * G * dist.x / ( dist.module * dist.module * dist.module ); u->body[i].acc.y -= u->body[j].mass * G * dist.y / ( dist.module * dist.module * dist.module ); } } } } } // Controlli anti-sclero printf ( "[0].acc.x = %.18lf\n[1].acc.x = %.18lf\n[2].acc.y = %.18lf\n[3].acc.y = %.18lf\n", u->body[0].acc.x, -u->body[1].acc.x, u->body[2].acc.y, -u->body[3].acc.y ); printf ( "[0].acc.y = %.18lf\n[1].acc.y = %.18lf\n[2].acc.x = %.18lf\n[3].acc.x = %.18lf\n", u->body[0].acc.y, -u->body[1].acc.y, -u->body[2].acc.x, u->body[3].acc.x ); system ("Pause"); // Fine Controlli for ( i = 0; i < u->n; i++ ) { u->body[i].pos.x += u->body[i].vel.x * TI + u->body[i].acc.x * TI * TI / 2; u->body[i].pos.y += u->body[i].vel.y * TI + u->body[i].acc.y * TI * TI / 2; u->body[i].vel.x += u->body[i].acc.x * TI; u->body[i].vel.y += u->body[i].acc.y * TI; } } int main ( ) { u = new Universe; u->n = 4; u->body = new Bodies [u->n]; u->body[0].mass = 2E+30; u->body[0].pos.x = - 1E+10; u->body[0].pos.y = 0; u->body[0].vel.x = 0; u->body[0].vel.y = -100000; u->body[1].mass = 2E+30; u->body[1].pos.x = 1E+10; u->body[1].pos.y = 0; u->body[1].vel.x = 0; u->body[1].vel.y = 100000; u->body[2].mass = 2E+30; u->body[2].pos.x = 0; u->body[2].pos.y = - 1E+10; u->body[2].vel.x = 100000; u->body[2].vel.y = 0; u->body[3].mass = 2E+30; u->body[3].pos.x = 0; u->body[3].pos.y = 1E+10; u->body[3].vel.x = -100000; u->body[3].vel.y = 0; for ( int i = 0; i < 1; ) { loop ( ); } system ("Pause"); return 0; }

![Invia un messaggio tramite ICQ a [\_/|\_/]](images/misc/im_icq.gif)
Rispondi quotando
