モンテカルロ法(円周率の近似_Python)

■モンテカルロ法の試し。
数学・アルゴリズム関連のテーマをChatGPTで聞いたらモンテカルロ法での円周率の近似が出てきた。少し調べると、一様分布の点をプロットして、それが円内に入っているか(下の式を満たすか)を判断して、入った数とプロット数から円周率を求めている。


モンテカルロ法のメインとなるコードが下。

import random
import math
import matplotlib.pyplot as plt

# 最大サンプル数と1ステップあたりの増分
(途中省略)

# 動的更新ループ
while total_count < N_MAX:
    for _ in range(STEP):
        x = random.uniform(-1, 1)
        y = random.uniform(-1, 1)
        total_count += 1

        if x * x + y * y <= 1.0:
            inside_x.append(x)
            inside_y.append(y)
            inside_count += 1
        else:
            outside_x.append(x)
            outside_y.append(y)

    pi_est = 4 * inside_count / total_count

    # データ更新
    sc_inside.set_offsets(list(zip(inside_x, inside_y)))
    sc_outside.set_offsets(list(zip(outside_x, outside_y)))

(以下省略)

実行結果が下。青の点が円の外にプロットされるもの、橙が円の内。プロットした点の数から近似値を計算して結果を表示。

この近似値がどのくらい近いか、グラフにしたものが次。
横軸が試行回数N、縦軸が近似値(近似値が青、真値3.141592...が赤の点線)。ここでは最終的に1億2000万のプロットを行っている。

数千万にしてもそこまで真値に収束する感じでないけど、誤差については、1桁精度を増やすために100倍の回数が必要とのこと。1億の試行で少数4桁程度の精度で正しいらしい。
これをReactとかでも作ってみて、プログラムの重さとか見てみたい。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です