有限差分法(FDM)|離散格子で偏微分方程式を数値近似

有限差分法(FDM)

有限差分法(FDM)は、偏微分方程式を格子点上の差分近似に置き換えて解く数値解析法である。連続場の空間変数と時間変数をそれぞれ格子化し、導関数を前進差分・後退差分・中心差分などで近似することで、連立代数方程式または反復更新式を構成する。熱伝導、拡散、波動、流体などの工学分野で広く使われ、実装が平易で計算効率が高い点が特徴である。

原理と位置づけ

有限差分法(FDM)は微分を差分に置換するという単純な思想に基づく。連続方程式を格子点に制限し、導関数を差分商で近似して離散方程式を得る。有限要素法や有限体積法と比べ、直交格子への適用が容易で、コードも簡潔になりやすい。

離散化と格子の設計

格子は等間隔の直交格子が基本であるが、境界形状に合わせた非一様格子も用いられる。空間刻みdx,dy,dzは解のスケールに合わせて設定し、層流境界層や衝撃波など急勾配領域では局所的に細分化する。格子品質は精度と収束に直結する。

時間積分法(陽解法と陰解法)

時間離散は陽解法(例: Forward Euler, Runge–Kutta)と陰解法(例: Backward Euler, Crank–Nicolson)に大別される。陽解法は実装が容易で並列化に適するが安定性制約が厳しい。陰解法は安定だが方程式求解が必要で計算コストが増す。

境界条件の取り扱い

Dirichlet、Neumann、Robinなどの境界条件を格子端に与える。壁近傍ではゴーストセルや片側差分で精度を保つ。周期境界や対称条件は流体や波動で多用され、離散化全体の整合性を崩さない実装が重要である。

安定性とCFL条件

陽解法ではCFL条件が支配的で、対流支配問題ではdt ≤ C・dx/|u|程度、拡散支配ではdt ≤ C・dx^2/ν程度が目安となる。Von Neumann解析で増幅因子を評価し、スキームと格子、物性値から安定時間刻みを決定する。

収束と誤差(収束次数)

局所離散誤差はO(dx^p)で表され、中心差分は通常2次精度、4次中心差分で高精度化できる。グリッド収束試験によりpを推定し、基準解や解析解と比較する。メッシュ収束は妥当性確認の核心である。

差分スキームの比較

中心差分は分散誤差が小さく高精度だが、対流支配で非物理振動が出やすい。風上差分は数値粘性により安定的だが拡散が大きい。TVD、ENO/WENOは急勾配を滑らかに捕捉し、ショックや層流—乱流遷移周辺で有効である。

ステンシルと数値粘性

差分ステンシルの幅は精度とコストのトレードオフを規定する。高次化は情報を広く用いるため境界処理が複雑化する。人工粘性やフィルタは振動抑制に有効だが、過大な適用は物理解の劣化を招く。

曲線座標と非直交格子

複雑形状には座標変換で曲線座標FDMを用いる。メトリクス項の離散に注意し、変換による保存性と精度を担保する。格子直交性の低下は数値誤差を増幅するため、格子生成段階の品質管理が肝要である。

実装手順とワークフロー

  1. 支配方程式と境界条件の明確化。
  2. 格子生成(解のスケールに応じたdx設定)。
  3. 空間差分と時間積分の選定。
  4. 境界の片側差分・ゴーストセル実装。
  5. 安定性評価とdt決定、プロファイリングと並列化。
  6. 検証(解析解・製造解法)と妥当性確認。

代表例:熱伝導方程式

1次元熱伝導の陽解法は、u_i^{n+1}=u_i^n+α・dt/dx^2 (u_{i+1}^n−2u_i^n+u_{i−1}^n)となる。安定にはdt ≤ dx^2/(2α)が目安である。Crank–Nicolsonを用いれば2次精度かつ条件付き安定性が緩和される。

代表例:対流拡散方程式

対流項は風上差分、拡散項は中心差分の組合せが実務的である。Péclet数が大きい場合は高分解能スキームやフラックスリミタで非物理振動を抑制する。境界層解像には非一様格子が有効である。

検証と妥当性確認(VV&UQ)

製造解法(MMS)で離散精度を系統的に検証し、グリッド収束で誤差の傾きを測る。さらに感度解析や不確かさ定量化を行い、入力ゆらぎが出力に与える影響を評価することが信頼性確保に直結する。

FDMとFVM/FEMの比較

有限差分法(FDM)は構造が簡潔で実装容易、直交格子で高速である。一方、保存性や複雑形状適合はFVMやFEMが優れる。問題の性質(保存律、幾何、滑らかさ)に応じて手法を選ぶのが最適である。

よくある落とし穴と対策

  • 境界での精度低下:片側高次差分と滑らかな外挿で改善。
  • CFL違反:自動dt制御と安定性モニタで回避。
  • 数値振動:TVD/WENOやフィルタの慎重な導入。
  • 過度な数値粘性:格子洗練とスキーム切替で低減。