pietrod21

massima gittata kutta

Nov 16th, 2011
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.93 KB | None | 0 0
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <math.h>
  4. #define g 9.81
  5. #define dth 0.1
  6. #define dt 0.1
  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, temp;       
  17. //////////////////////////////////////////////////////////funzioni
  18. struct vett aa(double vx,double vy,double ventx,double venty, double fA);
  19. struct punto kutta(struct punto fpunt, struct vett fvento, double fA);
  20.  
  21. //---------------------
  22. main(){
  23. int i=0;
  24. double A=0.1, modv=20, theta=0, thetaMAX, grad=(M_PI/2)/dth;
  25.  
  26. punt.p.x=0;
  27. punt.p.y=0;
  28. vento.x=0;
  29. vento.y=0;
  30.  
  31.     do{
  32.     punt.v.x=modv*cos(theta);
  33.     punt.v.y=modv*sin(theta);
  34.         do{  
  35.         temp=kutta(punt, vento, A);
  36.         printf(" %lf %lf \n", theta*180/M_PI,punt.p.x);
  37.         }while(punt.p.y>0);
  38.             if(temp.p.x>punt.p.x){thetaMAX=theta;} 
  39.         punt=temp;
  40.         theta+=dth;
  41.     }while(theta<M_PI/2);
  42. printf("massima gittata raggiunta a %lf gradi \n", thetaMAX*180/M_PI);
  43. }
  44. //---------------------
  45. 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
  46.        
  47.     struct vett acc;
  48.     acc.x=-fA*fabs(vx-ventx)*(vx-ventx);
  49.     acc.y=-fA*fabs(vy-venty)*(vy-venty)-g;
  50.         //printf(" vettore acc %lf %lf \n", acc.x, acc.y);
  51.     return acc;
  52. }
  53.  
  54. struct punto kutta(struct punto fpunt, struct vett fvento, double fA){
  55.  
  56.     double x[5],y[5],vx[5],vy[5],ax[5],ay[5],ventx[5],venty[5];
  57.     struct vett a[5];
  58.  
  59.     x[0]=fpunt.p.x;  //deposito il contenuto della struct fpunt in più array
  60.     y[0]=fpunt.p.y;
  61.     vx[0]=fpunt.v.x;
  62.     vy[0]=fpunt.v.y;
  63.     ventx[0]=fvento.x;
  64.     venty[0]=fvento.y;
  65.    
  66. //inizio algoritmo
  67.  
  68.     a[0]=aa(vx[0],vy[0],ventx[0],venty[0],fA);  //eseguo aa(...) per ottenere l'accelerazione, che verrà scritta nell'array struct a[]
  69.  
  70.     vx[1]=a[0].x*dt;
  71.     x[1]=vx[0]*dt;
  72.     vy[1]=a[0].y*dt;
  73.     y[1]=vy[0]*dt;
  74.  
  75.     a[1]=aa(vx[0]+0.5*vx[1],vy[0]+0.5*vy[1],ventx[0]+0.5*ventx[1],venty[0]+0.5*venty[1],fA);
  76.     vx[2]=a[1].x*dt;
  77.     x[2]=(vx[0]+0.5*vx[1])*dt;
  78.     vy[2]=a[1].y*dt;
  79.     y[2]=(vy[0]+0.5*vy[1])*dt;
  80.  
  81.     a[2]=aa(vx[0]+0.5*vx[2],vy[0]+0.5*vy[2],ventx[0]+0.5*ventx[2],venty[0]+0.5*venty[2],fA);
  82.     vx[3]=a[2].x*dt;
  83.     x[3]=(vx[0]+0.5*vx[2])*dt;
  84.     vy[3]=a[2].y*dt;
  85.     y[3]=(vy[0]+0.5*vy[2])*dt;
  86.  
  87.     a[3]=aa(vx[0]+vx[3],vy[0]+vy[3],ventx[0]+ventx[3],venty[0]+venty[3],fA);
  88.     vx[4]=a[3].x*dt;
  89.     x[4]=(vx[0]+vx[3])*dt;
  90.     vy[4]=a[3].y*dt;
  91.     y[4]=(vy[0]+vy[3])*dt;
  92.  
  93.     fpunt.p.x=x[0]+(x[1]+2*x[2]+2*x[3]+x[4])/6;
  94.     fpunt.p.y=y[0]+(y[1]+2*y[2]+2*y[3]+y[4])/6;
  95.     fpunt.v.x=vx[0]+(vx[1]+2*vx[2]+2*vx[3]+vx[4])/6;
  96.     fpunt.v.y=vy[0]+(vy[1]+2*vy[2]+2*vy[3]+vy[4])/6;
  97.     fpunt.a.x=ax[0]+(ax[1]+2*ax[2]+2*ax[3]+ax[4])/6;
  98.     fpunt.a.y=ay[0]+(ay[1]+2*ay[2]+2*ay[3]+ay[4])/6;
  99.     return fpunt;
  100. }
  101.  
Advertisement
Add Comment
Please, Sign In to add comment