MATLAB模擬布豐投針實驗
標簽(空格分隔): 算法
Buffon's Needle
桌面上有距離為a的若干平行線,將長度為L的針隨機丟在桌面上,則這根針與平行線相交的概率是多少?假定L < a.
思路:從針據橫線的距離與夾角得出。
解決:
- 假設針的中點到最近橫線的距離為y,則\(y\in[0,\frac{a}{2}]\);
- 因為投針是隨機的,所以y服從均勻分布:
\[ f(y) = \begin{cases} \frac{2}{a}, & \text{$0 \leq y \leq \frac{a}{2}$} \\ 0, & \text{others} \end{cases} \]
- 假定橫線向右為正向,記投針與橫線正向的角為\(\theta\),則\(\theta \in[0, \pi]\),為均勻分布。
\[f(\theta) = \begin{cases} \frac{1}{\pi}, & \text{$0 \leq \theta \leq \pi$} \\ 0, & \text{others} \end{cases} \]
投針與橫線有交點,即\(y \leq \frac{L}{2}sin\theta\)
布豐投針估算\(\pi\) -- 蒙特卡羅模擬
針與橫線有交點的概率:
\(P(x) = \int_{0}^{\pi}\int_{0}^{\frac{L}{2}sin\theta}f(y,\theta)dyd\theta = \int_{0}^{\pi}\int_{0}^{\frac{L}{2}sin\theta}f(y)f(\theta)dyd\theta \\ = \int_{0}^{\pi}\int_{0}^{\frac{L}{2}sin\theta}\frac{2}{a} * \frac{1}{\pi}dyd\theta = \frac{2L}{a\pi}\)
如果做n次投針實驗,其中有k次針與橫線相交,則針與橫線相交的頻率為:\(\frac{k}{n}\),根據大數定理,頻率也就為概率。
$ \frac{2L}{a\pi} \approx \frac{k}{n}$ 即, \(\pi \approx \frac{2Ln}{ak}\)
MATLAB模擬實驗
用布豐投針實驗近似計算\(pi\)的值:
代碼如下:
l = 0.6; %針的長度
a = 1; %平行線的寬度
n = 1000000; %做n次投針試驗
k = 0; %記錄針與平行線相交的次數
y = unifrnd(0, a/2, 1, n); %在[0, a/2]內服從均勻分布隨機產生n個數
theta = unifrnd(0, pi, 1, n); %在[0, pi]內服從均勻分布隨機產生n個數
for i=1:n
if y(i) < (l/2)*sin(theta(i))
k = k + 1;
end
end
f = k / n;
Pi = (2*l*n)/(a*k);
結果如圖所示:
如此進行多次實驗,進行估計。
如圖為進行100次重復投針實驗,每次投針1000000次,結果如圖所示: