円周率の計算
ここでは古典的な例として、$\pi$(円周率)を推定してみます。
一辺が \(2\) の正方形を考えます。原点 \((0, 0)\) を中心に持ち、4つの頂点は \((1, 1), (1, -1), (-1, 1), (-1, -1)\) です。この正方形の面積は \(2\times 2 = 4\) です。次に、原点を中心とし半径 \(1\) の円がこの正方形にぴったり内接しているとします。この円の面積は \(\pi \times \text{radius}^2 = \pi\) になります。
\(\pi\) を推定するには、この正方形内に一様に点をランダムサンプリングし、円の内側に入った点の割合($x^2 + y^2 <= 1$)を求めます。円の面積はこの割合の \(4\) 倍なので、これが \(\pi\) の推定値になります。
この演習を通して、シミュレーションで計算を行う方法の感覚がつかめます。
この演習はコースの一部です
Pythonで学ぶ統計シミュレーション
演習の手順
- コンソールで
np.piを使って \(\pi\) の真の値を確認し、simsを 10000、circle_pointsを 0 に初期化します。 forループ内で、np.random.uniform()を使って -1 から 1 の範囲でsize=2の点(x と y の座標)を生成します。- その点が単位円内にあるかを \(x^2 + y^2 <= 1\) で判定し、
within_circleに代入して、結果に応じてcircle_pointsを増やします。 - 円内に入った点の割合の 4 倍として、\(\pi\) の推定値
pi_simを出力します。
実践的なインタラクティブ演習
このサンプルコードを完成させて、この演習に挑戦してみましょう。
# Initialize sims and circle_points
sims, circle_points = ____, ____
for i in range(sims):
# Generate the two coordinates of a point
point = ____
# if the point lies within the unit circle, increment counter
within_circle = point[0]**2 + point[1]**2 <= 1
if ____ == True:
circle_points +=1
# Estimate pi as 4 times the avg number of points in the circle.
pi_sim = ____
print("Simulated value of pi = {}".format(pi_sim))