Il modo semplice ed elegante per stimare di Monte Carlo è descritto in questo documento . Il documento riguarda in realtà l'insegnamento e . Quindi, l'approccio sembra perfettamente adatto al tuo obiettivo. L'idea si basa su un esercizio tratto da un popolare libro di testo russo sulla teoria della probabilità di Gnedenko. Vedi ex.22 a p.183ee
Succede in modo che , dove ξ è una variabile casuale definita come segue. È il numero minimo di n tale che Σ n i = 1 r i > 1 e r i sono numeri casuali da una distribuzione uniforme su [ 0 , 1 ] . Bello, no ?!E[ξ]=eξnΣni = 1rio> 1rio[ 0 , 1 ]
Dal momento che è un esercizio, non sono sicuro che sia bello per me pubblicare la soluzione (prova) qui :) Se desideri dimostrarlo tu stesso, ecco un suggerimento: il capitolo si chiama "Momenti", che dovrebbe indicare tu nella giusta direzione.
Se vuoi implementarlo da solo, allora non leggere oltre!
Questo è un semplice algoritmo per la simulazione Monte Carlo. Disegna un casuale uniforme, quindi un altro e così via fino a quando la somma non supera 1. Il numero di random estratti è la tua prima prova. Diciamo che hai:
0.0180
0.4596
0.7920
Quindi viene eseguito il rendering della tua prima prova 3. Continua a fare queste prove e noterai che in media ottieni .e
Seguono il codice MATLAB, il risultato della simulazione e l'istogramma.
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)
Il risultato e l'istogramma:
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
AGGIORNAMENTO: ho aggiornato il mio codice per eliminare la matrice dei risultati della prova in modo che non richieda RAM. Ho anche stampato la stima del PMF.
Aggiornamento 2: ecco la mia soluzione Excel. Inserisci un pulsante in Excel e collegalo alla seguente 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
Immettere il numero di prove, ad esempio 1000, nella cella D1 e fare clic sul pulsante. Ecco come dovrebbe apparire lo schermo dopo la prima esecuzione:
AGGIORNAMENTO 3: Silverfish mi ha ispirato in un altro modo, non elegante come il primo ma comunque bello. Ha calcolato i volumi di n-simplex usando sequenze di 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
Per coincidenza ha scritto il primo libro sul metodo Monte Carlo che ho letto al liceo. Secondo me è la migliore introduzione al metodo.
AGGIORNAMENTO 4:
Silverfish nei commenti ha suggerito una semplice implementazione della formula Excel. Questo è il tipo di risultato che ottieni con il suo approccio dopo circa 1 milione di numeri casuali e 185.000 prove:
Ovviamente, questo è molto più lento dell'implementazione VBA di Excel. In particolare, se modifichi il mio codice VBA per non aggiornare i valori della cella all'interno del ciclo e lo fai solo una volta raccolte tutte le statistiche.
AGGIORNAMENTO 5
La soluzione n. 3 di Xi'an è strettamente correlata (o anche la stessa in un certo senso come nel commento di jwg nel thread). È difficile dire chi abbia avuto l'idea prima di Forsythe o Gnedenko. L'edizione 1950 originale di Gnedenko in russo non ha sezioni Problemi nei Capitoli. Quindi, non riuscivo a trovare questo problema a prima vista dove si trova nelle edizioni successive. Forse è stato aggiunto in seguito o seppellito nel testo.
Come ho commentato nella risposta di Xi'an, l'approccio di Forsythe è collegato a un'altra area interessante: la distribuzione delle distanze tra picchi (estremi) in sequenze casuali (IID). La distanza media risulta essere 3. La sequenza discendente nell'approccio di Forsythe termina con un fondo, quindi se continui il campionamento otterrai un altro fondo in un punto, poi un altro ecc. Puoi tracciare la distanza tra loro e costruire la distribuzione.
R
comando2 + mean(exp(-lgamma(ceiling(1/runif(1e5))-1)))
fa. (Se l'utilizzo della funzione Log Gamma ti dà fastidio, sostituiscilo con2 + mean(1/factorial(ceiling(1/runif(1e5))-2))
, che utilizza solo addizione, moltiplicazione, divisione e troncamento e ignora gli avvisi di overflow.) Ciò che potrebbe essere di maggiore interesse sarebbero simulazioni efficienti : puoi minimizzare il numero di passi computazionali necessari per stimare