La méthode simple et élégante pour estimer e par Monte Carlo est décrite dans cet article . Le papier est en fait sur l'enseignement e . Par conséquent, l'approche semble parfaitement adaptée à votre objectif. L'idée est basée sur un exercice d'un manuel populaire russe sur la théorie des probabilités de Gnedenko. Voir ex.22 p.183
Il se trouve que E[ξ]=e , où ξ est une variable aléatoire qui est définie comme suit. C'est le nombre minimum de n tel que ∑ni=1ri>1 et ri sont des nombres aléatoires de distribution uniforme sur [0,1] . Beau, n'est ce pas?
Puisqu'il s'agit d'un exercice, je ne suis pas sûr que ce soit cool pour moi de poster la solution (preuve) ici :) Si vous souhaitez le prouver vous-même, voici un conseil: le chapitre s'appelle "Moments", ce qui devrait indiquer vous dans la bonne direction.
Si vous voulez l'implémenter vous-même, alors ne lisez pas plus loin!
C'est un algorithme simple pour la simulation de Monte Carlo. Dessinez un tirage au sort uniforme, puis un autre et ainsi de suite jusqu'à ce que la somme dépasse 1. Le nombre de tirages au sort correspond à votre premier essai. Disons que vous avez:
0.0180
0.4596
0.7920
Ensuite, votre premier essai rendu 3. Continuez à faire ces essais, et vous remarquerez qu'en moyenne, vous obtenez e .
Le code MATLAB, le résultat de la simulation et l'histogramme suivent.
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)
Le résultat et l'histogramme:
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
MISE À JOUR: J'ai mis à jour mon code pour supprimer le tableau des résultats des essais afin qu'il ne prenne pas de mémoire vive. J'ai également imprimé l'estimation du PMF.
Mise à jour 2: Voici ma solution Excel. Placez un bouton dans Excel et associez-le à la macro VBA suivante:
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
Entrez le nombre d'essais, par exemple 1000, dans la cellule D1 et cliquez sur le bouton. Voici à quoi l'écran devrait ressembler après la première utilisation:
UPDATE 3: Silverfish m'a inspiré d'une autre manière, pas aussi élégante que la première mais toujours cool. Il a calculé les volumes de n-simplexes à l'aide de séquences 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
Par coïncidence, il a écrit le premier livre sur la méthode de Monte Carlo que j'ai lu au lycée. C'est la meilleure introduction à la méthode à mon avis.
MISE À JOUR 4:
Silverfish dans les commentaires a suggéré une implémentation simple de la formule Excel. C'est le genre de résultat obtenu avec son approche après environ 1 million de nombres aléatoires et 185 000 essais:
Évidemment, cela est beaucoup plus lent que l'implémentation Excel VBA. En particulier, si vous modifiez mon code VBA pour ne pas mettre à jour les valeurs de cellule dans la boucle et ne le faites que lorsque toutes les statistiques sont collectées.
MISE À JOUR 5
La solution n ° 3 de Xi'an est étroitement liée (ou même identique dans un sens, comme le dit le commentaire de Jwg dans le fil de discussion). Il est difficile de dire qui a eu cette idée en premier Forsythe ou Gnedenko. L'édition originale de 1950 de Gnedenko en russe ne comporte pas de sections Problèmes dans les chapitres. Donc, je ne pouvais pas trouver ce problème au premier abord où il se trouve dans les éditions ultérieures. Peut-être que cela a été ajouté plus tard ou enterré dans le texte.
Comme je l'ai commenté dans la réponse de Xi'an, l'approche de Forsythe est liée à un autre domaine intéressant: la distribution des distances entre les pics (extrema) dans des séquences aléatoires (IID). La distance moyenne dans l’approche de Forsythe se termine par un fond, donc si vous continuez à échantillonner, vous obtiendrez un autre fond à un moment donné, puis un autre, etc. Vous pouvez suivre la distance qui les sépare et construire la distribution.
R
commandement2 + mean(exp(-lgamma(ceiling(1/runif(1e5))-1)))
fait. (Si vous utilisez la fonction de consignation Gamma vous dérange, remplacez-la par2 + mean(1/factorial(ceiling(1/runif(1e5))-2))
, qui utilise uniquement l’ajout, la multiplication, la division et la troncature, et ignorez les avertissements de débordement.) Ce qui pourrait être plus intéressant serait des simulations efficaces : pouvez-vous réduire le nombre de étapes de calcul nécessaires pour estimer