A maneira simples e elegante de estimar por Monte Carlo é descrita neste artigo . O artigo é realmente sobre ensino . Portanto, a abordagem parece perfeitamente adequada ao seu objetivo. A ideia é baseada em um exercício de um popular livro russo sobre teoria das probabilidades de Gnedenko. Ver ex.22 na p.183eee
Isso acontece para que , onde é uma variável aleatória definida da seguinte maneira. É o número mínimo de tal que e são números aleatórios de distribuição uniforme em . Bonito, não é ?!ξ n ∑ n i = 1 r i > 1 r i [ 0 , 1 ]E[ξ]=eξn∑ni=1ri>1ri[0,1]
Como é um exercício, não tenho certeza se é legal postar a solução (prova) aqui :) Se você quiser provar você mesmo, aqui está uma dica: o capítulo é chamado de "Momentos", que deve apontar você na direção certa.
Se você deseja implementá-lo, não leia mais!
Este é um algoritmo simples para simulação de Monte Carlo. Desenhe um uniforme aleatório, depois outro e assim sucessivamente até que a soma exceda 1. O número de randoms sorteados é o seu primeiro teste. Digamos que você tenha:
0.0180
0.4596
0.7920
Em seguida, seu primeiro teste foi renderizado 3. Continue fazendo esses testes e notará que, em média, você obtém .e
Seguem o código MATLAB, o resultado da simulação e o histograma.
N = 10000000;
n = N;
s = 0;
i = 0;
maxl = 0;
f = 0;
while n > 0
s = s + rand;
i = i + 1;
if s > 1
if i > maxl
f(i) = 1;
maxl = i;
else
f(i) = f(i) + 1;
end
i = 0;
s = 0;
n = n - 1;
end
end
disp ((1:maxl)*f'/sum(f))
bar(f/sum(f))
grid on
f/sum(f)
O resultado e o histograma:
2.7183
ans =
Columns 1 through 8
0 0.5000 0.3332 0.1250 0.0334 0.0070 0.0012 0.0002
Columns 9 through 11
0.0000 0.0000 0.0000
ATUALIZAÇÃO: Atualizei meu código para livrar-se da matriz de resultados de testes, para que não ocupe RAM. Também imprimi a estimativa do PMF.
Atualização 2: Aqui está minha solução do Excel. Coloque um botão no Excel e vincule-o à seguinte macro VBA:
Private Sub CommandButton1_Click()
n = Cells(1, 4).Value
Range("A:B").Value = ""
n = n
s = 0
i = 0
maxl = 0
Cells(1, 2).Value = "Frequency"
Cells(1, 1).Value = "n"
Cells(1, 3).Value = "# of trials"
Cells(2, 3).Value = "simulated e"
While n > 0
s = s + Rnd()
i = i + 1
If s > 1 Then
If i > maxl Then
Cells(i, 1).Value = i
Cells(i, 2).Value = 1
maxl = i
Else
Cells(i, 1).Value = i
Cells(i, 2).Value = Cells(i, 2).Value + 1
End If
i = 0
s = 0
n = n - 1
End If
Wend
s = 0
For i = 2 To maxl
s = s + Cells(i, 1) * Cells(i, 2)
Next
Cells(2, 4).Value = s / Cells(1, 4).Value
Rem bar (f / Sum(f))
Rem grid on
Rem f/sum(f)
End Sub
Digite o número de tentativas, como 1000, na célula D1 e clique no botão Aqui, como a tela deve ficar após a primeira execução:
ATUALIZAÇÃO 3: Silverfish me inspirou de outra maneira, não tão elegante quanto a primeira, mas ainda assim legal. Ele calculou os volumes de n-simplex usando sequências de Sobol .
s = 2;
for i=2:10
p=sobolset(i);
N = 10000;
X=net(p,N)';
s = s + (sum(sum(X)<1)/N);
end
disp(s)
2.712800000000001
Por coincidência, ele escreveu o primeiro livro sobre o método Monte Carlo que li no ensino médio. É a melhor introdução ao método na minha opinião.
ATUALIZAÇÃO 4:
O Silverfish nos comentários sugeriu uma implementação simples da fórmula do Excel. Esse é o tipo de resultado que você obtém com a abordagem dele após cerca de 1 milhão de números aleatórios e 185 mil tentativas:
Obviamente, isso é muito mais lento que a implementação do Excel VBA. Especialmente, se você modificar meu código VBA para não atualizar os valores das células dentro do loop, e só o fará quando todas as estatísticas forem coletadas.
ATUALIZAÇÃO 5
A solução 3 de Xi'an está intimamente relacionada (ou até a mesma em algum sentido, conforme o comentário de jwg no tópico). É difícil dizer quem teve a ideia primeiro em Forsythe ou Gnedenko. A edição original de Gnedenko em 1950, em russo, não possui seções de problemas nos capítulos. Portanto, à primeira vista, não foi possível encontrar esse problema em edições posteriores. Talvez tenha sido adicionado mais tarde ou enterrado no texto.
Como comentei na resposta de Xi'an, a abordagem de Forsythe está ligada a outra área interessante: a distribuição de distâncias entre picos (extremos) em seqüências aleatórias (IID). A distância média passa a ser 3. A sequência descendente na abordagem de Forsythe termina com um fundo, portanto, se você continuar amostrando, obterá outro fundo em algum momento, depois outro etc. Você pode rastrear a distância entre eles e criar a distribuição.
R
comando2 + mean(exp(-lgamma(ceiling(1/runif(1e5))-1)))
faz. (Se o uso da função Gamma do log o incomoda, substitua-o por2 + mean(1/factorial(ceiling(1/runif(1e5))-2))
, que usa apenas adição, multiplicação, divisão e truncamento e ignore os avisos de estouro.) O que poderia ser de maior interesse seria simulações eficientes : você pode minimizar o número de etapas computacionais necessárias para estimar