Cách đơn giản và thanh lịch để ước tính e của Monte Carlo được mô tả trong bài viết này . Bài viết thực sự là về giảng dạy e . Do đó, cách tiếp cận có vẻ hoàn toàn phù hợp với mục tiêu của bạn. Ý tưởng này dựa trên một bài tập từ sách giáo khoa phổ biến của Nga về lý thuyết xác suất của Gnedenko. Xem ex.22 trên p.183
Nó xảy ra sao cho E[ξ]=e , trong đó ξ là biến ngẫu nhiên được xác định như sau. Đó là số tối thiểu nsao cho ∑ni=1ri>1 và ri là các số ngẫu nhiên từ phân phối đồng đều trên [0,1] . Đẹp phải không?!
Vì đó là một bài tập, tôi không chắc liệu tôi có tuyệt không khi đăng giải pháp (bằng chứng) ở đây :) Nếu bạn muốn tự mình chứng minh, đây là một mẹo: chương có tên là "Khoảnh khắc", nên chỉ ra bạn đi đúng hướng
Nếu bạn muốn tự thực hiện nó, thì đừng đọc thêm!
Đây là một thuật toán đơn giản cho mô phỏng Monte Carlo. Vẽ một số ngẫu nhiên thống nhất, sau đó một số khác và cứ thế cho đến khi tổng vượt quá 1. Số lượng randoms được rút ra là thử nghiệm đầu tiên của bạn. Hãy nói rằng bạn có:
0.0180
0.4596
0.7920
Sau đó, thử nghiệm đầu tiên của bạn được hiển thị 3. Tiếp tục thực hiện các thử nghiệm này và bạn sẽ nhận thấy rằng trung bình bạn nhận được e .
Mã MATLAB, kết quả mô phỏng và biểu đồ theo sau.
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)
Kết quả và biểu đồ:
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
CẬP NHẬT: Tôi đã cập nhật mã của mình để thoát khỏi mảng kết quả dùng thử để không mất RAM. Tôi cũng đã in dự toán PMF.
Cập nhật 2: Đây là giải pháp Excel của tôi. Đặt một nút trong Excel và liên kết nó với macro VBA sau:
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
Nhập số lượng thử nghiệm, chẳng hạn như 1000, trong ô D1 và nhấp vào nút. Đây là màn hình sẽ như thế nào sau lần chạy đầu tiên:
CẬP NHẬT 3: Silverfish truyền cảm hứng cho tôi theo một cách khác, không thanh lịch như cách đầu tiên nhưng vẫn mát mẻ. Nó đã tính toán khối lượng của n-Simplexes bằng các chuỗi 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
Tình cờ anh viết cuốn sách đầu tiên về phương pháp Monte Carlo mà tôi đọc hồi còn học trung học. Theo ý kiến của tôi, đây là phần giới thiệu tốt nhất.
CẬP NHẬT 4:
Silverfish trong các ý kiến đề xuất một công thức Excel đơn giản. Đây là loại kết quả bạn nhận được với cách tiếp cận của anh ấy sau khoảng 1 triệu số ngẫu nhiên và 185 nghìn thử nghiệm:
Rõ ràng, điều này chậm hơn nhiều so với triển khai VBA của Excel. Đặc biệt, nếu bạn sửa đổi mã VBA của tôi để không cập nhật các giá trị ô bên trong vòng lặp và chỉ thực hiện khi tất cả các số liệu thống kê được thu thập.
CẬP NHẬT 5
Giải pháp số 3 của Xi'an có liên quan chặt chẽ (hoặc thậm chí giống nhau theo nghĩa nào đó theo nhận xét của jwg trong chuỗi). Thật khó để nói ai đã nghĩ ra ý tưởng đầu tiên Forsythe hay Gnedenko. Phiên bản gốc 1950 của Gnedenko bằng tiếng Nga không có phần Sự cố trong Chương. Vì vậy, tôi không thể tìm thấy vấn đề này ngay từ cái nhìn đầu tiên trong đó là phiên bản sau. Có lẽ nó đã được thêm vào sau hoặc chôn trong văn bản.
Như tôi đã nhận xét trong câu trả lời của Tây An, cách tiếp cận của Forsythe được liên kết với một lĩnh vực thú vị khác: sự phân bố khoảng cách giữa các đỉnh (cực trị) theo trình tự ngẫu nhiên (IID). Khoảng cách trung bình xảy ra là 3. Trình tự xuống trong cách tiếp cận của Forsythe kết thúc bằng một đáy, vì vậy nếu bạn tiếp tục lấy mẫu, bạn sẽ nhận được một đáy khác tại một số điểm, sau đó khác, v.v. Bạn có thể theo dõi khoảng cách giữa chúng và xây dựng phân phối.
R
lệnh2 + mean(exp(-lgamma(ceiling(1/runif(1e5))-1)))
làm. (Nếu sử dụng nhật ký Gamma chức năng làm phiền bạn, thay thế nó bằng cách2 + mean(1/factorial(ceiling(1/runif(1e5))-2))
, trong đó sử dụng chỉ Ngoài ra, nhân, chia, và cắt ngắn, và bỏ qua những lời cảnh báo tràn.) Những gì có thể là mối quan tâm lớn hơn sẽ là hiệu quả mô phỏng: bạn có thể giảm thiểu số lượng các bước tính toán cần thiết để ước tính với độ chính xác nào?