Exercice 1 : Méthode de Monte-Carlo

  1. Générer un échantillon de Monte Carlo de taille \(50\) pour une loi normale de moyenne \(m=2\) et d’écart-type \(s=3\). Calculer les estimateurs de Monte-Carlo de la moyenne et de l’écart-type sur ce \(50\)-échantillon. Générer ensuite un échantillon de taille \(20\,000\) et calculer l’estimateurs de Monte-Carlo de la moyenne sur ce \(20\,000\)-échantillon. Que remarque-t-on ? Quel résultat théorique illustre-t-on ici ?

  2. En reprenant l’exemple du cours, programmer un estimation de Monte Carlo du nombre \(\pi\approx 3,1416\)

    1. Programmer une fonction roulette_coord qui prend un seul argument ncases (représentant le nombre de valeurs possible sur la roulette utilisée) valant 36 par défaut, permettant de générer les coordonnées d’un point (entre \(0\) et \(35\)). On utilisera la fonction R sample(dont on pourra consulter l’aide grâce à la commande ?sample). La fonction renvera le vecteur des 2 coordonnées ainsi générées.

    2. En utilsant la formule de la distance entre 2 points, programmer une fonction calculant la distance à l’origine (qui a ici pour coordonnées \((\frac{ncases+1}{2}, \frac{ncases+1}{2})\)) : \(d = \sqrt{(x_1 - x_2)^2 + (y_1 - y_2)^2}\) et vérifiant si celle-ci est inférieure ou égale au rayon du cercle unité (\(R = \frac{ncases-1}{2}\)). Cette fonction prendra deux arguments : d’une part le vecteur p des deux coordonnées du point évalué, d’autre part ncases.

    3. Comme le ratio entre la surface du cercle de rayon \(\frac{ncases}{2}\) et celle du carré de coté \(ncases\) est égal à \(\frac{\pi}{4}\), la probabilité d’échantillonner un point à l’intérieur du cerlce est de \(\frac{\pi}{4}\). Appuyer vous sur ce résultat pour programmer une fonction calculant l’estimation de Monte-Carlo de \(pi\) à partir d’un vecteur booléen de taille \(n\) (le nombre de points échantillonnés) qui vaut TRUE si le point se trouve effectivement à l’intérieur du cerlce, et FALSE sinon.

    4. À l’aide du code ci-dessous, représenter les données générées puis afficher l’estimation de Monte-Carlo de \(\pi\) correspondante. Faire varier npoints et commenter. COmment améliorer l’estimation ?

      # Taille de la grille (résolution)
      ncases <- 36
      
      # Taille de l'échantillon de Monte Carlo
      npoints <- 200
      
      # Génération des points
      pp <- matrix(NA, ncol = 2, nrow = npoints)
      for (i in 1:nrow(pp)) {
          pp[i, ] <- roulette_coord(ncases)
      }
      
      # Dessin on commence par initialiser un plot vide, de la bonne taille avec
      # l'argument `type = n`
      plot(x = pp[, 1], y = pp[, 2], xlim = c(1, ncases), ylim = c(1, ncases), axes = 0, 
          xlab = "x", ylab = "y", type = "n")
      ## on gradue les axes x puis y de 1 à 36
      axis(1, at = c(1:ncases))
      axis(2, at = c(1:ncases))
      ## on ajoute un carré encadrant le dessin
      box()
      ## on trace (en pointillés grâce à l'argument `lty = 3`) la grille sur
      ## laquelle sont échantillonnés nos points
      for (i in 1:ncases) {
          abline(h = i, lty = 3)
          abline(v = i, lty = 3)
      }
      ## on ajoute les points échantillonés
      lines(x = pp[, 1], y = pp[, 2], xlim = c(1, ncases), ylim = c(1, ncases), xlab = "x", 
          ylab = "y", type = "p", pch = 16)
      ## on ajoute la représentation du cercle
      x.cercle <- seq(1, ncases, by = 0.1)
      y.cercle <- sqrt(((ncases - 1)/2)^2 - (x.cercle - (ncases + 1)/2)^2)
      lines(x.cercle, y = y.cercle + (ncases + 1)/2, col = "red")
      lines(x.cercle, y = -y.cercle + (ncases + 1)/2, col = "red")
      ## enfin on colori en rouge les points échantillonnés à l'intérieur du cercle
      in_circle <- apply(X = pp, MARGIN = 1, FUN = inside_circle, ncases = ncases)
      lines(x = pp[in_circle, 1], y = pp[in_circle, 2], xlim = c(0, ncases), ylim = c(0, 
          ncases), xlab = "x", ylab = "y", type = "p", pch = 16, col = "red", cex = 0.7)