Hinamarth

Elastic constant

Feb 26th, 2012
51
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.77 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <math.h>
  4.  
  5. #define pi 3.141592654
  6.  
  7. void esperimento( double, double, double[]);
  8.  
  9. void generacoppia(double[]);
  10.  
  11. int sommario(double[], double, double, double, double);
  12.  
  13. void esperimento( double mk, double s, double misure[]){
  14.   int i;
  15.   double x, r[2]={0};
  16.   for(i=0; i<1000; i++){
  17.     generacoppia(r);
  18.     x=sin(2*pi*r[0])*sqrt(-2*log(r[1]));
  19.     misure[i]=mk+x*s;
  20.   }
  21. }
  22.  
  23. void generacoppia( double r[] ){
  24.   r[0]=((double)lrand48()+1.)/(RAND_MAX+2.);
  25.   r[1]=((double)lrand48()+1.)/(RAND_MAX+2.);
  26. }
  27.  
  28. int sommario(double misure[], double s, double mk, double s1, double s2){
  29.   int i, cont=0;
  30.   FILE *fp;
  31.   if((fp=fopen("misure.dat", "w"))==NULL){
  32.     printf("Errore nell'apertura del file misure.dat.\n");
  33.     exit(EXIT_FAILURE);
  34.   }
  35.   for(i=0; i<1000; i++){
  36.     fprintf(fp, "%d - %lf\n", i+1, misure[i]);
  37.     if(misure[i]>=(mk+s2*s) && misure[i]<=(mk+s1*s)){
  38.       cont++;
  39.     }
  40.   }
  41.   return cont;
  42. }
  43.  
  44. main(){
  45.   int f;
  46.   double mk, s, s1, s2, misure[1000]={0};
  47.   srand48(time(0));
  48.   printf("Il programma calcola la costante elastica k assumendo che questa vari secondo una distribuzione Gaussiana con media mk e variazione s. Si esamineranno poi i risultati compresi in un intervallo [m1,m2] che dovrai tu immettere.\n");
  49.   printf("Inserisci ora mk appartenente a [800 N/m, 900 N/m] e s compreso tra [20 N/m, 30 N/m].\nmk = ");
  50.   scanf("%lf", &mk);
  51.   while(mk<800. || mk>900.){
  52.     printf("Il valore di mk immesso è errato. Reinseriscilo. \nmk = ");
  53.     scanf("%lf", &mk);
  54.   }
  55.   printf("s = ");
  56.   scanf("%lf", &s);
  57.   while(s<20. || s>30.){
  58.     printf("Il valore di s immesso è errato. Reinseriscilo. \ns = ");
  59.     scanf("%lf", &s);
  60.   }
  61.   esperimento( mk, s, misure );
  62.   printf("Inserisci ora due valori s1 ed s2 entrambi compresi nell'intervallo [-3, 3] e con s1>s2.\ns1 = ");
  63.   scanf("%lf", &s1);
  64.   while( s1<-3. || s1>3. ){
  65.     printf("Il valore di s1 immesso è errato. Reinseriscilo. \ns1 = ");
  66.     scanf("%lf", &s);
  67.     }
  68.   printf("s2 = ");
  69.   scanf("%lf", &s2);
  70.   while(s2<-3. || s2>3.){
  71.       printf("Il valore di s2 immesso è errato. Reinseriscilo. \ns2 = ");
  72.       scanf("%lf", &s2);
  73.   }
  74.   while(s1<=s2){
  75.     s1=-3.;
  76.     s2=-3.;
  77.     printf("s1 deve essere maggiore di s2! Reinseriscili. \ns1 = ");
  78.     scanf("%lf", &s1);
  79.     while( s1<-3. || s1>3. ){
  80.       printf("Il valore di s1 immesso è errato. Reinseriscilo. \ns1 = ");
  81.       scanf("%lf", &s);
  82.     }
  83.     printf("s2 = ");
  84.     scanf("%lf", &s2);
  85.     while(s2<-3. || s2>3.){
  86.       printf("Il valore di s2 immesso è errato. Reinseriscilo. \ns2 = ");
  87.       scanf("%lf", &s2);
  88.     }
  89.   }
  90.   f=sommario(misure, s, mk, s1, s2);
  91.   printf("La frazione delle misure comprese tra [%lf,%lf] è di %d/1000.\n", mk+s1*s, mk+s2*s, f);
  92.   printf("\n");
  93. }
Advertisement
Add Comment
Please, Sign In to add comment