วิธีที่ง่ายและสง่างามในการประมาณค่าโดย Monte Carlo ได้อธิบายไว้ในบทความนี้ กระดาษที่เป็นจริงเกี่ยวกับการเรียนการสอนอิเล็กทรอนิกส์ ดังนั้นวิธีการที่เหมาะสมที่สุดสำหรับเป้าหมายของคุณ ความคิดนี้ใช้แบบฝึกหัดจากตำราเรียนภาษารัสเซียยอดนิยมเรื่องทฤษฎีความน่าจะเป็นโดย Gnedenko ดู ex.22 ในหน้า 183ee
มันเกิดขึ้นเพื่อให้โดยที่ξเป็นตัวแปรสุ่มที่กำหนดไว้ดังนี้ มันเป็นจำนวนขั้นต่ำของnดังกล่าวว่าΣ n ฉัน= 1 R ฉัน > 1และr ฉันเป็นตัวเลขที่สุ่มจากเครื่องแบบกระจายบน[ 0 , 1 ] สวยใช่มั้ย!E[ξ]=eξn∑ni=1ri>1ri[0,1]
เนื่องจากมันเป็นการออกกำลังกายฉันไม่แน่ใจว่ามันยอดเยี่ยมสำหรับฉันที่จะโพสต์คำตอบ (หลักฐาน) ที่นี่ :) ถ้าคุณต้องการพิสูจน์ด้วยตัวเองนี่คือเคล็ดลับ: บทที่เรียกว่า "ช่วงเวลา" ซึ่งควรชี้ คุณไปในทิศทางที่ถูกต้อง
หากคุณต้องการที่จะใช้มันด้วยตัวคุณเองอย่าอ่านต่อ!
นี่เป็นอัลกอริทึมที่ง่ายสำหรับการจำลอง Monte Carlo วาดชุดสุ่มจากนั้นอีกอันหนึ่งเรื่อย ๆ จนกระทั่งผลรวมเกิน 1 จำนวนแรนดอมที่ถูกสุ่มคือการทดลองครั้งแรกของคุณ สมมติว่าคุณได้รับ:
0.0180
0.4596
0.7920
จากนั้นพิจารณาคดีครั้งแรกของคุณกลาย 3. ให้ทำการทดลองเหล่านี้และคุณจะพบว่ามีค่าเฉลี่ยที่คุณได้รับอีเมลe
รหัส MATLAB ผลการจำลองและฮิสโตแกรมติดตาม
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)
ผลลัพธ์และฮิสโตแกรม:
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
อัปเดต: ฉันอัปเดตรหัสของฉันเพื่อกำจัดอาร์เรย์ของผลการทดลองเพื่อที่จะไม่ใช้ RAM ฉันพิมพ์ประมาณการ PMF ด้วย
อัปเดต 2: นี่คือโซลูชัน Excel ของฉัน วางปุ่มใน Excel และเชื่อมโยงไปยังแมโคร 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
ป้อนจำนวนการทดลองเช่น 1,000 ในเซลล์ D1 และคลิกปุ่ม ที่นี่หน้าจอควรมีลักษณะอย่างไรหลังจากเรียกใช้ครั้งแรก:
UPDATE 3: Silverfish เป็นแรงบันดาลใจให้ฉันไปอีกทางหนึ่งไม่ใช่สง่างามอย่างแรก มันคำนวณปริมาณของ n-simplexes โดยใช้ลำดับ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
บังเอิญเขาเขียนหนังสือเล่มแรกเกี่ยวกับวิธีการ Monte Carlo ฉันอ่านกลับในโรงเรียนมัธยม เป็นการแนะนำวิธีการที่ดีที่สุดในความคิดของฉัน
อัพเดท 4:
Silverfish ในความคิดเห็นแนะนำการใช้สูตร Excel อย่างง่าย นี่คือผลลัพธ์ที่คุณจะได้รับเมื่อเข้าใกล้ตัวเลขสุ่ม 1 ล้านตัวและการทดลอง 185K:
เห็นได้ชัดว่านี่ช้ากว่าการนำ Excel VBA ไปใช้ โดยเฉพาะอย่างยิ่งถ้าคุณแก้ไขโค้ด VBA ของฉันเพื่อไม่อัปเดตค่าของเซลล์ภายในลูปและทำเพียงครั้งเดียวเท่านั้นเมื่อมีการรวบรวมสถิติทั้งหมด
อัพเดท 5
วิธีการแก้ปัญหาของซีอาน# 3 มีความเกี่ยวข้องอย่างใกล้ชิด (หรือแม้กระทั่งในความหมายบางอย่างตามความเห็นของ jwg ในหัวข้อ) มันยากที่จะบอกว่าใครเป็นคนคิดไอเดียแรกคือ Forsythe หรือ Gnedenko ฉบับ 1950 ของ Gnedenko ในภาษารัสเซียไม่มีส่วนของปัญหาในบทต่างๆ ดังนั้นฉันไม่สามารถพบปัญหานี้ได้ในครั้งแรกที่มันอยู่ในรุ่นที่ใหม่กว่า อาจถูกเพิ่มเข้ามาในภายหลังหรือฝังไว้ในข้อความ
เมื่อฉันแสดงความคิดเห็นในคำตอบของซีอานแนวทางของ Forsythe เชื่อมโยงกับพื้นที่ที่น่าสนใจอื่น: การกระจายระยะทางระหว่างยอดเขา (extrema) ในลำดับสุ่ม (IID) ระยะทางเฉลี่ยเกิดขึ้นที่ 3. ลำดับลงในแนวทางของ Forsythe จบลงด้วยล่างดังนั้นถ้าคุณสุ่มตัวอย่างต่อไปคุณจะได้จุดต่ำสุดอีกจุดหนึ่งจากนั้นอีกจุดหนึ่งเป็นต้นคุณสามารถติดตามระยะห่างระหว่างพวกมันและสร้างการกระจายตัว
R
คำสั่ง2 + mean(exp(-lgamma(ceiling(1/runif(1e5))-1)))
ทำอะไร (หากใช้ฟังก์ชั่นบันทึก Gamma รบกวนคุณแทนที่ด้วย2 + mean(1/factorial(ceiling(1/runif(1e5))-2))
ซึ่งใช้เฉพาะการเพิ่มการคูณการหารและการตัดและละเว้นการเตือนการล้น) สิ่งที่น่าสนใจมากกว่าคือการจำลองที่มีประสิทธิภาพ : คุณสามารถลดจำนวนของ ขั้นตอนการคำนวณที่จำเป็นในการประมาณค่า