Introdução

O número \(\pi\) é, há tempos, um tópico de bastante interesse na matemática e em várias áreas que a envolvem. Por ser irracional, \(\pi\) não possui representação finita, de forma que a sua estimação é um âmbito sempre muito explorado. E, é nesse campo da estimação de \(\pi\), que este trabalho será desenvolvido. Utilizando-se do fato amplamente conhecido que a área de uma circunferência de raio \(r\) é dada por \(\pi\cdot r^2\). Será analisada uma circunferência centrada em \((0,0)\) e de raio \(1\), ou seja, de área \(\pi\). Mais precisamente, apenas o quarto dessa circunferência presente no primeiro quadrante, que proporcionalmente, terá área igual a \(\dfrac{1}{4}\cdot\pi\).

Sendo assim, a ideia é estimar a área desse quarto de circunferência, pois, desta forma, se estará estimando o valor de \(\dfrac{\pi}{4}\). Basta, então, multiplicar o valor estimado por \(4\), que se terá uma estimativa de \(\pi\).

Desenvolvimento

Utilizaremos, então, o Método de Monte Carlo escrito na linguagem C, como é mostrado abaixo:

Método de Monte Carlo em C


#include <Rcpp.h>
// [[Rcpp::export]]

double PiMMC_c(int n)
{
  int i;
  int contador = 0;
  double x, y;
  Rcpp::RNGScope scope;

  for (i = 0; i < n; i++)
  {
    x = R::runif(0, 1);
    y = R::runif(0, 1);

    if (x*x + y*y <= 1) contador++;
  }

  return 4.0*contador/n;
}

Após criada a função, verificaremos como o aumento da quantidade de pontos no Método de Monte Carlo (a váriavél ‘n’ do programa) impacta na qualidade da estimação. Para garantir que não tivemos “sorte” em alguma estimativa, faremos 100 réplicas para cada teste, e a estimativa será a média dessas 100, como pode ser visto a seguir:

library(tidyverse)
set.seed("2507")

n = 10
replicas = 100

resultado1 <- matrix(nrow = replicas, ncol = 1)

for(i in 1:replicas) resultado1[i] <- PiMMC_c(n)

Estimativa1 <- sum(resultado1)/replicas
Estimativa1
## [1] 3.18
n = 100
replicas = 100

resultado2 <- matrix(nrow = replicas, ncol = 1)

for(i in 1:replicas) resultado2[i] <- PiMMC_c(n)

Estimativa2 <- sum(resultado2)/replicas
Estimativa2
## [1] 3.1472
n = 1000
replicas = 100

resultado3 <- matrix(nrow = replicas, ncol = 1)

for(i in 1:replicas) resultado3[i] <- PiMMC_c(n)

Estimativa3 <- sum(resultado3)/replicas
Estimativa3
## [1] 3.14892
n = 10000
replicas = 100

resultado4<- matrix(nrow = replicas, ncol = 1)

for(i in 1:replicas) resultado4[i] <- PiMMC_c(n)

Estimativa4 <- sum(resultado4)/replicas
Estimativa4
## [1] 3.143128
n = 100000
replicas = 100

resultado5<- matrix(nrow = replicas, ncol = 1)

for(i in 1:replicas) resultado5[i] <- PiMMC_c(n)

Estimativa5 <- sum(resultado5)/replicas
Estimativa5
## [1] 3.141849
n = 1000000
replicas = 100

resultado6<- matrix(nrow = replicas, ncol = 1)

for(i in 1:replicas) resultado6[i] <- PiMMC_c(n)

Estimativa6 <- sum(resultado6)/replicas
Estimativa6
## [1] 3.141487

O valor de \(\pi\) pertence ao conjunto dos números irracionais, sendo assim, sua representação é infinita e não-periódica. Uma aproximação com 10 casas decimais de \(\pi\) é dada por \(3,141592653589793\).

Conclusão

Podemos, portanto, notar que com o aumento da quantidade de pontos no Método de Monte Carlo, melhores ficam as estimativas de \(\pi\). O que nos leva a crer que quando esse valor tendo ao infinito, nossa estimativa converge para pi.

De forma geral, nesse trabalho percebemos como utilizar o C para auxiliar e tornar mais rápido o processo de estimação, através de simulações de Monte Carlo.