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\).
Utilizaremos, então, o Método de Monte Carlo escrito na linguagem C, como é mostrado abaixo:
#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\).
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.