🎓 レベル:標準 | 重要度:A(必須)
📎 前提:モデル化の流れ(系・状態・入力・出力) | 関連:推定量の信頼区間
要点(BLUF)
- シミュレーションの信頼性は2つの問いで支えます。検証(Verification)=コードはモデルどおり動くか、妥当性確認(Validation)=モデルは現実を正しく写すか。
- 標語で言えば「Verification は 正しく作っているか、Validation は 正しいものを作っているか」。
- 最強の検証は既知の解析解との一致。指数分布の平均・分散をシミュレートし、理論値 0.5・0.25 と一致することを確かめます。
1. なぜ V&V が要るのか
シミュレーションは「乱数を振った結果」なので、出てきた数字が正しいのか、それともバグや誤ったモデルの産物なのかが一見わかりません。だから2段階で品質を保証します。
- 検証(Verification):実装が設計したモデルを忠実に再現しているか。コードのバグ、数値誤差、乱数の使い方の誤りを潰す。「方程式を正しく解いているか」。
- 妥当性確認(Validation):そのモデルが現実の系を十分に表しているか。仮定(分布・独立性・パラメータ)が妥当か。「正しい方程式を解いているか」。
flowchart LR
R["現実の系"] -->|"モデル化"| M["モデル"]
M -->|"実装"| C["シミュレーションコード"]
C -.->|"Verification:コードはモデルどおりか"| M
M -.->|"Validation:モデルは現実どおりか"| R
検証が通っても妥当性が低ければ「正確に間違った答え」が出ます。逆に妥当なモデルでも実装にバグがあれば信頼できません。両方が要ります。
2. 検証の代表的な手段
- 解析解との一致:理論値が分かっている縮小版を作り、シミュレーション結果がそれに収束するか確かめる(最強・最優先)。
- 退化ケース:パラメータを極端にした特殊ケース(到着率ゼロなら待ち時間ゼロ等)で挙動を確認。
- 保存則・不変量のチェック:人数や質量・確率の総和が保たれているか。
- 収束テスト:サンプル数を増やすと推定が安定し、誤差が で縮むか(収束率と誤差(√n則))。
- 次元・単位の整合:式の単位が合っているか。
3. 具体例:指数分布の平均・分散を理論値と照合する
指数分布 は平均 、分散 が分かっています。乱数生成器がこの分布を正しく出しているか(検証)を確かめます。
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 が、理論値 ・ と小数4桁まで一致。乱数生成と集計のパイプラインが意図どおり動いていることの検証になりました。実際のプロジェクトでは、本番モデルを組む前にこうした「答えの分かる縮小版」で配管を確かめるのが鉄則です。
4. 妥当性確認の難しさ
検証はコード内部の話なので、解析解さえあれば客観的にできます。一方、妥当性確認は現実データとの突き合わせが必要で、より難しい。
- 入力分布の仮定(本当に指数?独立?)が現実と合うか。
- モデルが省いた要因(休憩・優先客・故障)の影響が無視できるか。
- 出力を実測データと比較し、許容範囲に収まるか。
妥当性確認は「合格・不合格」の二値ではなく、目的に対して十分かの判断です。同じモデルでも目的が変われば妥当性の基準も変わります。
数式の直観的意味
理論値との一致を見るとき、シミュレーション値は標本平均なので必ず誤差を伴います。その誤差は中心極限定理により標準誤差 程度。、 なら標準誤差は約 で、小数4桁の一致は誤差の範囲内で当然です。検証では「ピッタリ一致するか」ではなく「標準誤差の範囲で一致するか」を見るのが正しい姿勢で、ここが信頼区間の発想につながります。
⚠️ よくある誤解・落とし穴
- 「検証=妥当性確認」ではない:別物です。コードが正しくてもモデルが現実とずれていれば「正確な誤答」になります。
- 「ピッタリ一致しないとバグ」ではない:シミュレーションには必ず統計誤差がある。標準誤差の範囲を超える食い違いだけを疑います。
- 「一度検証したら安心」ではない:コードやパラメータを変えたら再検証。退化ケースや保存則のテストを残しておくと回帰テストになります。
- 「乱数シードを変えると結果が変わる=バグ」ではない:シード違いで結果が揺れるのは正常。揺れの幅が標準誤差と整合していれば問題ありません。
対応シミュレーション参照
本文の指数分布検証コード(np.random.default_rng(123))。収束の速さの検証は収束率と誤差(√n則)へ。
関連ノート
- モデル化の流れ(系・状態・入力・出力)(前提・モデルを組む)
- 大数の法則と中心極限定理の役割(次のトピック・誤差の理論的裏付け)
- 推定量の信頼区間(「標準誤差の範囲で一致」を定量化)
- 収束率と誤差(√n則)(収束テストによる検証)
- 第1章 シミュレーションの基礎 目次
- シミュレーション・モンテカルロ法 全体目次