数値解析の基礎 — FEM・FVM・FDMの理論と精度

カテゴリ: 基礎理論 | 2026-03-25 | NovaSolver Contributors
CAE visualization for numerical methods - technical simulation diagram
Numerical Methods

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 テイラー展開と差分近似

テイラー展開:

$$u(x + h) = u(x) + h u'(x) + \frac{h^2}{2}u''(x) + \frac{h^3}{6}u'''(x) + \cdots$$

これから1階微分の近似を導出:

$$u'(x) \approx \frac{u(x+h) - u(x)}{h} - \frac{h}{2}u''(\xi) \quad \text{(前進差分、1次精度)}$$
$$u'(x) \approx \frac{u(x) - u(x-h)}{h} + \frac{h}{2}u''(\xi) \quad \text{(後退差分、1次精度)}$$
$$u'(x) \approx \frac{u(x+h) - u(x-h)}{2h} - \frac{h^2}{6}u'''(\xi) \quad \text{(中心差分、2次精度)}$$

2階微分の2次精度中心差分:

$$u''(x) \approx \frac{u(x+h) - 2u(x) + u(x-h)}{h^2} - \frac{h^2}{12}u^{(4)}(\xi)$$
🧑‍🎓

「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(前進時間・中心空間)スキームで離散化:

$$\frac{u_i^{n+1} - u_i^n}{\Delta t} = \alpha \frac{u_{i+1}^n - 2u_i^n + u_{i-1}^n}{\Delta x^2}$$

フォン・ノイマン安定性解析:$u_i^n = G^n e^{ikx_i}$ を代入すると増幅因子 $G$:

$$G = 1 - 4r\sin^2\left(\frac{k\Delta x}{2}\right), \quad r = \frac{\alpha\Delta t}{\Delta x^2}$$

安定条件 $|G| \leq 1$ より:

$$r = \frac{\alpha\Delta t}{\Delta x^2} \leq \frac{1}{2} \quad \text{(1次元拡散の安定条件)}$$

移流方程式 $\partial u/\partial t + c\partial u/\partial x = 0$ のCFL(Courant-Friedrichs-Lewy)条件

$$\text{CFL} = \frac{c\Delta t}{\Delta x} \leq 1$$

物理的意味: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+1CFDで広く使用
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$ に対して:

$$\int_\Omega v \cdot r(u) \, d\Omega = 0$$

弱形式(グリーンの定理で部分積分):

$$\int_\Omega k \nabla v \cdot \nabla u \, d\Omega = \int_\Omega v f \, d\Omega + \int_{\Gamma_N} v \, q_n \, d\Gamma$$

ガラーキン法: 近似解と重み関数を同じ空間から選ぶ — $u \approx \sum_j u_j N_j(\mathbf{x})$, $v = N_i(\mathbf{x})$:

$$\sum_j \left[\int_\Omega k \nabla N_i \cdot \nabla N_j \, d\Omega\right] u_j = \int_\Omega N_i f \, d\Omega + \int_{\Gamma_N} N_i q_n \, d\Gamma$$

これが行列形式で $\mathbf{K}\mathbf{u} = \mathbf{f}$ となります。

3.2 形状関数の種類

代表的な形状関数:

1次元ラグランジュ形状関数(2節点線形要素、$\xi \in [-1,1]$):

$$N_1(\xi) = \frac{1-\xi}{2}, \qquad N_2(\xi) = \frac{1+\xi}{2}$$

3節点2次要素($\xi \in [-1,1]$):

$$N_1(\xi) = \frac{\xi(\xi-1)}{2}, \quad N_2(\xi) = 1-\xi^2, \quad N_3(\xi) = \frac{\xi(\xi+1)}{2}$$
🧑‍🎓

2次要素(Quadratic element)の方が1次要素より精度がいいのはわかるんですが、なんで2次要素でも使えない問題があるんですか?

🎓

2次要素が苦手なのは、要素が大変形で潰れるような問題だ。陽解法の衝突解析でメッシュが激しく変形すると、中間節点が要素の外に飛び出してヤコビアン行列が特異(行列式≒0)になって計算が止まる。それと、体積ロッキングという現象もある — 不圧縮性が強い材料(ゴム)や塑性では2次要素の完全積分が「体積一定を過拘束する」問題が起きる。これには低減積分や非適合モードを使う対処が必要だ。

3.3 アイソパラメトリック要素と数値積分

物理座標 $\mathbf{x}$ と参照座標 $\boldsymbol{\xi}$ の変換(アイソパラメトリック変換):

$$\mathbf{x}(\boldsymbol{\xi}) = \sum_i N_i(\boldsymbol{\xi}) \mathbf{x}_i$$

積分の変換:

$$\int_{\Omega_e} f(\mathbf{x}) \, d\mathbf{x} = \int_{[-1,1]^d} f(\mathbf{x}(\boldsymbol{\xi})) |\mathbf{J}(\boldsymbol{\xi})| \, d\boldsymbol{\xi}$$

ガウス・ルジャンドル求積($n_g$ 点):

$$\int_{-1}^{1} g(\xi) \, d\xi \approx \sum_{i=1}^{n_g} w_i g(\xi_i)$$

$2n_g - 1$ 次多項式まで厳密に積分できます($n_g$ 点ガウス積分の精度)。

積分点数 $n_g$ガウス点 $\xi_i$重み $w_i$多項式精度
1021次
2±1/√3 ≈ ±0.57741, 13次
30, ±√(3/5) ≈ ±0.77468/9, 5/95次
4±0.3399, ±0.86110.6521, 0.34797次

有限体積法(FVM)

4.1 保存則の積分形

一般的な保存方程式(移流-拡散)の積分形(各コントロールボリューム CV に適用):

$$\frac{d}{dt}\int_\text{CV} \phi \, dV + \oint_\text{CS} \phi \mathbf{v} \cdot d\mathbf{S} = \oint_\text{CS} \Gamma \nabla\phi \cdot d\mathbf{S} + \int_\text{CV} S_\phi \, dV$$

$\phi$: 一般変数(密度・運動量・エネルギーなど)、$\Gamma$: 拡散係数、$S_\phi$: ソース項。

物理的意味:「CVに蓄積される量 = 流入する移流フラックス - 流出する移流フラックス + 拡散フラックス + 体積ソース」。

4.2 セルセンタ vs セルバーテックス

配置特徴使用ソルバー
セルセンタ(Cell-centred)変数をセル中心に定義。境界フラックスを補間で計算OpenFOAM, Ansys Fluent
セルバーテックス(Cell-vertex)変数を節点に定義。CVを節点周りに構築一部のCFDソルバー、構造・流体混在

4.3 界面フラックスの補間スキーム

界面 $f$ でのスカラー値 $\phi_f$ を計算するスキーム比較:

$$\phi_f^\text{CD} = \frac{\phi_P + \phi_E}{2} \quad \text{(中心差分、2次精度、非有界)}$$
$$\phi_f^\text{UD} = \begin{cases} \phi_P & (F_f > 0) \\ \phi_E & (F_f < 0) \end{cases} \quad \text{(1次風上差分、無条件有界、数値拡散大)}$$

$F_f = \mathbf{v}_f \cdot \mathbf{S}_f$ は界面フラックス。

高解像度スキーム(TVD: Total Variation Diminishing)では、フラックスリミッター $\psi(r)$ を用いて精度と有界性を両立します:

$$\phi_f^\text{TVD} = \phi_f^\text{UD} + \psi(r)\left(\phi_f^\text{CD} - \phi_f^\text{UD}\right)$$
リミッター名$\psi(r)$ の式特徴
minmod$\max(0, \min(1,r))$最も保守的。衝撃波まわりに適す
van Leer$(r + |r|)/(1+|r|)$滑らかな流れで高精度
superbee$\max(0,\min(2r,1),\min(r,2))$最も積極的。過圧縮に注意
limitedLinearOpenFOAM デフォルト滑らかな流れで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$):

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 疎行列の格納形式

大規模疎行列を効率的に格納するデータ構造:

$n$ 節点・$nnz$ 非ゼロ要素のCSR行列のメモリ:$3 \times nnz + (n+1)$ 整数 + $nnz$ 浮動小数点数。

固有値ソルバー

6.1 べき乗法と逆反復法

べき乗法(Power method): 最大固有値を求める最もシンプルな手法:

$$\mathbf{v}^{(k+1)} = \frac{\mathbf{A}\mathbf{v}^{(k)}}{\|\mathbf{A}\mathbf{v}^{(k)}\|}$$

収束率:$|\lambda_2/\lambda_1|$(2番目に大きい固有値と最大固有値の比)。固有値が密集していると収束が非常に遅い。

逆反復法(Inverse iteration): シフト $\mu$ 付き逆反復で指定固有値 $\lambda \approx \mu$ に最も近いモードを求める:

$$\mathbf{v}^{(k+1)} = \frac{(\mathbf{A} - \mu\mathbf{I})^{-1}\mathbf{v}^{(k)}}{\|(\mathbf{A} - \mu\mathbf{I})^{-1}\mathbf{v}^{(k)}\|}$$

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{A}\mathbf{V}_m = \mathbf{V}_m \mathbf{T}_m + \beta_{m+1}\mathbf{v}_{m+1}\mathbf{e}_m^T$$

$\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 を利用した固有値ソルバーの例:

数値精度・誤差管理

7.1 誤差の種類

誤差の種類定義原因削減方法
丸め誤差(Round-off error)浮動小数点演算の精度限界IEEE 754 倍精度: $\varepsilon_\text{mach} \approx 2.2 \times 10^{-16}$倍精度使用、数値的に安定なアルゴリズム選択
打切り誤差(Truncation error)差分・有限要素近似による誤差テイラー展開の打切り格子細化・高次要素
離散化誤差離散近似が連続方程式を満足しない誤差格子幅・時間刻みの有限性メッシュ収束確認
モデル化誤差物理モデルの近似(乱流モデルなど)現実の複雑さの簡略化より高度なモデルの採用・実験検証

7.2 リチャードソン外挿とGCI

メッシュ収束スタディで3つのメッシュ解を使って真解を推定するリチャードソン外挿(Richardson Extrapolation)

$$f_h = f_0 + C h^p + O(h^{p+1})$$

2つのメッシュ($h_1 < h_2$, 細化比 $r = h_2/h_1$)から:

$$f_0 \approx f_1 + \frac{f_1 - f_2}{r^p - 1}$$

グリッド収束指数(GCI: Grid Convergence Index): Roache(1994)が提案した標準的な誤差評価指標:

$$\text{GCI}_{12} = \frac{F_s |e_{12}|}{r^p - 1} \times 100\%$$

$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 + AMGBoomerAMG, AMGCL, ML/MueLu
固有値解析(少数モード)ランチョス/サブスペース反復ARPACK, SLEPc, FEAST
固有値解析(多数モード)分散計算+ランチョスScaLAPACK, SLEPc
非線形静解析NR + 直接法(内部)ソルバー内蔵(Abaqus, Marc)
非定常陽解法中心差分+集中質量LS-DYNA, Abaqus/Explicit
CFD 非圧縮SIMPLE/PISO + PCG/GAMGOpenFOAM, Fluent
CFD 圧縮性高次FVM + Runge-Kutta + AMGOpenFOAM rhoCentralFoam, SU2

8.2 並列計算スケーラビリティ

アムダールの法則: 並列化できる割合 $p$ のとき、$N$ プロセッサでの理論最大速度向上比:

$$S = \frac{1}{(1-p) + p/N}$$

$p = 0.95$(95%並列化可能)でも $N \to \infty$ の理論限界は $1/(1-0.95) = 20$ 倍。

大規模FEM/FVM並列計算での注意点:

関連インタラクティブツール

理論を手を動かして確認しよう

この記事の評価
ご回答ありがとうございます!
参考に
なった
もっと
詳しく
誤りを
報告
参考になった
0
もっと詳しく
0
誤りを報告
0
Written by NovaSolver Contributors
Anonymous Engineers & AI — プロフィールを見る