W tym artykule opisano prosty i elegancki sposób oszacowania przez Monte Carlo . Artykuł dotyczy nauczania . Dlatego podejście wydaje się idealnie pasować do twojego celu. Pomysł opiera się na ćwiczeniu z popularnego rosyjskiego podręcznika teorii prawdopodobieństwa autorstwa Gnedenko. Patrz przykład 22 na str. 183eee
Zdarza się tak, że , gdzie jest zmienną losową, która jest zdefiniowana w następujący sposób. Jest to minimalna liczba taka, że i są liczbami losowymi z rozkładu równomiernego na . Piękne, prawda ?!ξ n ∑ n i = 1 r i > 1 r i [ 0 , 1 ]E[ξ]=eξn∑ni=1ri>1ri[0,1]
Ponieważ jest to ćwiczenie, nie jestem pewien, czy fajnie jest dla mnie opublikować rozwiązanie (dowód) tutaj :) Jeśli chcesz sam to udowodnić, oto wskazówka: rozdział nazywa się „Chwile”, które powinny wskazywać jesteś we właściwym kierunku.
Jeśli chcesz wdrożyć go samodzielnie, nie czytaj dalej!
Jest to prosty algorytm do symulacji Monte Carlo. Narysuj jednolity losowy, a następnie kolejny i tak dalej, aż suma przekroczy 1. Liczba losowanych losów jest twoją pierwszą próbą. Powiedzmy, że masz:
0.0180
0.4596
0.7920
Potem twoja pierwsza próba sprawiła, że 3. Kontynuuj te próby, a zauważysz, że średnio dostajesz .e
Poniżej znajduje się kod MATLAB, wynik symulacji i histogram.
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)
Wynik i histogram:
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
AKTUALIZACJA: Zaktualizowałem swój kod, aby pozbyć się szeregu wyników próbnych, aby nie zajmował pamięci RAM. Wydrukowałem również oszacowanie PMF.
Aktualizacja 2: Oto moje rozwiązanie Excel. Umieść przycisk w programie Excel i połącz go z następującym makrem 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
Wprowadź liczbę prób, na przykład 1000, w komórce D1 i kliknij przycisk. Oto jak powinien wyglądać ekran po pierwszym uruchomieniu:
AKTUALIZACJA 3: Silverfish zainspirował mnie do innej drogi, nie tak eleganckiej jak pierwsza, ale wciąż fajnej. Obliczył objętości n-simpleksów przy użyciu sekwencji Sobola .
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
Przypadkowo napisał pierwszą książkę o metodzie Monte Carlo, którą przeczytałem w szkole średniej. Moim zdaniem jest to najlepsze wprowadzenie do metody.
AKTUALIZACJA 4:
Silverfish w komentarzach sugerował prostą implementację formuły Excel. Taki wynik uzyskuje się po jego podejściu po około 1 milionie losowych liczb i 185 000 prób:
Oczywiście jest to znacznie wolniejsze niż wdrożenie Excel VBA. Zwłaszcza jeśli zmodyfikujesz mój kod VBA, aby nie aktualizować wartości komórek w pętli i zrobisz to dopiero po zebraniu wszystkich statystyk.
AKTUALIZACJA 5
Xi'an za rozwiązanie nr 3 jest ściśle powiązany (lub nawet taki sam w pewnym sensie jako komentarz na JWG w wątku). Trudno powiedzieć, kto wpadł na ten pomysł jako pierwszy Forsythe lub Gnedenko. Oryginalna edycja Gnedenko z 1950 roku w języku rosyjskim nie zawiera sekcji Problemy w rozdziałach. Tak więc nie mogłem znaleźć tego problemu na pierwszy rzut oka, gdzie jest w późniejszych wydaniach. Może został dodany później lub zakopany w tekście.
Jak skomentowałem w odpowiedzi Xi'ana, podejście Forsythe'a wiąże się z innym interesującym obszarem: rozkładem odległości między pikami (ekstrema) w losowych sekwencjach (IID). Średnia odległość zdarza się wynosić 3. Sekwencja dolna w podejściu Forsythe'a kończy się na dole, więc jeśli będziesz kontynuować próbkowanie, w pewnym momencie dostaniesz kolejne dno, a potem inne. Możesz śledzić odległość między nimi i zbudować rozkład.
R
polecenie2 + mean(exp(-lgamma(ceiling(1/runif(1e5))-1)))
. (Jeśli przeszkadza Ci korzystanie z funkcji log Gamma, zastąp ją2 + mean(1/factorial(ceiling(1/runif(1e5))-2))
, która używa tylko dodawania, mnożenia, dzielenia i obcinania, i ignoruj ostrzeżenia o przepełnieniu). Bardziej interesujące mogą być wydajne symulacje: czy możesz zminimalizować liczbę kroki obliczeniowe potrzebne do oszacowania