Mímisbrunnr知恵の泉

← シミュレーション 一覧

🎓 レベル:基礎 | 重要度:A(必須)

📎 関連:大数の法則と中心極限定理の役割 | モンテカルロ積分の原理

要点(BLUF)

1. シミュレーションとは何か

シミュレーションとは、対象の系(system)を計算機の中のモデルとして表現し、それを動かして観測することです。実物で実験できない・高コスト・危険・時間がかかる——そんなときに、モデルを走らせて「もし〜だったらどうなるか」を調べます。

シミュレーションは大きく2種類に分かれます。

本テキストが扱うモンテカルロ法は後者です。「乱数を振って、その結果を集計することで、確率・期待値・積分などを数値的に近似する」——これがモンテカルロの中核です。

2. なぜ乱数で計算できるのか

一見すると「乱数を使ったら答えがブレるだけでは?」と思えます。ところが、たくさんの乱数の平均を取ると、真の値に収束する——これが大数の法則の保証です。さらに、その収束の速さ(誤差の大きさ)は中心極限定理1/n1/\sqrt{n} と教えてくれます。

つまりモンテカルロ法は、**「求めたい量を、ある確率変数の期待値として表現し、その期待値を標本平均で近似する」**という戦略です。詳しい原理はモンテカルロ積分の原理で扱います。

3. 具体例:円周率を乱数で推定する

直観をつかむ定番例です。1×11 \times 1 の正方形の中に一様乱数で点をばらまき、原点中心の半径1の四分円(面積 π/4\pi/4)に入った割合を数えます。割合は四分円の面積比に近づくので、4倍すれば π\pi の推定になります。

π^=4×(四分円内の点の数)(全点数)\hat{\pi} = 4 \times \frac{(\text{四分円内の点の数})}{(\text{全点数})}
import numpy as np

# 乱数シードを固定して再現性を確保する
rng = np.random.default_rng(42)

n = 1_000_000                       # ばらまく点の数
points = rng.random((n, 2))         # [0,1)x[0,1) の一様乱数点
inside = (points[:, 0]**2 + points[:, 1]**2) <= 1.0  # 四分円の内側か
pi_est = 4 * inside.mean()          # 内側の割合 x 4

print(f"モンテカルロによるpi推定 (n={n}) = {pi_est:.5f}")
print(f"真のpiとの絶対誤差             = {abs(pi_est - np.pi):.5f}")

出力:

モンテカルロによるpi推定 (n=1000000) = 3.14298
真のpiとの絶対誤差             = 0.00139

出力の意味:100万点で π=3.14159\pi = 3.14159\ldots3.143 と推定でき、誤差は約 0.0014。点を増やせばさらに精度が上がりますが、誤差は点数 nn に対して 1/n1/\sqrt{n} でしか縮まないので、桁を1つ改善するには点を100倍にする必要があります(収束率と誤差(√n則))。これがモンテカルロの「遅いが、次元に強い」という性格の出発点です。

4. 他手法との関係

数式の直観的意味

π^=4Xˉ\hat{\pi} = 4\bar{X} で、XiX_i は「点 ii が四分円内なら1、外なら0」を取るベルヌーイ変数です。その期待値は E[Xi]=π/4E[X_i] = \pi/4(面積比)。標本平均 Xˉ\bar{X} は大数の法則で E[Xi]E[X_i] に収束するので、4Xˉπ4\bar{X} \to \pi。**「面積を、当たり判定の平均という期待値に翻訳した」**のがこの推定の本質で、モンテカルロ積分の最小例になっています。

⚠️ よくある誤解・落とし穴

対応シミュレーション参照

本文のコードがそのまま検証用シミュレーションです(np.random.default_rng(42) で再現可能)。

関連ノート