pietrod21

pianeti1

Dec 29th, 2011
95
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.14 KB | None | 0 0
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <math.h>
  4.  
  5. #define dt 0.1
  6. #define M 1989000
  7. #define teu 39,4784176
  8. ///////////////////////////////////////////////////////////struct
  9. struct vett{
  10.     double x,y;
  11.     };    
  12.  
  13. struct punto{
  14.     struct vett p,v;
  15.     double m;  
  16. };
  17.  
  18. struct posizioni{
  19.     struct punto A,B;
  20. }pos;
  21. //////////////////////////////////////////////////////////funzioni
  22. double a(double vx,double vy,double ventx,double venty, double fA);
  23. struct posizioni verlet(struct posizioni pos);
  24. //////////////////////////////////////////////////////////main
  25. main(){
  26. int i;
  27. FILE *fp, *fd;
  28. fd=fopen("dati_png.gnu","w");
  29. fp=fopen("pianeti.dat","w+");
  30. fprintf(fd, "plot 'pianeti.dat' u 2:3 \n set term png \n set output 'eull.png' \n replot \n  \n ");
  31. fprintf(fd, "plot 'pianeti.dat' u 4:5 \n set term png \n set output 'eull.png' \n replot \n  \n ");
  32. fclose(fd);
  33. pos.A.m=5; //terra
  34. pos.B.m=0.6; //marte
  35. pos.A.p.x=1.4;
  36. pos.A.p.y=0.2;
  37. pos.B.p.x=1.9;
  38. pos.B.p.y=1.8;
  39. pos.A.v.x=0;//143040
  40. pos.A.v.y=0;
  41. pos.B.v.x=0;//-100000
  42. pos.B.v.y=0;
  43.  
  44.  
  45. for(i=0;i<1000;i++){
  46.     fprintf(fp,"%lf %lf %lf %lf %lf\n",i*dt,pos.A.p.x,pos.A.p.y,pos.B.p.x,pos.B.p.y);
  47.     pos=verlet(pos);
  48. }
  49. fclose(fp);
  50. }
  51. //////////////////////////////////////////////////////////funzioni
  52. double a(double xa,double ya,double xb,double yb, double m){
  53.     double acc;
  54.     acc=-(-teu*xa/pow((sqrt(xa*xa+ya*ya)),3)+teu*(-m/M)*(xa-xb)/pow(sqrt((xa-xb)*(xa-xb)+(ya-yb)*(ya-yb)),3));  return acc;
  55. }
  56.  
  57. struct posizioni verlet(struct posizioni pos){
  58.     //ottengo x(n+1) per ottenere l'accelerazione di v(n+1): per farlo creo una nuova struct "temporanee" pos1
  59.     struct posizioni pos1;
  60.     pos1.A.p.x=pos.A.p.x+pos.A.v.x*dt+0.5*a(pos.A.p.x,pos.A.p.y,pos.B.p.x,pos.B.p.y,pos.B.m)*dt*dt;
  61.     pos1.A.p.y=pos.A.p.y+pos.A.v.y*dt+0.5*a(pos.A.p.y,pos.A.p.x,pos.B.p.y,pos.B.p.x,pos.B.m)*dt*dt;
  62.     pos1.B.p.x=pos.B.p.x+pos.B.v.x*dt+0.5*a(pos.B.p.x,pos.B.p.y,pos.A.p.x,pos.A.p.y,pos.A.m)*dt*dt;
  63.     pos1.B.p.y=pos.B.p.y+pos.B.v.y*dt+0.5*a(pos.B.p.y,pos.B.p.x,pos.A.p.y,pos.A.p.x,pos.A.m)*dt*dt;
  64.     //ottengo le nuove velocita'-  sfruttando le A1 e B1 precedentemente ricavate - sovrascrivendole direttamente alle vecchie
  65.     pos.A.v.x=pos.A.v.x+0.5*(a(pos.A.p.x,pos.A.p.y,pos.B.p.x,pos.B.p.y,pos.B.m)+a(pos1.A.p.x,pos1.A.p.y,pos1.B.p.x,pos1.B.p.y,pos.B.m))*dt;
  66.     pos.A.v.y=pos.A.v.y+0.5*(a(pos.A.p.y,pos.A.p.x,pos.B.p.y,pos.B.p.x,pos.B.m)+a(pos1.A.p.y,pos1.A.p.x,pos1.B.p.y,pos1.B.p.x,pos.B.m))*dt;
  67.     pos.B.v.x=pos.B.v.x+0.5*(a(pos.B.p.x,pos.B.p.y,pos.A.p.x,pos.A.p.y,pos.A.m)+a(pos1.B.p.x,pos1.B.p.y,pos1.A.p.x,pos1.A.p.y,pos.A.m))*dt;
  68.     pos.B.v.y=pos.B.v.y+0.5*(a(pos.B.p.y,pos.B.p.x,pos.A.p.y,pos.A.p.x,pos.A.m)+a(pos1.B.p.y,pos1.B.p.x,pos1.A.p.y,pos1.A.p.x,pos.A.m))*dt;
  69.     //ottengo le nuove posizioni sovrascrivendole direttamente alle vecchie
  70.     pos.A.p.x=pos.A.p.x+pos.A.v.x*dt+0.5*a(pos.A.p.x,pos.A.p.y,pos.B.p.x,pos.B.p.y,pos.B.m)*dt*dt;
  71.     pos.A.p.y=pos.A.p.y+pos.A.v.y*dt+0.5*a(pos.A.p.y,pos.A.p.x,pos.B.p.y,pos.B.p.x,pos.B.m)*dt*dt;
  72.     pos.B.p.x=pos.B.p.x+pos.B.v.x*dt+0.5*a(pos.B.p.x,pos.B.p.y,pos.A.p.x,pos.A.p.y,pos.A.m)*dt*dt;
  73.     pos.B.p.y=pos.B.p.y+pos.B.v.y*dt+0.5*a(pos.B.p.y,pos.B.p.x,pos.A.p.y,pos.A.p.x,pos.A.m)*dt*dt;
  74.     return pos;
  75. }
Advertisement
Add Comment
Please, Sign In to add comment