モンテカルロシミュレーション — CAE不確かさ定量化の基本手法
理論と物理
概要 — モンテカルロ法とは
先生、モンテカルロ法って乱数でシミュレーションを繰り返すんですか? 何回やればいいんですか?
いい質問だね。ざっくり言うと、入力パラメータの確率分布からランダムにサンプリングして、FEMやCFDの解析を何百回・何千回と繰り返し実行する手法だ。出力のばらつき(分布)を統計的に求めるのが目的だよ。
何千回も!? それって計算コストが大変じゃないですか?
そう、それがモンテカルロ法の最大の弱点でもある。ただし最大の強みは、入力変数が何次元になっても収束速度が変わらないことだ。感度解析だと変数が10個あれば指数関数的にコストが増えるけど、モンテカルロは10次元でも100次元でも同じペースで収束する。
次元に依存しない… それはすごいですね。具体的にどんなときに使うんですか?
例えば、自動車部品の材料強度のばらつき(変動係数CoV=5%程度)が疲労寿命にどう影響するかを評価するケース。ヤング率、降伏応力、板厚、荷重振幅など複数のパラメータが同時にばらつくとき、それらの「組み合わせ効果」が出力にどう伝播するかを調べるのがモンテカルロ法の得意領域だ。
モンテカルロシミュレーション(Monte Carlo Simulation, MCS)は、確率的な入力変数から決定論的なモデル(FEM、CFD等)を繰り返し実行し、出力の統計的特性(平均、分散、分布形状、信頼区間)を推定する手法である。名前の由来はカジノで有名なモナコのモンテカルロ地区で、乱数を用いた手法であることからこの名がついた。
基本原理と収束速度
収束速度ってどうやって決まるんですか? さっき「次元に依存しない」って言ってましたけど…
モンテカルロ法の核心は大数の法則と中心極限定理だ。$N$ 個のサンプル $\mathbf{X}_1, \mathbf{X}_2, \ldots, \mathbf{X}_N$ を入力分布から独立にサンプリングして、それぞれに対してモデル $Y = f(\mathbf{X})$ を評価する。すると標本平均は:
この標本平均の標準誤差(Standard Error)は次の式で表される:
あ、$\sqrt{N}$ で割るんですね! ということは、サンプル数を増やすほど誤差が小さくなるけど、ルートでしか効かないと…
その通り。これが有名な$1/\sqrt{N}$ 収束則だ。重要なのは:
- 誤差を半分にするにはサンプル数を4倍にする
- 誤差を1/10にするには100倍のサンプルが必要
- この収束速度は入力変数の次元数 $d$ に依存しない(curse of dimensionality に影響されない)
標本分散の推定量も同様に定義される:
信頼区間の推定
結果をレポートに書くとき、「平均はこれくらいです」だけじゃダメですよね? 信頼区間ってどう出すんですか?
中心極限定理のおかげで、$N$ が十分大きければ(実務では $N \geq 30$ 程度から)標本平均は正規分布に近似できる。だから95%信頼区間はこう書ける:
1.96ってのは正規分布の値ですね。具体的に、1000回やったらどれくらいの精度になるんですか?
相対的な推定精度(Relative Accuracy)を計算しよう。変動係数を $\text{CoV}_Y = \sigma_Y / \mu_Y$ とすると:
例えば出力の変動係数が $\text{CoV}_Y = 0.10$(10%)のとき:
- $N = 100$: $\text{RA} = 1.96 \times 0.10 / \sqrt{100} = 1.96\%$
- $N = 1{,}000$: $\text{RA} = 1.96 \times 0.10 / \sqrt{1000} \approx 0.62\%$
- $N = 10{,}000$: $\text{RA} \approx 0.20\%$
1,000回で95%信頼区間の幅が平均値の約6%($\text{CoV}_Y \approx 1.0$ のとき)というのが実務的な目安だ。
サンプル数の決め方
じゃあ実務では何回くらい回せばいいんですか? 100回でいいのか、10,000回必要なのか…
目的によって全然違う。ざっくりまとめるとこんな感じだ:
| 目的 | 必要サンプル数の目安 | 理由 |
|---|---|---|
| 平均値・標準偏差の推定 | 100〜1,000 | $1/\sqrt{N}$ 則で十分収束 |
| 95パーセンタイルの推定 | 1,000〜5,000 | 分布の裾を正確に捉えるため |
| 99.9パーセンタイル(稀事象) | 10,000〜100,000 | 裾の精度に多数のサンプルが必要 |
| 故障確率 $P_f = 10^{-k}$ の推定 | $\geq 10^{k+2}$ | CoV($\hat{P}_f$) < 10% に必要 |
故障確率が $10^{-6}$ だと $10^8$ 回!? そんなの回せないですよね…
だから稀事象の推定には純粋なモンテカルロ法ではなく、重点サンプリング(Importance Sampling)やサブセットシミュレーション(Subset Simulation)といった特殊な手法を使う。あるいはサロゲートモデルを挟んで計算コストを下げるんだ。
収束速度の理論的背景
- 大数の法則:$N \to \infty$ で標本平均 $\bar{Y}$ が真の期待値 $\mu_Y = E[Y]$ に確率収束する。これがモンテカルロ推定の一致性を保証する。
- 中心極限定理:$\sqrt{N}(\bar{Y} - \mu_Y) / \sigma_Y \to \mathcal{N}(0,1)$。有限分散さえあれば、元の分布形によらず標本平均は漸近的に正規分布に従う。信頼区間構成の理論的根拠。
- $1/\sqrt{N}$ 則の意味:誤差が $O(N^{-1/2})$ で減少する。格子ベースの数値積分(台形則など)の収束速度 $O(N^{-2/d})$ と比べると、低次元($d \leq 3$)では遅いが、高次元($d \geq 5$)ではモンテカルロの方が有利。
サンプリング手法と分散低減
純粋乱数サンプリング(Crude Monte Carlo)
さっきの式で使っていた「ランダムにサンプリング」って、ただ乱数を振ればいいんですか?
最もシンプルな方法はそうだ。各入力変数の確率分布から独立に擬似乱数を生成してサンプルを作る。これを純粋乱数サンプリング(Crude Monte Carlo / Simple Random Sampling)と呼ぶ。
でも乱数だから、偏りが出ることもありますよね? ある領域にサンプルが集中したり、空白地帯ができたり…
鋭いね。特にサンプル数が少ないとき($N < 100$ 程度)、純粋乱数だと入力空間のカバレッジにムラが出やすい。例えば2変数で100サンプルを振ると、分布域の隅に全然サンプルが行かないことがある。そこで登場するのがLHS(ラテン超方格サンプリング)だ。
ラテン超方格サンプリング(LHS)
LHSって名前は聞いたことあります。普通の乱数と何が違うんですか?
LHSのアイデアはシンプルだ。各入力変数の分布を $N$ 個の等確率の層(stratum)に分割して、各層から必ず1点ずつサンプルを取る。そして各変数間の組み合わせをランダムにシャッフルする。
ああ、なるほど! 各変数の分布を均等に「味見」するってことですね。数独みたいに、各行・各列に必ず1つずつ入る感じ?
そのイメージで合ってる。数学的には、各変数 $X_j$($j = 1, \ldots, d$)の累積分布関数 $F_j$ の値域 $[0, 1]$ を $N$ 等分して:
ここで $\pi_j$ は $\{1, 2, \ldots, N\}$ のランダム置換、$U_j^{(i)} \sim \text{Uniform}(0, 1)$ は層内の位置を乱数化する。
LHSのメリットをまとめると:
- 少ないサンプル数で入力空間を均一にカバーできる
- 各変数の周辺分布は正確に再現される
- 純粋乱数に比べて分散が小さくなる(ただし改善幅は問題依存)
- CAEの実務では、$N = 50\text{〜}200$ 程度のLHSで十分な精度を得られることが多い
| 比較項目 | 純粋乱数(SRS) | LHS |
|---|---|---|
| 空間カバレッジ | 偏りあり | 均一 |
| 周辺分布の再現 | $N \to \infty$ で保証 | 各層が保証 |
| 分散低減効果 | なし(基準) | 問題依存だが概ね有利 |
| 相関制御 | 困難 | 相関制御付きLHSで可能 |
| 追加サンプルの容易さ | 容易 | 再設計が必要 |
分散低減法(Variance Reduction Techniques)
LHS以外にも、少ないサンプル数で精度を上げる方法ってあるんですか?
「分散低減法」として知られる手法群があるよ。標準誤差 $\text{SE} = \sigma_Y / \sqrt{N}$ の $\sigma_Y$ を実効的に小さくするか、推定量を工夫して同じ $N$ でも精度を上げるんだ。
| 手法 | 原理 | 適用場面 |
|---|---|---|
| 対称変量法 (Antithetic Variates) | サンプル $\mathbf{U}$ と $1-\mathbf{U}$ のペアを使い負の相関を導入 | 単調な応答関数 |
| 制御変量法 (Control Variates) | 期待値既知の補助変数で推定量を補正 | 解析解の近似がある場合 |
| 重点サンプリング (Importance Sampling) | 注目領域に密にサンプリングし、尤度比で補正 | 稀事象・故障確率推定 |
| 層別サンプリング (Stratified Sampling) | 入力空間を層に分割し各層内でサンプリング | 不均一な応答関数 |
対称変量法ってすごくシンプルですね。追加コストほぼゼロで分散が減るんですか?
応答関数が入力に対して単調(例:材料強度が上がれば寿命も伸びる)なら効果が大きい。$\mathbf{U}$ で大きな出力が出たとき、$1-\mathbf{U}$ では小さくなるから、2つの平均を取ると分散が相殺される。ただし非単調な関数だと逆効果になることもあるから注意だ。
重点サンプリングの数学的定式化
故障確率 $P_f = P[g(\mathbf{X}) \leq 0]$ の推定を考える。元の密度関数 $f_{\mathbf{X}}$ のもとで:
$$P_f = \int I[g(\mathbf{x}) \leq 0] \, f_{\mathbf{X}}(\mathbf{x}) \, d\mathbf{x} = \int I[g(\mathbf{x}) \leq 0] \frac{f_{\mathbf{X}}(\mathbf{x})}{h(\mathbf{x})} h(\mathbf{x}) \, d\mathbf{x}$$提案分布 $h(\mathbf{x})$ からサンプリングし、尤度比 $w(\mathbf{x}) = f_{\mathbf{X}}(\mathbf{x}) / h(\mathbf{x})$ で重み付けする:
$$\hat{P}_f^{IS} = \frac{1}{N}\sum_{i=1}^{N} I[g(\mathbf{X}_i) \leq 0] \cdot w(\mathbf{X}_i), \quad \mathbf{X}_i \sim h$$最適な提案分布は故障領域に集中した分布であり、FORM/SORMの設計点近傍に正規分布を配置する方法が一般的である。
実践ガイド
実務フロー
実際にCAE解析でモンテカルロ法を回すとき、手順はどうなるんですか?
基本的な流れはこうだ:
- 不確かな入力パラメータの特定 — 材料特性、形状寸法、荷重条件など
- 各パラメータの確率分布を設定 — 正規分布、対数正規分布、一様分布など
- サンプリング計画の作成 — 純粋乱数 or LHS、サンプル数 $N$ の決定
- $N$ 回のCAE解析を実行 — バッチ処理 or 並列実行
- 結果の統計処理 — 平均、標準偏差、ヒストグラム、CDF、信頼区間の算出
- 収束チェック — 累積平均・累積標準偏差のプロットで安定性を確認
入力分布の設定
入力パラメータの確率分布って、どうやって決めるんですか? 適当に正規分布にしちゃっていいんですか?
それが一番悩ましいところで、「ゴミを入れればゴミが出る(Garbage In, Garbage Out)」が最もクリティカルに効くのが入力分布の設定だ。理想的にはメーカーの品質データや実験データからフィッティングするんだけど、実務では以下の目安を使うことが多い:
| パラメータ | 典型的な分布 | 変動係数(CoV)の目安 |
|---|---|---|
| ヤング率 | 正規分布 | 2〜5% |
| 降伏応力 | 対数正規分布 | 5〜10% |
| 板厚・寸法 | 正規分布 | 1〜3%(公差の1/6を$\sigma$と仮定) |
| 疲労強度 | 対数正規 or ワイブル | 10〜30% |
| 荷重振幅 | 対数正規 or ガンベル | 10〜20% |
| 温度条件 | 正規分布 or 一様分布 | ケース依存 |
降伏応力は対数正規なんですね。なぜ正規じゃないんですか?
強度は物理的に負の値を取れない。正規分布だと $\mu - 3\sigma$ あたりで負になる可能性があるけど、対数正規分布なら常に正の値しか生成しない。さらに強度データは右裾が長い(高い値の方に引っ張られる)傾向があるから、対数正規の方がフィットしやすいんだ。
収束判定の実際
「十分収束した」ってどうやって判断するんですか? 最初に $N$ を決めちゃうんですか?
2つのアプローチがある。1つ目は事前決定型で、目標精度から必要サンプル数を逆算する:
ここで $\epsilon$ は許容相対誤差。例えば95%信頼水準で平均値の相対誤差2%以内を要求し、$\text{CoV}_Y \approx 0.10$ と予想するなら:
2つ目は逐次型。解析を進めながら累積平均と累積標準偏差をモニタリングして、安定したら打ち切る。実務ではこんなチェックを行う:
- 累積平均のプロットが水平に安定しているか
- 直近50サンプルの追加で平均が1%以上変動しないか
- ブートストラップ法による信頼区間の幅が目標以下か
適用事例 — 材料ばらつきと疲労寿命
具体的な適用事例を教えてください! 最初に出てきた「材料強度のばらつきが疲労寿命に与える影響」ってどうやるんですか?
自動車のサスペンションアーム部品を例にしよう。決定論的な解析では「疲労寿命 $N_f = 2 \times 10^6$ サイクルで安全」と出たとする。でも実際の量産品には材料のばらつきがあるよね?
確かに。カタログ値は平均であって、実際の部品はもっと弱いかもしれない…
そこでモンテカルロ法だ。こういう手順でやる:
- 入力変数の設定:
- ヤング率 $E$: 正規分布、$\mu = 210$ GPa、CoV = 3%
- 降伏応力 $\sigma_y$: 対数正規分布、$\mu = 350$ MPa、CoV = 5%
- S-N曲線の疲労強度係数: 対数正規分布、CoV = 15%
- 板厚 $t$: 正規分布、$\mu = 4.0$ mm、CoV = 2%
- LHSで500サンプルを生成
- 各サンプルで線形静解析 → 応力 → S-Nカーブから疲労寿命を計算
- 結果:疲労寿命の分布が得られる
結果、平均寿命は $2.1 \times 10^6$ サイクルだけど、5パーセンタイル値(B5寿命)は $4.5 \times 10^5$ サイクルしかない——つまり20個に1個は設計寿命の1/4以下で壊れる可能性がある、ということが分かる。決定論的解析だけでは見えないリスクだよね。
うわ、平均値だけ見てると全然安全に見えるのに… モンテカルロ法で「ばらつきの影響」を見るのは本当に大事なんですね。
ソフトウェア比較
商用ツールのMC機能
モンテカルロ法をCAEで使うとき、どのソフトを使えばいいんですか? 自分でスクリプトを書くんですか?
主要なCAEプラットフォームにはUQ(不確かさ定量化)モジュールが組み込まれている。自分でPythonスクリプトを書く方法もあるし、GUI上で設定する方法もある。
| ツール | UQモジュール名 | MC/LHS対応 | 特記事項 |
|---|---|---|---|
| Ansys Workbench | Design Exploration (Six Sigma Analysis) | MC + LHS | Parametric Design Language (APDL) ベースの自動化も可 |
| Abaqus/Isight | Isight (Dassault SIMULIA) | MC + LHS + 最適化 | データフロー型の実行エンジン |
| Simcenter 3D | Monte Carlo Simulation | MC + LHS | Teamcenter連携でデータ管理 |
| COMSOL | Uncertainty Quantification Module | MC + LHS + PCE | 多物理場連成に強い |
| OptiSLang (Dynardo) | 組込み (Ansysファミリ) | MC + LHS + MOP | 感度解析・最適化との統合が充実 |
| LS-OPT | LSダイナ用UQモジュール | MC + LHS + メタモデル | 衝突・成形解析のばらつき評価 |
オープンソースの選択肢
商用ツールは高いです… オープンソースでできませんか?
実は最も柔軟で強力なのはオープンソースの組み合わせだったりする:
- Dakota (Sandia National Labs) — UQの世界標準。MC、LHS、PCE、感度解析、最適化を統合。FEM/CFDソルバーとのインターフェースが豊富
- OpenTURNS — フランスEDF/Airbus/Phimecaが開発。Pythonライブラリ。分布フィッティング、相関モデリング、信頼性解析に強い
- UQLab (ETH Zurich) — MATLAB/Python。最新のUQ手法(PCE、Kriging、サブセットシミュレーション)を高品質に実装
- SALib (Python) — 感度解析に特化。Sobolインデックス、Morris法との組み合わせ
Dakotaは名前をよく聞きます。OpenFOAMやCalculiXと組み合わせて使えるんですか?
使える。Dakotaは「ブラックボックス」インターフェースで、入力ファイルのテンプレートにパラメータを埋め込み、ソルバーを外部コマンドとして呼び出し、結果ファイルから出力を読み取る。OpenFOAM、CalculiX、Code_Aster、なんでもOKだ。
先端技術
サロゲートモデルとの併用
1回のFEM解析に30分かかる場合、1,000回やると500時間… 実務的に無理では?
そこでサロゲートモデル(代理モデル)を使う。少数の高精度シミュレーション(数十〜数百点)で応答曲面を構築し、モンテカルロサンプリングはその軽い代理モデルに対して行う。
| サロゲートモデル | 学習に必要な点数 | 特徴 |
|---|---|---|
| 多項式カオス展開(PCE) | $O((d+p)! / (d! \cdot p!))$ | 統計モーメントを解析的に算出可能 |
| ガウス過程回帰(Kriging) | $10d$〜$50d$ | 予測の不確かさも同時に推定 |
| ニューラルネットワーク | $100d$〜 | 高次元・非線形に強いが解釈性が低い |
| RBF(放射基底関数) | $10d$〜$30d$ | 実装が簡単、高次元では精度低下 |
PCEで「統計モーメントを解析的に算出」ってどういうことですか?
PCEは応答を直交多項式で展開する。例えば入力が正規分布ならエルミート多項式を使う:
直交性のおかげで、平均と分散は係数から直接計算できる:$\mu_Y = c_{\mathbf{0}}$、$\sigma_Y^2 = \sum_{\boldsymbol{\alpha} \neq \mathbf{0}} c_{\boldsymbol{\alpha}}^2$。モンテカルロサンプリングすら不要になるんだ。ただし変数が多い($d > 10$)と係数の数が爆発するから、スパースPCEや適応的手法を使う。
大規模並列モンテカルロ
サロゲートを使わずに「力づく」で回す場合、HPCで並列化できますか?
モンテカルロ法は完全並列(Embarrassingly Parallel)だ。各サンプルは独立に計算できるから、1,000コアあれば1,000サンプルを同時に回せる。これは他のUQ手法(例:適応的PCE)にはない大きな利点だ。
クラウドHPC(AWS Batch、Azure CycleCloud、Google Cloud HPC)を使えば、必要なときだけ数千コアを確保して一気に回し、終わったら解放する「バースト計算」ができる。1回30分のFEMを1,000回、100並列で5時間——これなら実用的だよね。
トラブルシューティング
よくある失敗と対策
モンテカルロシミュレーションでハマりやすい落とし穴って何ですか?
現場でよく見るトラブルをまとめよう:
| 症状 | 原因 | 対策 |
|---|---|---|
| 一部のサンプルでFEMが収束しない | 極端な入力値の組み合わせ(分布の裾)で物理的に非現実的な状態 | 入力分布にトランケーション($\pm 3\sigma$ 等)を設定。失敗サンプルの処理方針を事前に決める |
| 結果の分布が明らかに非物理的 | 入力変数間の相関を無視している | 相関行列を設定。NatafまたはRosenblatt変換で相関を反映 |
| 累積平均がいつまでも収束しない | 出力分布が重い裾(Lognormal, Pareto等)を持つ | 分散低減法の適用。または出力の対数値で統計処理 |
| LHSなのに分散低減効果がない | 応答関数が非単調・非線形で、層別の効果が出にくい | 相関制御付きLHS(Iman-Conover法)の採用 |
| 再現性がない(毎回結果が異なる) | 乱数シード固定忘れ | 擬似乱数のシードを固定して再現性を確保。報告書にシード値を記録 |
「一部のサンプルでFEMが収束しない」ってのは厄介ですね。1,000回中5回失敗したら、その5個はどうするんですか?
選択肢は3つある:
- 除外して $N_{\text{valid}}$ で統計処理 — 最も簡単だが、失敗がランダムでない場合(常に高応力側で失敗)はバイアスがかかる
- 失敗サンプルに「最悪値」を割り当てる — 保守的な推定になるが、安全側の判断としては妥当
- 失敗の原因を調べてメッシュや接触設定を改善し、再実行 — 最も正確だが手間がかかる
実務的には、失敗率が1%未満なら方法1で問題ない。5%を超えるならモデルの頑健性自体を見直した方がいい。
乱数シードの件、初歩的だけどめちゃくちゃ大事ですね。報告書に「シード: 42」って書いておくだけで再現できるようになるんだ。
その通り。モンテカルロ法は「統計的手法」だから、再現性の確保は科学的信頼性の基盤だ。シード値、サンプリング手法、サンプル数、入力分布のパラメータ——これらを全て記録しておくことが、V&V(検証と妥当性確認)の第一歩なんだよ。
なった
詳しく
報告