2024_valutata_1.c (download)
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <math.h>
#define VL 0.0
#define VR 6.0
#define NMC 100000
#define NPTS 1000
#define SQR(X) ((X) * (X))
double func(double V, double KF) {
  double sigma_1 = 0.15;
  double sigma_2 = 0.45;
  double K1 = 1.0 / sqrt(2.0 * M_PI * SQR(sigma_1));
  double K2 = 1.0 / sqrt(2.0 * M_PI * SQR(sigma_2));
  double sig21 = 2.0 * SQR(sigma_1);
  double sig22 = 2.0 * SQR(sigma_2);
  double f = K1*exp(-pow(V - 2.0, 2.0) / sig21) + K2 * exp(-pow(V - 4.0, 2.0) / sig22);
  
  return f * pow(KF, V);
}
double calcarea(double vmin, double vmax, double kf) {
  int i;
  double v, sumf = 0.0;
  for (i = 0; i < NMC; i++) {
      v = drand48() * (vmax - vmin) + vmin;
      sumf += func(v, kf);
  }
  return (vmax - vmin) * sumf / NMC;
}
void salva_func(char *txt, double kf, double A) {
  int i;
  double v, dv;
  FILE *output = fopen(txt, "w");
  if(output == NULL) {
    printf("ERRORE APERTURA FILE\n");
    exit(0);
  }
  
  dv = (VR - VL) / NPTS;
  for(i = 0; i < NPTS; i++) {
    v = VL + i * dv;
    fprintf(output, "%.6f %.6f\n", v, func(v, kf) / A);
  }
  fclose(output);
  
}
int main() {
  srand48(time(NULL));
  double vmin = 2.577;
  double A1, A2, kf;
  
  A1 = calcarea(VL, VR, 0.6);
  salva_func("kf3.dat", 0.6, A1);
  
  for (kf = 0.6; kf < 2.0; kf += 0.05) {
      A1 = calcarea(VL, vmin, kf);
      A2 = calcarea(vmin, VR, kf);
      if(fabs(A1 - A2) < 0.03) {
        printf("A1 = %.5f, A2 = %.5f\n", A1, A2);
        printf("Il valore di k per cui le due aree sono uguali è %.5f\n", kf);
        salva_func("kfopt.dat", kf, A1 + A2);
      }
  }
  
  return 0;
}