数値解析の基礎 — FEM・FVM・FDMの理論と精度
PDEと数値解法の全体像
CAEのすべての解析は、結局は偏微分方程式(PDE)を数値的に解く作業です。PDEをコンピュータで扱うには、連続体を有限個の点・セル・要素に離散化する必要があります。その手法として FDM・FEM・FVM の3つが主流です。
先生、FEMってよく聞くんですけど、OpenFOAMはFVMって聞きます。この2つは何が根本的に違うんですか? どっちがいいとかあるんですか?
哲学的な違いを一言で言うと、FEMは「試験関数を全体に張る」、FVMは「各セルでの保存則を直接守る」というアプローチの違いだ。FEMは複雑な境界形状や異方性材料が得意で構造解析の主流。FVMは質量・運動量・エネルギーの保存則が保証されるから流体解析(CFD)の主流になっている。「どっちがいい」ではなく「対象問題によって住み分けている」と考えるのが正確だよ。
1.1 PDEの分類
2階線形PDEは係数の性質によって3種類に分類されます:
| 型 | 典型的なPDE | 数学的特徴 | 代表的な物理現象 |
|---|---|---|---|
| 楕円型 | $\nabla^2 u = f$(ラプラス/ポアソン方程式) | 定常状態。すべての境界条件が影響 | 定常熱伝導、静電場、線形弾性(定常) |
| 放物型 | $\partial u/\partial t = \alpha \nabla^2 u$(拡散方程式) | 時間発展。初期値+境界値問題 | 非定常熱伝導、拡散、粘性流れ |
| 双曲型 | $\partial^2 u/\partial t^2 = c^2 \nabla^2 u$(波動方程式) | 有限伝播速度。特性線を持つ | 弾性波、音波、衝撃波 |
1.2 各手法の哲学的な違い
| 手法 | 離散化の考え方 | 保存則 | 主な適用分野 |
|---|---|---|---|
| FDM | 微分をテイラー展開で差分近似 | 保証されない(一般) | シンプルな領域・学術研究・DNS |
| FEM | 解を基底関数で近似し残差を最小化 | 弱形式で自然に満足 | 構造・熱・電磁気・マルチフィジクス |
| FVM | 各セルでの積分形保存則を直接離散化 | 局所的に厳密に満足 | 流体(CFD)・熱流体連成 |
有限差分法(FDM)
2.1 テイラー展開と差分近似
テイラー展開:
これから1階微分の近似を導出:
2階微分の2次精度中心差分:
「2次精度」ってどういう意味ですか? 差分のグリッドを細かくするとどれくらい誤差が減るんですか?
$p$ 次精度とは「格子幅 $h$ を半分にしたとき、誤差が $1/2^p$ になる」という意味だ。1次精度ならグリッドを半分にすると誤差も半分、2次精度ならグリッドを半分にすると誤差は1/4になる。中心差分が2次精度だから、同じ精度を1次精度で出そうとするとグリッド点が4倍必要になる。3次元問題なら 4³ = 64倍の計算量の差! だから高次精度スキームは計算効率の観点から非常に重要だ。
2.2 陽解法の安定性条件 — CFL条件とフォン・ノイマン安定性解析
1次元拡散方程式 $\partial u/\partial t = \alpha \partial^2 u/\partial x^2$ をFTCS(前進時間・中心空間)スキームで離散化:
フォン・ノイマン安定性解析:$u_i^n = G^n e^{ikx_i}$ を代入すると増幅因子 $G$:
安定条件 $|G| \leq 1$ より:
移流方程式 $\partial u/\partial t + c\partial u/\partial x = 0$ のCFL(Courant-Friedrichs-Lewy)条件:
物理的意味:1タイムステップで移流される距離が格子幅以下でなければならない。
2.3 高次差分スキームの一覧
| スキーム | 精度 | ステンシル(必要格子点) | 特徴 |
|---|---|---|---|
| 前進差分(1次) | O(h) | i, i+1 | シンプル・数値拡散大 |
| 中心差分(2次) | O(h²) | i-1, i, i+1 | 標準的・非有界条件に注意 |
| 4次中心差分 | O(h⁴) | i-2, i-1, i, i+1, i+2 | 高精度・DNS/LESで使用 |
| 1次風上差分 | O(h) | i-1, i(上流側) | 無条件安定・数値拡散あり |
| 3次風上差分(QUICK) | O(h³) | i-2, i-1, i, i+1 | CFDで広く使用 |
| WENO(5次) | O(h⁵) | 各方向5点 | 衝撃波まわりで非振動・高精度 |
有限要素法(FEM)の数学的基礎
3.1 重み付き残差法とガラーキン法
楕円型PDE の例:$-\nabla \cdot (k\nabla u) = f$ in $\Omega$、境界条件: $u = g$ on $\Gamma_D$。
強形式: $r(u) = -\nabla \cdot (k\nabla u) - f = 0$ がすべての点で成立。
重み付き残差法: 重み関数 $v$ に対して:
弱形式(グリーンの定理で部分積分):
ガラーキン法: 近似解と重み関数を同じ空間から選ぶ — $u \approx \sum_j u_j N_j(\mathbf{x})$, $v = N_i(\mathbf{x})$:
これが行列形式で $\mathbf{K}\mathbf{u} = \mathbf{f}$ となります。
3.2 形状関数の種類
代表的な形状関数:
- ラグランジュ補間基底: $N_i$ は節点 $j \neq i$ でゼロ、節点 $i$ で1。$C^0$ 連続性。構造・熱解析で標準的。
- ハーミート(Hermite)基底: 変位と勾配を節点値に持つ。$C^1$ 連続性。梁・板解析で使用。
- セレンディピティ要素: 辺中点節点を持つ高次ラグランジュ要素(8節点四辺形など)。
1次元ラグランジュ形状関数(2節点線形要素、$\xi \in [-1,1]$):
3節点2次要素($\xi \in [-1,1]$):
2次要素(Quadratic element)の方が1次要素より精度がいいのはわかるんですが、なんで2次要素でも使えない問題があるんですか?
2次要素が苦手なのは、要素が大変形で潰れるような問題だ。陽解法の衝突解析でメッシュが激しく変形すると、中間節点が要素の外に飛び出してヤコビアン行列が特異(行列式≒0)になって計算が止まる。それと、体積ロッキングという現象もある — 不圧縮性が強い材料(ゴム)や塑性では2次要素の完全積分が「体積一定を過拘束する」問題が起きる。これには低減積分や非適合モードを使う対処が必要だ。
3.3 アイソパラメトリック要素と数値積分
物理座標 $\mathbf{x}$ と参照座標 $\boldsymbol{\xi}$ の変換(アイソパラメトリック変換):
積分の変換:
ガウス・ルジャンドル求積($n_g$ 点):
$2n_g - 1$ 次多項式まで厳密に積分できます($n_g$ 点ガウス積分の精度)。
| 積分点数 $n_g$ | ガウス点 $\xi_i$ | 重み $w_i$ | 多項式精度 |
|---|---|---|---|
| 1 | 0 | 2 | 1次 |
| 2 | ±1/√3 ≈ ±0.5774 | 1, 1 | 3次 |
| 3 | 0, ±√(3/5) ≈ ±0.7746 | 8/9, 5/9 | 5次 |
| 4 | ±0.3399, ±0.8611 | 0.6521, 0.3479 | 7次 |
有限体積法(FVM)
4.1 保存則の積分形
一般的な保存方程式(移流-拡散)の積分形(各コントロールボリューム CV に適用):
$\phi$: 一般変数(密度・運動量・エネルギーなど)、$\Gamma$: 拡散係数、$S_\phi$: ソース項。
物理的意味:「CVに蓄積される量 = 流入する移流フラックス - 流出する移流フラックス + 拡散フラックス + 体積ソース」。
4.2 セルセンタ vs セルバーテックス
| 配置 | 特徴 | 使用ソルバー |
|---|---|---|
| セルセンタ(Cell-centred) | 変数をセル中心に定義。境界フラックスを補間で計算 | OpenFOAM, Ansys Fluent |
| セルバーテックス(Cell-vertex) | 変数を節点に定義。CVを節点周りに構築 | 一部のCFDソルバー、構造・流体混在 |
4.3 界面フラックスの補間スキーム
界面 $f$ でのスカラー値 $\phi_f$ を計算するスキーム比較:
$F_f = \mathbf{v}_f \cdot \mathbf{S}_f$ は界面フラックス。
高解像度スキーム(TVD: Total Variation Diminishing)では、フラックスリミッター $\psi(r)$ を用いて精度と有界性を両立します:
| リミッター名 | $\psi(r)$ の式 | 特徴 |
|---|---|---|
| minmod | $\max(0, \min(1,r))$ | 最も保守的。衝撃波まわりに適す |
| van Leer | $(r + |r|)/(1+|r|)$ | 滑らかな流れで高精度 |
| superbee | $\max(0,\min(2r,1),\min(r,2))$ | 最も積極的。過圧縮に注意 |
| limitedLinear | OpenFOAM デフォルト | 滑らかな流れで2次精度を保持 |
OpenFOAMの fvSchemes で「divSchemes」に「Gauss linearUpwind」とか「Gauss limitedLinear」って設定するアレですよね。実務でどれを選べばいいんでしょう?
最初は「Gauss limitedLinear 1」か「Gauss linearUpwind grad(U)」がバランスが良い。純粋な中心差分「Gauss linear」は精度が高いが、乱流解析では数値振動が起きやすい。初期解が収束しないときは一時的に「Gauss upwind」(1次風上)にして荒い解を作り、そこから高次スキームに切り替える「2段階アプローチ」が実務の定石だ。高速な圧縮性流れ(衝撃波あり)ならweno等の高次有界スキームが必要になる。
線形連立方程式ソルバー
FEM/FVMで最終的に解くべき大規模疎行列方程式 $\mathbf{A}\mathbf{x} = \mathbf{b}$ のソルバーは、問題のサイズと性質によって選択します。
5.1 直接法
LU分解: $\mathbf{A} = \mathbf{L}\mathbf{U}$($\mathbf{L}$: 下三角、$\mathbf{U}$: 上三角)。前進/後退代入で解を求める。
コレスキー分解(対称正定値行列用): $\mathbf{A} = \mathbf{L}\mathbf{L}^T$。LU分解の約半分の計算量。構造解析の静解析でよく使用。
直接法のスケーリング(バンド行列、帯幅 $b$):
- メモリ: $O(n \cdot b)$
- 計算量: $O(n \cdot b^2)$
- 3次元問題では帯幅 $b \sim \sqrt{n}$ なので計算量 $O(n^2)$ — 大規模問題には反復法が必要
5.2 反復法 — 共役勾配法(CG法)
対称正定値行列 $\mathbf{A}$ に対するCG法のアルゴリズム:
初期値: x₀(通常 x₀ = 0)
残差: r₀ = b - Ax₀
探索方向: p₀ = r₀
for k = 0, 1, 2, ...
α_k = (r_k^T r_k) / (p_k^T A p_k) // ステップ幅
x_{k+1} = x_k + α_k p_k // 解の更新
r_{k+1} = r_k - α_k A p_k // 残差の更新
β_k = (r_{k+1}^T r_{k+1}) / (r_k^T r_k)
p_{k+1} = r_{k+1} + β_k p_k // 探索方向の更新
収束条件:$\|r_k\| / \|b\| < \varepsilon$(通常 $\varepsilon = 10^{-6}$ 〜 $10^{-8}$)
5.3 前処理(プリコンディショニング)
条件数 $\kappa(\mathbf{A})$ が大きい(悪条件の)行列は収束が遅い。前処理行列 $\mathbf{M} \approx \mathbf{A}$ を用いて、等価な系 $\mathbf{M}^{-1}\mathbf{A}\mathbf{x} = \mathbf{M}^{-1}\mathbf{b}$ を解きます。
| 前処理手法 | 計算コスト | 収束改善 | 用途 |
|---|---|---|---|
| 対角スケーリング(Jacobi) | 低 | 小 | 単純な問題・初期テスト |
| 不完全LU(ILU(0)) | 中 | 中〜大 | 汎用(OpenFOAMデフォルト) |
| ILU(k)(fill-in レベルk) | 中〜高 | 大 | より難しい問題 |
| 代数的マルチグリッド(AMG) | 高(初期) | 非常に大 | 大規模構造・流体解析 |
| 幾何的マルチグリッド(GMG) | 高(設計コスト) | 最大 | 構造化グリッドのCFD |
Ansysの解析が遅いとき、ソルバー設定でいろんなオプションがあって困ってます。PCG、SPARSE、JCGとか... どれを選べばいいんですか?
Ansys Mechanicalの場合、静解析ならまずSPARSE(直接法スパースソルバー)が一番確実だ。問題が小〜中規模(数十万自由度以下)ならこれで大体問題ない。PCGは前処理付き共役勾配法で、大規模問題・メモリ節約に向いている。JCGは不均質問題や非線形解析でSPARSEがメモリ不足になるときの選択肢だ。大規模並列ならDistributed SPARSEかAMGベースのPCGを使う。まず試してみてから変更する、が実務の流れだよ。
5.4 疎行列の格納形式
大規模疎行列を効率的に格納するデータ構造:
- CSR(Compressed Sparse Row): 行ごとに非ゼロ要素の列インデックスと値を格納。行演算(行列-ベクトル積)が高速。FEM・FVMで標準的。
- CSC(Compressed Sparse Column): 列ごとに格納。LU分解に向く。
- COO(Coordinate List): (行, 列, 値) のリスト。アセンブリが容易だが演算は遅い。
$n$ 節点・$nnz$ 非ゼロ要素のCSR行列のメモリ:$3 \times nnz + (n+1)$ 整数 + $nnz$ 浮動小数点数。
固有値ソルバー
6.1 べき乗法と逆反復法
べき乗法(Power method): 最大固有値を求める最もシンプルな手法:
収束率:$|\lambda_2/\lambda_1|$(2番目に大きい固有値と最大固有値の比)。固有値が密集していると収束が非常に遅い。
逆反復法(Inverse iteration): シフト $\mu$ 付き逆反復で指定固有値 $\lambda \approx \mu$ に最も近いモードを求める:
6.2 ランチョス法
大規模対称固有値問題で最も広く使われる手法。クリロフ部分空間 $\mathcal{K}_m(\mathbf{A}, \mathbf{v}_1) = \text{span}\{\mathbf{v}_1, \mathbf{A}\mathbf{v}_1, \ldots, \mathbf{A}^{m-1}\mathbf{v}_1\}$ に対して三重対角化を行います:
$\mathbf{T}_m$ は $m \times m$ 三重対角行列で、その固有値(ライツ値)が $\mathbf{A}$ の固有値の良い近似になります。$n = 10^6$ 自由度の系でも $m = 100 \sim 300$ 程度のランチョスベクトルで十分な精度が得られます。
6.3 サブスペース反復法とARPACK
実用的な大規模固有値ソルバーの多くはARPACK(Arnoldi PACKage)を基盤とし、非対称行列にも対応した Implicitly Restarted Arnoldi Method (IRAM) を実装しています。
ARPACK を利用した固有値ソルバーの例:
- SLEPc(OpenFOAM, FEniCS など)
- LAPACK/ScaLAPACK(小〜中規模)
- FEAST固有値ソルバー(特定帯域の固有値を高並列で計算)
数値精度・誤差管理
7.1 誤差の種類
| 誤差の種類 | 定義 | 原因 | 削減方法 |
|---|---|---|---|
| 丸め誤差(Round-off error) | 浮動小数点演算の精度限界 | IEEE 754 倍精度: $\varepsilon_\text{mach} \approx 2.2 \times 10^{-16}$ | 倍精度使用、数値的に安定なアルゴリズム選択 |
| 打切り誤差(Truncation error) | 差分・有限要素近似による誤差 | テイラー展開の打切り | 格子細化・高次要素 |
| 離散化誤差 | 離散近似が連続方程式を満足しない誤差 | 格子幅・時間刻みの有限性 | メッシュ収束確認 |
| モデル化誤差 | 物理モデルの近似(乱流モデルなど) | 現実の複雑さの簡略化 | より高度なモデルの採用・実験検証 |
7.2 リチャードソン外挿とGCI
メッシュ収束スタディで3つのメッシュ解を使って真解を推定するリチャードソン外挿(Richardson Extrapolation):
2つのメッシュ($h_1 < h_2$, 細化比 $r = h_2/h_1$)から:
グリッド収束指数(GCI: Grid Convergence Index): Roache(1994)が提案した標準的な誤差評価指標:
$e_{12} = (f_2 - f_1)/f_1$(相対誤差)、$F_s = 1.25$(安全係数、Roache推奨)。
GCI < 5% なら「十分な収束が達成されている」と判断するのが一般的な基準です。ASME V&V 20-2009 規格でも採用されています。
論文の査読で「GCIを計算していないからリジェクト」って言われたという話を聞きました。実務でもGCIって必要なんですか?
学術論文ではほぼ必須になっている。Journal of Fluids Engineering や International Journal for Numerical Methods in Engineering はGCIの提示を著者へのガイドラインで求めている。産業CAEでは自動車・航空機の認証解析(シミュレーション証拠として使う場合)にも ASME V&V やNASA GCI guideline の基準が要求される。「メッシュを2つ作って変化が5%以下だからOK」という従来のやり方は定性的すぎる。GCIは最低2時間の追加作業だが、解析の信頼性の証明として不可欠だ。
7.3 数値的な落とし穴と対策
| 問題 | 原因 | 対策 |
|---|---|---|
| 桁落ち | ほぼ等しい数の差(A-B で上位桁消滅) | 算術順序の変更、補助変数の導入 |
| 情報落ち | 大きな数と小さな数の和(丸め誤差の蓄積) | Kahan補償和アルゴリズム |
| 数値振動(リンギング) | 高次スキームが急激な変化(不連続)を通過 | リミッター・風上化・WENO |
| ゼロピボット(直接法) | 行列が特異または悪条件 | ピボット選択・前処理・境界条件確認 |
| 砂時計モード(Hourglass) | 低減積分要素の零エネルギーモード | Hourglass control(スタビライゼーション) |
最適解法の選択ガイド
8.1 問題タイプ別ソルバー選択チャート
| 問題タイプ | 典型的手法 | 代表的なソルバー/ライブラリ |
|---|---|---|
| 線形静解析(小規模 <50万DOF) | 直接法(コレスキー/LU) | PARDISO, MUMPS, SuperLU |
| 線形静解析(大規模 >50万DOF) | PCG + AMG | BoomerAMG, AMGCL, ML/MueLu |
| 固有値解析(少数モード) | ランチョス/サブスペース反復 | ARPACK, SLEPc, FEAST |
| 固有値解析(多数モード) | 分散計算+ランチョス | ScaLAPACK, SLEPc |
| 非線形静解析 | NR + 直接法(内部) | ソルバー内蔵(Abaqus, Marc) |
| 非定常陽解法 | 中心差分+集中質量 | LS-DYNA, Abaqus/Explicit |
| CFD 非圧縮 | SIMPLE/PISO + PCG/GAMG | OpenFOAM, Fluent |
| CFD 圧縮性 | 高次FVM + Runge-Kutta + AMG | OpenFOAM rhoCentralFoam, SU2 |
8.2 並列計算スケーラビリティ
アムダールの法則: 並列化できる割合 $p$ のとき、$N$ プロセッサでの理論最大速度向上比:
$p = 0.95$(95%並列化可能)でも $N \to \infty$ の理論限界は $1/(1-0.95) = 20$ 倍。
大規模FEM/FVM並列計算での注意点:
- 領域分割(Domain Decomposition): MeTIS, SCOTCH などでグラフ分割。ハロー交換通信コストを最小化する。
- AMGの並列化: 粗化段階でプロセス間通信が必要。スケーラビリティに限界がある。
- 実効並列効率: 実務では50〜70%程度。通信が支配するとそれ以下になる。
関連インタラクティブツール
理論を手を動かして確認しよう
- メッシュ収束・GCI計算ツール — 3つのメッシュ解からリチャードソン外挿とGCIを自動計算
- 数値微分打切り誤差ツール — 差分精度次数の違いを格子幅ごとに可視化
- 1次元熱拡散シミュレーター — FDMの陽解法FTCSでCFL条件の影響を体験
- 不確かさ伝播ツール — 入力変数の分布から出力のモンテカルロ分布を計算
なった
詳しく
報告