codice:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define g 9.81
#define PI 3.14159
#define THETA_MAX 3.14159/2.
struct variables {
double x,y,v,vx,vy,angle;
};
int choice();
double AccelX(struct variables * p_P,double A);
double AccelY(struct variables * p_P,double A);
void RK2(struct variables * p_P, double dt,double A);
void Start_Condition(int TotalTime,int dt,char *argv[],struct variables * p_P,double Theta);
FILE * open_file ( char * path , const char * mode );
/*******************************************************************************************************************/
int main(int argc, char *argv[]) {
int i=0, option=0;
double TotalTime, dt,Theta=0,dTheta, A,Max_Range=0,Max_Theta;
struct variables P;
FILE *fp,*pf;
system("clear");
if (argc != 6) {
fprintf(stderr,"\n usage: <x0> <y0> <v0> <TotalTime> <dt> \n");
exit(1);
}
TotalTime = atof(argv[4]);
dt = atof(argv[5]);
printf("#Trattiamo il problema del moto bidimensionale di una grave trascurando l'attrito\n\n");
/*--------------------------------------------------------------------------------------------------------*/
/*--------------------------------------------------------------------------------------------------------*/
printf("Scegli il coeffiziente di attrito:");
scanf("%lf",&A);
printf("#[Digita 0] Analisi del moto del proiettile scegliendo l'angolo d'inclinazione\n");
printf("#[Digita 1] Massima gittata\n");
option=choice();
if(A==0) fp=open_file("A=0.dat","w");
if(A==0.1)fp=open_file("A=0,1.dat","w");
if(A==1)fp=open_file("A=1.dat","w");
printf("Inserisci dTheta (deg): ");
scanf("%lf",&dTheta);
Theta=dTheta;
double a ,b;
do{
if(option==0){
printf("scegli l'angolo d'inclinazione (deg)\n");
scanf("%lf",&Theta);
pf=open_file("ValoreOttimale.dat","w");
}
i=0;
Start_Condition(TotalTime,dt,argv,&P,Theta);
while(P.y>=0){
i++;
a=P.y;
RK2(&P,dt,A);
b=P.y;
// printf("%lf\n",b-a);
}
/*Range of motion*/
if(P.x>Max_Range){ /*Find MaxRange*/
Max_Range=P.x;
Max_Theta=P.angle;
}
if(Theta<=THETA_MAX && option==1){ Theta=Theta+dTheta;}
}while(Theta<=THETA_MAX && option==1);
printf("\n\n%lf\t%lf\n",Max_Range,Max_Theta);
fclose(fp);
fclose(pf);
exit(0);
}
/*******************************************************************************************************************/
FILE * open_file ( char * path , const char * mode ){
FILE * fa ;
if ( ( fa = fopen ( path , mode ) ) == NULL ){
fprintf(stderr,"\n Errore in apertura di %s\n" , path ) ;
exit ( EXIT_FAILURE ) ;
}
return fa ;
}
/*******************************************************************************************************************/
int choice(){
int option;
do{
printf("scegli opzione\n");
scanf("%d",&option);
if(option<0 || option>1) printf("Error! Rinserisci il valore\n");
}while(option<0 || option>1) ;
return option;
}
/*******************************************************************************************************************/
double AccelX(struct variables * p_P,double A) {
return -A*p_P->vx*sqrt(p_P->vx*p_P->vx+p_P->vy*p_P->vy);
}
double AccelY(struct variables * p_P,double A) {
return -g-A*p_P->vy*sqrt(p_P->vx*p_P->vx+p_P->vy*p_P->vy);
}
/*******************************************************************************************************************/
void Start_Condition(int TotalTime,int dt,char *argv[],struct variables * p_P,double Theta){
p_P->x = atof(argv[1]);
p_P->y = atof(argv[2]);
p_P->v= atof(argv[3]);
p_P->angle=Theta;
p_P->vx=p_P->v*cos(p_P->angle);
p_P->vy=p_P->v*sin(p_P->angle);
}
void RK2(struct variables * p_P, double dt, double A) {
struct variables tmp;
tmp.x = p_P->x + 0.5 * p_P->vx * dt;
tmp.y = p_P->y + 0.5 * p_P->vy * dt;
tmp.vx = p_P->vx + 0.5 * AccelX(p_P,A) * dt;
tmp.vy = p_P->vy + 0.5 * AccelY(p_P,A) * dt;
p_P->x += tmp.vx * dt;
p_P->y += tmp.vy * dt;
p_P->vx += AccelX(&tmp,A) * dt;
p_P->vy += AccelY(&tmp,A) * dt;
}