pietrod21

Untitled

Nov 18th, 2011
97
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.32 KB | None | 0 0
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <math.h>
  4. #define g 9.81
  5. #define epsilon 0.1
  6. #define dt 0.01
  7.  
  8. ///////////////////////////////////////////////////////////struct
  9. struct vett{
  10.     double x,y;
  11.     }vento;    //creo la struttura vettore e contestualmente creo un vettore vento (si può fare aggiungendo typedef)
  12.  
  13.  
  14. struct punto{
  15.     struct vett p,v,a;  //creo struttura che segue il punto in tutti i suoi valori (//)
  16. }punt;
  17.            
  18. //////////////////////////////////////////////////////////funzioni
  19. struct vett aa(double vx,double vy,double ventx,double venty, double fA);
  20. struct punto kutta(struct punto fpunt, struct vett fvento, double fA);
  21.  
  22. //---------------------
  23. main(){
  24. int i=0;
  25. double A=0.1, modv, theta=M_PI/5, flag=0;
  26. vento.x=-8;
  27. vento.y=0;
  28. modv=0;
  29. flag=0;
  30.         do{
  31.             punt.v.x=modv*cos(theta);
  32.             punt.v.y=modv*sin(theta);
  33.             punt.p.x=0;
  34.             punt.p.y=0;
  35.                 do{  
  36.                     punt=kutta(punt, vento, A);
  37. if((fabs(punt.p.y-20)<epsilon)&&(fabs(punt.p.x-100)<epsilon)){flag=1;}
  38.                 }while(punt.p.y>0);
  39.             modv+=epsilon;
  40.         }while(flag=0);
  41.  
  42. printf("la velocità con cui a 45 gradi raggiunge il bersaglio in (100,20) con approssimazione di %lf equivale a %lf \n", epsilon, (modv-epsilon));
  43.  
  44.  
  45.  
  46.  
  47.  
  48.  
  49.  
  50. //-----------------------------test-----------------------
  51.  
  52.             punt.p.x=0;
  53.             punt.p.y=0;
  54.             punt.v.x=modv*cos(theta);
  55.             punt.v.y=modv*sin(theta*M_PI/180);
  56.     FILE* fp=fopen("bers.dat","w");
  57.                     punt=kutta(punt, vento, A);
  58.         fprintf(fp, " %lf %lf %lf %lf %lf %lf \n", punt.p.x,punt.p.y,punt.v.x,punt.v.y,punt.a.x,punt.a.y);
  59. }
  60. //---------------------
  61.  
  62.  
  63. struct vett aa(double vx,double vy,double ventx,double venty, double fA){ //prende le velocità del proiettile e del vento e scrive - tramite puntatore - l'accelerazione risultante nella struct punt.a
  64.  
  65.     struct vett acc;
  66.     acc.x=-fA*fabs(vx-ventx)*(vx-ventx);
  67.     acc.y=-fA*fabs(vy-venty)*(vy-venty)-g;
  68.         //printf(" vettore acc %lf %lf \n", acc.x, acc.y);
  69.     return acc;
  70. }
  71.  
  72. struct punto kutta(struct punto fpunt, struct vett fvento, double fA){
  73.  
  74.     double x[5],y[5],vx[5],vy[5],ax[5],ay[5],ventx,venty;
  75.     struct vett a[5];
  76.  
  77.     x[0]=fpunt.p.x;  //deposito il contenuto della struct fpunt in più array
  78.     y[0]=fpunt.p.y;
  79.     vx[0]=fpunt.v.x;
  80.     vy[0]=fpunt.v.y;
  81.     ventx=fvento.x;
  82.     venty=fvento.y;
  83.    
  84. //inizio algoritmo
  85.  
  86.     a[0]=aa(vx[0],vy[0],ventx,venty,fA);  //eseguo aa(...) per ottenere l'accelerazione, che verrà scritta nell'array struct a[]
  87.             //printf("A0=%lf %lf \n", a[0].x,a[0].y);
  88.     vx[1]=a[0].x*dt;
  89.     x[1]=vx[0]*dt;
  90.     vy[1]=a[0].y*dt;
  91.     y[1]=vy[0]*dt;
  92.  
  93.     a[1]=aa(vx[0]+0.5*vx[1],vy[0]+0.5*vy[1],ventx,venty,fA);
  94.     vx[2]=a[1].x*dt;
  95.     x[2]=(vx[0]+0.5*vx[1])*dt;
  96.     vy[2]=a[1].y*dt;
  97.     y[2]=(vy[0]+0.5*vy[1])*dt;
  98.  
  99.     a[2]=aa(vx[0]+0.5*vx[2],vy[0]+0.5*vy[2],ventx,venty,fA);
  100.     vx[3]=a[2].x*dt;
  101.     x[3]=(vx[0]+0.5*vx[2])*dt;
  102.     vy[3]=a[2].y*dt;
  103.     y[3]=(vy[0]+0.5*vy[2])*dt;
  104.  
  105.     a[3]=aa(vx[0]+vx[3],vy[0]+vy[3],ventx,venty,fA);
  106.     vx[4]=a[3].x*dt;
  107.     x[4]=(vx[0]+vx[3])*dt;
  108.     vy[4]=a[3].y*dt;
  109.     y[4]=(vy[0]+vy[3])*dt;
  110.  
  111.     fpunt.p.x=x[0]+(x[1]+2*x[2]+2*x[3]+x[4])/6;
  112.     fpunt.p.y=y[0]+(y[1]+2*y[2]+2*y[3]+y[4])/6;
  113.     fpunt.v.x=vx[0]+(vx[1]+2*vx[2]+2*vx[3]+vx[4])/6;
  114.     fpunt.v.y=vy[0]+(vy[1]+2*vy[2]+2*vy[3]+vy[4])/6;
  115.     fpunt.a.x=ax[0];
  116.     fpunt.a.y=ay[0];
  117. //printf("px=%lf,py=%lf,vx=%lf,vy=%lf,ax=%lf,ay=%lf \n", punt.p.x,punt.p.y,punt.v.x,punt.v.y,punt.a.x,punt.a.y);
  118.     return fpunt;
  119.  
  120. }
Advertisement
Add Comment
Please, Sign In to add comment