L3

Solution avec la méthode du rejet

#include <stdio.h>
#include <stdlib.h>

/**
 * La fonction utilisée dans la formule de l'intégrale.
 */
double g(double x) {
  return x * x * x;
}

int main() {
  int z;
  int S = 0;
  int k = 0;
  int n = 25555555;
  double M = 1.01;
  double x, y;

  srand(42);

  while (k < n) {
    k++;

    x = rand() / (double)RAND_MAX;
    y = rand() / (double)RAND_MAX;

    if (y <= g(x))
      z = 1;
    else
      z = 0;

    S = S + z;
  }

  // Toutes les multiplications par v(G) ne sont pas faîtes car ici
  // G représente l'intervalle [0, 1] et v, son volume, serait donc
  // de 1 - 0 = 1.
  double est_p   = S/(double)n;
  double est_J   = est_p * M;
  double est_var = (1 / (double)n) * M * est_J *  (1 - est_p);

  printf("est_p : %lf\n", est_p);
  printf("est_J : %lf\n", est_J);
  printf("est_var : %lf\n", est_var);
}

Solution par échantillonage

#include <stdio.h>
#include <stdlib.h>

/**
 * La fonction utilisée dans la formule de l'intégrale.
 */
double g(double x) {
  return x * x * x;
}

int main() {
  int z;
  int k = 0;
  int n = 2555555;
  double S = 0.0;
  double q = 0.0;
  double x, y;

  srand(42);

  while (k < n) {
    k++;

    x = rand() / (double)RAND_MAX;
    y = g(x);

    S = S + y;
    q = q + (y * y);
  }

  // Toutes les multiplications par v(G) ne sont pas faîtes car ici
  // G représente l'intervalle [0, 1] et v, son volume, serait donc
  // de 1 - 0 = 1.
  double est_y   = S/(double)n;
  double est_J   = est_y * 1;
  double est_var = (1 / (double)n) * (q/(double)n - est_y * est_y);

  printf("est_y : %lf\n", est_y);
  printf("est_J : %lf\n", est_J);
  printf("est_var : %lf\n", est_var);
}