Escolar Documentos
Profissional Documentos
Cultura Documentos
1
Como esse projeto era secreto, os cientistas precisavam de um codinome
para tal, Metrópolis, então sugeriu referenciar o famoso cassino do principado
de Mônaco, o Monte Carlo, local onde o tio de Ulam gastava o dinheiro da
família.
1. Encontrar o valor de π.
Vamos gerar aleatoriamente Pn pontos i.i.d. com coordenadas (xi , yi ) com
x ≈ U nif orme[−1, 1] e y ≈ U nif orme[−1, 1] para estimar o valor de π.
Considere um círculo de raio r = 1 centrado na origem que está inscrito
num quadrado de lado l = 2. Vamos estimar o valor de π comparando a
razão da quantidade de pontos Pc que "caíram"dentro do círculo (matema-
ticamente Pc representa o número de pontos em que a distância euclidiana
deles a origem é menor do que r) em relação ao toral de pontos P com a
razão da área do círculo em relação ao quadrado, observe:
πr2 Pc
≈
l Pn
Utilizando os valores de r = 1 e l = 2, temos:
π Pc
≈
4 Pn
Veja o nosso problema:
2
Figura 1: Estimar π a partir da área
3
local x,y = {} ,{}
local P_n = 100
local P_c = 0
local r = 1
math.randomseed (100)
function MyUniforme ()
-- Tranforma uma uniforme [0 ,1] em uniforme [ -1 ,1]
return 2* math.random () -1
end
for i = 1 , P_n , 1 do
local xi = MyUniforme ()
local yi = MyUniforme ()
-- Calcula a d i s t n c i a do ponro P_i do centro
if xi ^2+ yi ^2 <= r then
-- Caso verdadeiro P_i pertence ao c r c u l o .
P_c = P_c + 1
end
table.insert (x , xi )
table.insert (y , yi )
end
print ( P_c )
print (4* P_c / P_n )
gnuplot ({
--" set term " ,
" set grid " ,
" set parametric " ,
" set trange [ - pi : pi ] " ,
" set xrange [ -1 .5 :1 .5 ] " ,
" set yrange [ -1 .5 :1 .5 ] " ,
output = " pi2.png " ,
{ " t / pi ,1 lt rgb ' brown ' notitle " } ,
{ " t / pi , -1 lt rgb ' brown ' notitle " } ,
{ " 1 , t / pi lt rgb ' brown ' notitle " } ,
{ " -1 , t / pi lt rgb ' brown ' notitle " } ,
{ " cos ( t ) , sin ( t ) " } ,
data = {
x,
y,
},
{ using = ' 1:2 ' } ,})
4
Para: Pc = 100, π = 3.12, observe a figura:
Pn Pc π
500 398 3.184
1000 774 3.096
2000 1579 3.158
3000 2391 3.188
4000 3147 3.147
5000 3869 3.0952
6000 4730 3.1533333333333
7000 5474 3.128
8000 6303 3.1515
10000 7850 3.14
20000 15671 3.1342
100000 78612 3.14448
1000000 785295 3.14118
5
Figura 3: Estimar π com 200 pontos
2. Integração numérica
Semelhante ao que fizemos para encontrar o valor de pi usando a área
do círculo em relação ao quadrado, podemos utilizar para encontrar o
valor aproximado de uma integral de determinada função f (x) : I → R
estritamente positiva no intervalo de integração [a, b]. Com o seguinte
pseudo código podemos encontrar o valor aproximado de uma integral:
P_c = 0 -- numeros de pontos que pertencem a integral
P_n = 100 -- definir tamanho da amostra
a , b = 1 ,10 -- intervalo de integracao
f = function ( x ) -- define a funcao de interesse
i = 1
while i < P_n do
-- ponto aleatorio no intervalo [a , b ]
x = uniforme [a , b ]
-- uniforme entre 0 e o f ( x ) maximo em [] a , b ]
y = uniforme [0 , max (f ,a , b )]
-- Verificar se y eh menor que o f ( x ) da curva
if yi <= F ( xi ) then
P_c ++
end
6
i ++
end
print ( P_c )
-- valor estimado da integral de f em a , b
print ( max ( f )*( b - a )*( P_c / P_n ))
math.randomseed (100)
function F ( x )
return 1/ x
end
function UniformeAB (a , b )
-- Tranforma uma uniforme [0 ,1] em uniforme [a , b ]
return (b - a )* math.random ()+ a
end
for i = 1 , P_n , 1 do
local xi = UniformeAB (a , b )
local yi = UniformeAB (0 , F (1))
-- Verifica se yi eh menor que a curva
if yi <= F ( xi ) then
P_c = P_c +1
end
table.insert (x , xi )
table.insert (y , yi )
end
7
print ( P_c )
print (( b - a )*( P_c / P_n ))
gnuplot ({
" set grid " ,
" set xrange [1:10] " ,
" set yrange [0:1] " ,
output = " int1.png " ,
{ " 1/ x " } ,
{ using = ' 1:2 '} ,
data = {
x,
y,
},
})
R 10 1
Veja o experimento com 100 pontos, na qual: 1 x ≈ 2.3025
R 10 1
Figura 4: Estimar 1 x dx com 100 pontos
8
Pn Pc Integral
500 125 2.25
1000 222 1.998
2000 523 2.3535
3000 753 2.259
4000 999 2.24775
5000 1286 2.3148
6000 1485 2.2275
7000 1791 2.3027142857
8000 1999 2.248875
10000 2533 2.2797
20000 5105 2.29725
100000 25420 2.2878
500000 128097 2.305746
3 Cadeias de Markov
A cadeia de Markov (em homenagem ao matemático Andrei Andreyevich Mar-
kov) é um processo estocástico com a propriedade de Markov (Um estado neste
contexto refere-se à atribuição de valores aos parâmetros). Isto é, cada estado
depende exclusivamente do estado anterior a este. Um exemplo simples para
entender essa ideia é tentar prever o clima do dia seguinte apenas com os dados
obtidos hoje. Se choveu hoje, podemos observar os dados históricos mostrando
a distribuição do tempo no dia seguinte à chuva para estimar as probabilidades
do tempo amanhã. O conceito de uma Cadeia Markov é que não precisamos
conhecer toda a história de um processo para prever a próxima produção, uma
modelagem que funciona bem em muitas situações do mundo real
9
Markov) e pela suposta distribuição prévia dos parâmetros. O MCMC pode ser
considerado como uma caminhada aleatória que gradualmente converge para a
verdadeira distribuição.
5 Metropolis-Hastings algoritmo
O algoritmo nomeado como uma homenagem ao Metropolis que programou
Monte Carlo nos primeiros computadores, é um exemplo de utilização das téc-
nicas de MCMC em estatística. Veja a seguir uma breve descrição do algoritmo:
Vamos gerar uma cadeia de Markov X0 , X1 , ... utilizando Metropolis-Hastings
[3]:
Defina uma distribuição a priori g(.|Xt ).
Defina um valor inicial X0 , que pertence ao domínio de g.
Enquanto não convergir para uma distribuição estacionária repta:
10
jit.opt.start ( " loopunroll =60 " ) -- Set optimization flags :
Referências
[1] Coluna Viana Folha. Matemática dos cassinos resolve muitos problemas prá-
ticos. https://www.cos.ufrj.br/~daniel/mcmc/Coluna_Viana_Folha.pdf.
11
[2] Will Koehrsen. Mcmc in python. https://towardsdatascience.com/
markov-chain-monte-carlo-in-python-44f7e609be98.
[3] Fernando P. Maye. Mcmc. http://cursos.leg.ufpr.br/ce227/MCMC-1.
html.
12