La forma simple y elegante de estimar por Monte Carlo se describe en este documento . El artículo trata sobre la enseñanza . Por lo tanto, el enfoque parece perfectamente adecuado para su objetivo. La idea se basa en un ejercicio de un popular libro de texto ruso sobre teoría de la probabilidad de Gnedenko. Ver ex.22 en p.183eee
Sucede de modo que , donde es una variable aleatoria que se define de la siguiente manera. Es el número mínimo de tal que y son números aleatorios de distribución uniforme en . Hermoso, ¿no?ξ n ∑ n i = 1 r i > 1 r i [ 0 , 1 ]E[ξ]=eξn∑ni=1ri>1ri[0,1]
Dado que es un ejercicio, no estoy seguro de si es bueno para mí publicar la solución (prueba) aquí :) Si desea probarlo usted mismo, aquí hay un consejo: el capítulo se llama "Momentos", que debería señalar usted en la dirección correcta
Si desea implementarlo usted mismo, ¡no siga leyendo!
Este es un algoritmo simple para la simulación de Monte Carlo. Dibuja un uniforme al azar, luego otro y así sucesivamente hasta que la suma exceda 1. El número de randoms extraídos es tu primer intento. Digamos que tienes:
0.0180
0.4596
0.7920
Luego, su primera prueba se procesó. 3. Siga haciendo estas pruebas y notará que, en promedio, obtiene .e
El código MATLAB, el resultado de la simulación y el histograma siguen.
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)
El resultado y el 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
ACTUALIZACIÓN: Actualicé mi código para deshacerme de la matriz de resultados de prueba para que no tome RAM. También imprimí la estimación de PMF.
Actualización 2: Aquí está mi solución de Excel. Ponga un botón en Excel y vincúlelo a la siguiente macro de 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
Ingrese el número de pruebas, como 1000, en la celda D1 y haga clic en el botón. Así es como debería verse la pantalla después de la primera ejecución:
ACTUALIZACIÓN 3: Silverfish me inspiró de otra manera, no tan elegante como la primera pero aún genial. Calculó los volúmenes de n-simplexes usando secuencias 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
Casualmente escribió el primer libro sobre el método de Monte Carlo que leí en la escuela secundaria. Es la mejor introducción al método en mi opinión.
ACTUALIZACIÓN 4:
Silverfish en los comentarios sugirió una implementación simple de la fórmula de Excel. Este es el tipo de resultado que obtienes con su enfoque después de aproximadamente 1 millón de números aleatorios y 185K pruebas:
Obviamente, esto es mucho más lento que la implementación de Excel VBA. Especialmente, si modifica mi código VBA para no actualizar los valores de las celdas dentro del bucle, y solo lo hace una vez que se recopilan todas las estadísticas.
ACTUALIZACIÓN 5
De Xi'an solución # 3 está estrechamente relacionado (o incluso el mismo en cierto sentido como un comentario de por jwg en el hilo). Es difícil decir quién se le ocurrió la idea primera Forsythe o Gnedenko. Edición original de 1950 Gnedenko en ruso no tiene secciones problemas en los capítulos. Por lo tanto, no pude encontrar este problema a primera vista, donde se encuentra en ediciones posteriores. Tal vez fue agregado más tarde o enterrado en el texto.
Como comenté en la respuesta de Xi'an, el enfoque de Forsythe está vinculado a otra área interesante: la distribución de distancias entre picos (extremos) en secuencias aleatorias (IID). La distancia media es 3. La secuencia descendente en el enfoque de Forsythe termina con un fondo, por lo que si continúa muestreando obtendrá otro fondo en algún momento, luego otro, etc. Puede rastrear la distancia entre ellos y construir la distribución.
R
comando2 + mean(exp(-lgamma(ceiling(1/runif(1e5))-1)))
. (Si el uso de la función de registro Gamma le molesta, reemplácelo por2 + mean(1/factorial(ceiling(1/runif(1e5))-2))
, que solo usa suma, multiplicación, división y truncamiento, e ignore las advertencias de desbordamiento). Lo que podría ser de mayor interés serían las simulaciones eficientes : ¿puede minimizar el número de pasos computacionales necesarios para estimar con una precisión dada?