Mímisbrunnr知恵の泉

← シミュレーション 一覧

🎓 レベル:標準 | 重要度:A(必須)

📎 前提:モデル化の流れ(系・状態・入力・出力) | 関連:推定量の信頼区間

要点(BLUF)

1. なぜ V&V が要るのか

シミュレーションは「乱数を振った結果」なので、出てきた数字が正しいのか、それともバグや誤ったモデルの産物なのかが一見わかりません。だから2段階で品質を保証します。

flowchart LR
    R["現実の系"] -->|"モデル化"| M["モデル"]
    M -->|"実装"| C["シミュレーションコード"]
    C -.->|"Verification:コードはモデルどおりか"| M
    M -.->|"Validation:モデルは現実どおりか"| R

検証が通っても妥当性が低ければ「正確に間違った答え」が出ます。逆に妥当なモデルでも実装にバグがあれば信頼できません。両方が要ります。

2. 検証の代表的な手段

3. 具体例:指数分布の平均・分散を理論値と照合する

指数分布 Exp(λ)\text{Exp}(\lambda) は平均 1/λ1/\lambda、分散 1/λ21/\lambda^2 が分かっています。乱数生成器がこの分布を正しく出しているか(検証)を確かめます。

import numpy as np

# 乱数シードを固定
rng = np.random.default_rng(123)

lam = 2.0                          # レート
x = rng.exponential(1/lam, 500_000)  # Exp(lam) を50万サンプル

print(f"シミュ平均 = {x.mean():.4f}   理論 1/lam   = {1/lam:.4f}")
print(f"シミュ分散 = {x.var():.4f}   理論 1/lam^2 = {1/lam**2:.4f}")

出力:

シミュ平均 = 0.5000   理論 1/lam   = 0.5000
シミュ分散 = 0.2500   理論 1/lam^2 = 0.2500

出力の意味:50万サンプルの平均 0.5000・分散 0.2500 が、理論値 1/λ=0.51/\lambda = 0.51/λ2=0.251/\lambda^2 = 0.25 と小数4桁まで一致。乱数生成と集計のパイプラインが意図どおり動いていることの検証になりました。実際のプロジェクトでは、本番モデルを組む前にこうした「答えの分かる縮小版」で配管を確かめるのが鉄則です。

4. 妥当性確認の難しさ

検証はコード内部の話なので、解析解さえあれば客観的にできます。一方、妥当性確認は現実データとの突き合わせが必要で、より難しい。

妥当性確認は「合格・不合格」の二値ではなく、目的に対して十分かの判断です。同じモデルでも目的が変われば妥当性の基準も変わります。

数式の直観的意味

理論値との一致を見るとき、シミュレーション値は標本平均なので必ず誤差を伴います。その誤差は中心極限定理により標準誤差 σ/n\sigma/\sqrt{n} 程度。n=5×105n = 5 \times 10^5σ=1/λ=0.5\sigma = 1/\lambda = 0.5 なら標準誤差は約 0.5/5×1050.00070.5/\sqrt{5\times10^5} \approx 0.0007 で、小数4桁の一致は誤差の範囲内で当然です。検証では「ピッタリ一致するか」ではなく「標準誤差の範囲で一致するか」を見るのが正しい姿勢で、ここが信頼区間の発想につながります。

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

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

本文の指数分布検証コード(np.random.default_rng(123))。収束の速さの検証は収束率と誤差(√n則)へ。

関連ノート