Cara sederhana dan elegan untuk memperkirakan oleh Monte Carlo dijelaskan dalam makalah ini . Makalah ini sebenarnya tentang pengajaran . Karenanya, pendekatan tersebut tampaknya sangat sesuai untuk tujuan Anda. Idenya didasarkan pada latihan dari buku teks Rusia populer tentang teori probabilitas oleh Gnedenko. Lihat contoh.22 di hlm.183eee
Itu terjadi sehingga , di mana adalah variabel acak yang didefinisikan sebagai berikut. Ini adalah jumlah minimum sehingga dan adalah angka acak dari distribusi seragam pada . Cantik bukan ?!ξ n ∑ n i = 1 r i > 1 r i [ 0 , 1 ]E[ξ]=eξn∑ni=1ri>1ri[0,1]
Karena ini adalah latihan, saya tidak yakin apakah itu keren bagi saya untuk mengirim solusi (bukti) di sini :) Jika Anda ingin membuktikannya sendiri, inilah tipnya: bab ini disebut "Momen", yang seharusnya menunjukkan Anda ke arah yang benar.
Jika Anda ingin menerapkannya sendiri, maka jangan membaca lebih lanjut!
Ini adalah algoritma sederhana untuk simulasi Monte Carlo. Gambarlah seragam acak, lalu yang lain dan seterusnya sampai jumlahnya melebihi 1. Jumlah tebusan yang ditarik adalah percobaan pertama Anda. Katakanlah Anda mendapat:
0.0180
0.4596
0.7920
Kemudian sidang pertama Anda diberikan 3. Jauhkan melakukan percobaan ini, dan Anda akan melihat bahwa rata-rata Anda mendapatkan .e
Kode MATLAB, hasil simulasi dan histogram mengikuti.
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)
Hasil dan 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
UPDATE: Saya memperbarui kode saya untuk menyingkirkan berbagai hasil uji coba sehingga tidak memerlukan RAM. Saya juga mencetak estimasi PMF.
Pembaruan 2: Inilah solusi Excel saya. Masukkan tombol di Excel dan tautkan ke makro VBA berikut:
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
Masukkan jumlah uji coba, seperti 1000, di sel D1, dan klik tombol. Di sini bagaimana tampilan layar setelah menjalankan pertama:
UPDATE 3: Silverfish menginspirasi saya ke cara lain, tidak seanggun yang pertama tapi masih keren. Ini menghitung volume n-simpleks menggunakan urutan 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
Secara kebetulan dia menulis buku pertama tentang metode Monte Carlo yang saya baca di sekolah menengah. Ini pengantar metode terbaik menurut saya.
PEMBARUAN 4:
Silverfish dalam komentar menyarankan implementasi rumus Excel sederhana. Ini adalah jenis hasil yang Anda dapatkan dengan pendekatannya setelah sekitar 1 juta angka acak dan uji coba 185 ribu:
Jelas, ini jauh lebih lambat daripada implementasi Excel VBA. Terutama, jika Anda mengubah kode VBA saya untuk tidak memperbarui nilai sel di dalam loop, dan hanya lakukan setelah semua statistik dikumpulkan.
PEMBARUAN 5
Solusi Xi'an # 3 terkait erat (atau bahkan sama dalam arti sesuai komentar jwg di utas). Sulit untuk mengatakan siapa yang datang dengan gagasan pertama Forsythe atau Gnedenko. Edisi 1950 asli Gnedenko dalam bahasa Rusia tidak memiliki bagian Masalah di Bab. Jadi, saya tidak dapat menemukan masalah ini pada pandangan pertama di mana ia berada di edisi selanjutnya. Mungkin ditambahkan kemudian atau dikubur dalam teks.
Seperti yang saya komentari dalam jawaban Xi'an, pendekatan Forsythe terkait dengan bidang menarik lainnya: distribusi jarak antara puncak (ekstrem) dalam urutan acak (IID). Jarak rata-rata adalah 3. Urutan ke bawah dalam pendekatan Forsythe berakhir dengan dasar, jadi jika Anda melanjutkan pengambilan sampel Anda akan mendapatkan bagian bawah lainnya di beberapa titik, lalu di titik lainnya. Anda dapat melacak jarak antara mereka dan membangun distribusi.
R
perintah2 + mean(exp(-lgamma(ceiling(1/runif(1e5))-1)))
. (Jika menggunakan fungsi Gamma log mengganggu Anda, gantikan dengan2 + mean(1/factorial(ceiling(1/runif(1e5))-2))
, yang hanya menggunakan penambahan, perkalian, pembagian, dan pemotongan, dan abaikan peringatan luapan.) Apa yang mungkin lebih menarik adalah simulasi yang efisien : dapatkah Anda meminimalkan jumlah langkah-langkah komputasi yang diperlukan untuk memperkirakan sampai akurasi tertentu?