Featured image of post 布豐投針(Buffon's Needle) - 僅靠投針就能求出圓周率的機率論經典

布豐投針(Buffon's Needle) - 僅靠投針就能求出圓周率的機率論經典

僅靠將針投到地板上就能求出圓周率π?本文詳細解說了18世紀提出的令人驚嘆的機率論經典問題「布豐投針」,涵蓋從數學證明到模擬的全過程。

什麼是布豐投針?

數學世界中存在著許多違反直覺的驚人事實,以及將看似毫不相關的現象巧妙聯繫在一起的美麗定理。其中最為著名且迷人的問題之一就是 「布豐投針」(Buffon’s needle problem)。

這個問題由18世紀法國博物學家兼數學家喬治-路易·勒克萊爾·布豐伯爵(Georges-Louis Leclerc, Comte de Buffon)於1733年提出,並於1777年首次被解決。

令人驚嘆的是,這個問題表明,透過「將針隨機投到地板上」這一極其物理化且隨機的行為,就可以求出數學中最重要的常數之一—— 圓周率 $\pi$。它被認為是幾何機率論(Geometric probability)中最早的問題之一,也是蒙地卡羅方法(Monte Carlo method)的先驅性發現。

本文將從 布豐投針 的問題設定出發,詳細且淺顯地解說其數學證明,以及使用現代電腦進行模擬來估算圓周率的方法。

問題的基本設定

布豐投針的問題設定非常簡單。

  1. 在平坦的地板上,以等間距 $d$ 畫有大量平行直線。
  2. 準備一根長度為 $l$ 的針。
  3. 將這根針隨機地投向地板。

布豐提出的問題是:「所投的針與地板上畫的任一平行線相交的機率是多少?」

下面的圖表展示了這個實驗的概念流程。

  graph TD
    A["隨機投針"] -->|"重力和空氣阻力"| B["落在地板上"]
    B --> C{"是否與線相交?"}
    C -->|"是"| D["計入交叉次數 (+1)"]
    C -->|"否"| E["未交叉"]
    D --> F["計算機率 P"]
    E --> F
    F -->|"P = 2l / (πd)"| G["反推圓周率 π"]

在這裡,為了簡化問題,我們考慮針的長度 $l$ 小於或等於平行線間距 $d$($l \le d$)的 短針 情況。在此條件下,針不可能同時與兩條以上的直線相交。

數學建模與機率推導

要從數學上解決這個問題,需要對針的狀態進行數值化(參數化)。我們假設針落到地板上時,其位置和方向是完全隨機的。

為了確定針的位置,我們定義以下兩個變數。

  1. $x$:針的中心到最近的平行線的垂直距離。
  2. $\theta$:針與平行線所成的銳角(或直角)。

變數的取值範圍

首先,讓我們思考每個變數可以取哪些值。

  • 距離 $x$: 針的中心落在相鄰兩條平行線之間的某個位置。由於考慮的是到最近線的距離,$x$ 的最小值為 $0$(針的中心在線上時),最大值為 $\frac{d}{2}$(針的中心恰好在兩條線的中間位置時)。即 $0 \le x \le \frac{d}{2}$。由於針是隨機投下的,$x$ 在此範圍內服從 均勻分佈。機率密度函數為 $\frac{2}{d}$。
  • 角度 $\theta$: 針與平行線所成的角度,從針與直線平行時的 $0$ 到垂直時的 $\frac{\pi}{2}$(90度)。由於對稱性,無需考慮更大的角度。因此,$0 \le \theta \le \frac{\pi}{2}$。針的朝向也是隨機的,所以 $\theta$ 在此範圍內也服從 均勻分佈。機率密度函數為 $\frac{2}{\pi}$。

由於變數 $x$ 和 $\theta$ 相互獨立,取特定組合 $(x, \theta)$ 的聯合機率密度函數 $f(x, \theta)$ 可以表示為各自機率密度函數的乘積。

$$ f(x, \theta) = \frac{2}{d} \times \frac{2}{\pi} = \frac{4}{d\pi} $$

相交條件

接下來,考慮針與直線相交的條件。 當針的中心到端點的垂直方向長度大於或等於到最近線的距離 $x$ 時,針與直線相交。

由於針的長度為 $l$,從中心到端點的長度為 $\frac{l}{2}$。 當角度為 $\theta$ 時,這半根針在垂直方向上佔據的距離(投影長度)為 $\frac{l}{2} \sin \theta$。

因此,針與直線相交的條件可用以下不等式表示。

$$ x \le \frac{l}{2} \sin \theta $$

機率的計算

針與線相交的機率 $P$ 透過在滿足相交條件的區域上對聯合機率密度函數 $f(x, \theta)$ 進行積分來求得。

$$ P = \iint_{\text{相交區域}} f(x, \theta) \, dx \, d\theta $$

具體的積分範圍是:$\theta$ 從 $0$ 變化到 $\frac{\pi}{2}$,$x$ 從 $0$ 變化到交叉臨界值 $\frac{l}{2} \sin \theta$。

$$ P = \int_{0}^{\frac{\pi}{2}} \int_{0}^{\frac{l}{2} \sin \theta} \frac{4}{d\pi} \, dx \, d\theta $$

首先,計算關於 $x$ 的內層積分。

$$ \int_{0}^{\frac{l}{2} \sin \theta} \frac{4}{d\pi} \, dx = \frac{4}{d\pi} \left[ x \right]_{0}^{\frac{l}{2} \sin \theta} = \frac{4}{d\pi} \left( \frac{l}{2} \sin \theta - 0 \right) = \frac{2l}{d\pi} \sin \theta $$

然後,計算關於 $\theta$ 的外層積分。

$$ P = \int_{0}^{\frac{\pi}{2}} \frac{2l}{d\pi} \sin \theta \, d\theta = \frac{2l}{d\pi} \int_{0}^{\frac{\pi}{2}} \sin \theta \, d\theta $$

由於 $\sin \theta$ 的積分為 $-\cos \theta$,

$$ \int_{0}^{\frac{\pi}{2}} \sin \theta \, d\theta = \left[ -\cos \theta \right]_{0}^{\frac{\pi}{2}} = (-\cos \frac{\pi}{2}) - (-\cos 0) = -0 - (-1) = 1 $$

因此,所求機率 $P$ 為:

$$ P = \frac{2l}{d\pi} \times 1 = \frac{2l}{\pi d} $$

這就是 布豐投針 的基本公式。針與線相交的機率等於針長 $l$ 的2倍除以圓周率 $\pi$ 與線間距 $d$ 的乘積。

圓周率 π 的估算(蒙地卡羅方法)

推導出的公式 $P = \frac{2l}{\pi d}$ 中巧妙地包含了 $\pi$。將其關於 $\pi$ 求解,可得:

$$ \pi = \frac{2l}{P d} $$

這個等式意味著,只要知道機率 $P$,就可以計算圓周率 $\pi$。當然,真實機率 $P$ 需要進行無限次試驗才能得到,但透過在實際實驗中多次投針,可以獲得 $P$ 的近似值。

設投針總次數為 $N$,其中針與線相交的次數為 $C$。 當試驗次數 $N$ 足夠大時,根據大數法則,經驗機率 $\frac{C}{N}$ 會趨近於理論機率 $P$。

$$ P \approx \frac{C}{N} $$

將其代入之前的公式,即可得到圓周率 $\pi$ 的近似公式。

$$ \pi \approx \frac{2l \cdot N}{C \cdot d} $$

當針的長度 $l$ 與線的間距 $d$ 相等($l = d$)時,計算最為簡單。此時公式進一步簡化為:

$$ \pi \approx \frac{2N}{C} $$

也就是說,只需將投針次數的2倍除以交叉次數,就能求出圓周率!

Python 模擬

用手投針數千次是一項非常辛苦的工作(歷史上確實有數學家進行過數千次這樣的實驗)。在現代,我們可以輕鬆地用電腦來模擬這個實驗。

以下是使用 Python 模擬布豐投針實驗並估算圓周率的簡單程式碼範例。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
import random
import math

def buffons_needle_simulation(num_trials, l, d):
    """
    模擬布豐投針並估算圓周率的函數

    :param num_trials: 投針次數
    :param l: 針的長度
    :param d: 平行線間距
    :return: 估算的圓周率
    """
    crosses = 0
    
    for _ in range(num_trials):
        # 隨機生成針中心到最近線的距離 x(0 到 d/2)
        x = random.uniform(0, d / 2.0)
        
        # 隨機生成針的角度 theta(0 到 pi/2)
        theta = random.uniform(0, math.pi / 2.0)
        
        # 檢查是否滿足相交條件
        if x <= (l / 2.0) * math.sin(theta):
            crosses += 1
            
    # 無交叉時的例外處理,避免錯誤
    if crosses == 0:
        return float('inf')
        
    # 估算圓周率
    estimated_pi = (2.0 * l * num_trials) / (d * crosses)
    return estimated_pi

# 參數設定
N = 1000000  # 試驗次數(100萬次)
needle_length = 1.0
line_distance = 1.0

# 執行模擬
estimated_pi = buffons_needle_simulation(N, needle_length, line_distance)

print(f"試驗次數:{N:,} 次")
print(f"估算的圓周率:{estimated_pi}")
print(f"實際的圓周率:{math.pi}")
print(f"誤差:        {abs(math.pi - estimated_pi)}")

執行這段程式碼後,大量虛擬的針將透過隨機數被投下,可以驗證能夠獲得非常高精度的 $3.1415...$ 即圓周率的近似值。這種使用隨機數求解機率問題近似解的方法被稱為 蒙地卡羅方法

總結

布豐投針乍看之下似乎只是一種物理上的偶然遊戲,但其背後存在著堅實的數學理論。隨機事件(機率)、幾何形狀(直線和線段)以及終極無理數 $\pi$ 在一個簡單公式中的融合,可以說是數學之美的完美體現。

此外,這個問題作為對現代科學技術不可或缺的蒙地卡羅方法的源頭,也具有重要的歷史意義。從複雜系統的模擬到難以解析求解的積分計算,布豐的思想至今仍以各種形式支撐著我們的世界。

不妨準備好紙筆和幾根牙籤,在家中親身體驗這段偉大數學歷史的一部分吧。

使用 Hugo 建立
主題 StackJimmy 設計