ビュフォンの針

提供: testwiki
ナビゲーションに移動 検索に移動

テンプレート:出典の明記 ビュフォンの針(ビュフォンのはり、テンプレート:Lang-en-short)は18世紀博物学者ジョルジュ=ルイ・ルクレール、コント・ド・ビュフォンが提起した数学上の問題である。

もし床に多数の平行線を引き、そこに針を落すならば、どれかの線と針が交差する確率はどのようになるかという問題である。

積分と幾何学を使ってこの問題は解け、またこの方法を使って、モンテカルロ法円周率の近似値を求められる。

解法

a は線と交差する場合、 b は交差しない場合

この問題を数学的に表現すると以下のようになる: 長さ l の針を、間隔 t で平行線が描かれた床に落としたときに、線と針が交差する確率はどれくらいか?

針の中心から近いほうの線までの距離を x とし、針と線がなす角の小さい方を θ とする。

0 から t/2 における x確率密度関数

{2t: 0xt20:elsewhere.

である。

また、0 から π/2 における θ の確率密度関数は

{2π: 0θπ20:elsewhere.

である。

2つの確率変数 xθ は独立なので、同時確率密度関数は積をとって

{4tπ: 0xt2, 0θπ20:elsewhere.

となる。

針と線が交差するのは

xl2sinθ.

のときである。

針の長さに応じて2つの場合に分けて考える。

場合分け1: 針が短い場合

tl の場合、針と線が交差する確率は

P=θ=0π2x=0(l/2)sinθ4tπdxdθ=2ltπ.

となる。

この式を用いてシミュレーションによって円周率の近似値を求めることができる(モンテカルロ法)。 針を n 回落としたときに針と線が h 回交差したとすると

hn2ltπ,

であったということなので π の値は

π2lnth.

で近似できる。

場合分け2: 針が長い場合

t<l の場合、針と線が交差する確率は

θ=0π2x=0m(θ)4tπdxdθ

となる。ここで m(θ)(l/2)sinθt/2 の最小値である。

上の積分を行うと t<l のとき、針と線が交差する確率は、

2ltπ2tπ{l2t2+tsin1(tl)}+1

または

2πcos1tl+2πlt{11(tl)2}.

となる。

2つ目の式において、1番目の項は針が常に少なくとも1つの線と交差するような角度で落ちる確率を表す。2番目の項は位置によっては交差しない可能性のある角度で落ちたときに針と線が交差する確率を表す。

ラザリニの実験

1901年にイタリア数学者マリオ・ラザリニはビュフォンの針の実験を行った。3408回針を投げて、よく知られた円周率の近似値 テンプレート:Sfrac を得た。この近似値と テンプレート:Π との差は 3 × 10テンプレート:Sup 以下である。印象的な結果ではあるが、以下の理由でフェアな実験でなかったとされている。

ラザリニは線の巾の テンプレート:Sfrac の長さの針を選んだがその場合、針が直線と交差する確率は テンプレート:Sfrac である。n 回落下させて x 回交差したことから求められる テンプレート:Π の値は

テンプレート:Πテンプレート:Sfrac · テンプレート:Sfrac

テンプレート:Πテンプレート:Sfrac に近いので(5桁以下の整数を使った分数の近似値でこれより近い分数はない)、nx は下式のように書かれる:

テンプレート:Sfrac = テンプレート:Sfrac · テンプレート:Sfrac

または

x = テンプレート:Sfracn

である。テンプレート:Π の近似値を求めるのであるが、テンプレート:Sfrac は正しい値に近いので、n を 213 の整数倍の数字を選ぶことによって、113 の整数倍の数になる結果を得れば実験は成功する。

213 回の実験で 113 が得られれば テンプレート:Π の小数点以下 6 桁の近似値が求まったことになり、そうでなければ実験を続ければよい。ラザリニは 3408 = 213 × 16 回の実験で、希望の近似値を得たことになった。

シミュレーションにおける依存の循環

この実験をコンピュータでシミュレーションして円周率の近似値を求める際に、0 から π/2までの一様分布を用いてθを決めてしまうと(求めようとしている値であるはずの)円周率の値への依存が発生してしまう。依存を回避するには、以下の擬似コードのように単位円の内側の点をランダムに選ぶことで円周率を使わずにsinθの値を求めればよい[1]

function simulation(l, t, n)
    h = 0
    for (iter = 0; iter < n; iter++)
        x = Uniform(0, t/2)
        repeat
            dx = Uniform(0, 1)
            dy = Uniform(0, 1)
            radius = sqrt(dx*dx + dy*dy)
        until radius <= 1
        if x <= (l/2) * (dy/radius)
            h = h + 1
    return 2*l*n / (t*h)

ここで Uniform(a, b) はaからbまでの一様乱数を表す。なお擬似コードでは簡単のため例外処理は省略している。

脚注

テンプレート:Reflist

関連項目