Krylov部分空間法 — CAE用語解説

カテゴリ: 用語集 | 2026-01-15
CAE visualization for krylov subspace - technical simulation diagram

Krylov部分空間法

🧑‍🎓

先生、クリロフ部分空間法って反復法ソルバーの核心技術ですよね?

Krylov部分空間法の理論基礎

Krylov部分空間法の基本概念

🧑‍🎓

Krylov部分空間法って、名前はよく聞くんですけど、結局何をやっている方法なんですか?「部分空間」って言われてもイメージが湧きません。

🎓

連立一次方程式

$$ A\mathbf{x} = \mathbf{b} $$
を解くための反復解法の一種だ。直接法のように行列Aを完全に分解するのではなく、解を探す空間を少しずつ広げていくイメージだ。具体的には、初期残差ベクトル
$$ \mathbf{r}_0 = \mathbf{b} - A\mathbf{x}_0 $$
と行列Aを繰り返し掛け合わせて作られるベクトルたちが張る空間、つまりKrylov部分空間
$$ \mathcal{K}_m(A, \mathbf{r}_0) = \mathrm{span}\{\mathbf{r}_0, A\mathbf{r}_0, A^2\mathbf{r}_0, \dots, A^{m-1}\mathbf{r}_0\} $$
の中で、最も良い近似解を見つけようとする。

🧑‍🎓

「最も良い」の基準は何ですか?残差のノルムを最小にする、とかですか?

🎓

その通り。代表的なアルゴリズムであるCG法(共役勾配法)は、エネルギー・ノルム

$$ \| \mathbf{x} - \mathbf{x}_* \|_A $$
を最小化する。一方、GMRES法はユークリッド・ノルムによる残差
$$ \| \mathbf{b} - A\mathbf{x}_m \|_2 $$
を最小化する。この「良い近似の基準」の違いが、対称正定値行列にはCGを、非対称行列にはGMRESを使い分ける理由の一つだ。

🧑‍🎓

なぜ直接法ではなく、わざわざ反復法を使う必要があるんですか?有限要素法で出てくるような大きな行列でも、直接法で一発で解けないんでしょうか。

🎓

計算コストとメモリ使用量が圧倒的に違うんだ。例えば、自由度100万の3次元構造解析問題を考えてみよう。直接法(例えばスパースLU分解)では、非ゼロ要素の数が膨大に増える「フィルイン」が発生し、必要なメモリは数百GBからTB単位に達し、計算時間も非常に長くなる。一方、Krylov法(適切な前処理付き)では、行列Aそのものを保存するだけで、反復ごとの計算は行列ベクトル積が中心だから、メモリ使用量は数GB程度で済み、計算も速いことが多い。

Krylov部分空間法の数値計算手法

主要アルゴリズムとその使い分け

🧑‍🎓

CG法とGMRES法以外にも、Bi-CGSTABとかMINRESとか聞きます。これらは全部Krylov部分空間法の仲間なんですか?どうやって使い分けるんですか?

🎓

そうだ。これらは全てKrylov部分空間法ファミリーだ。使い分けの第一基準は行列の性質だ。

- CG: 対称正定値(SPD)行列専用。構造解析の線形弾性問題の主力。 - MINRES: 対称だが不定値(正定値でない)行列用。例えば拘束条件をラグランジュ乗数法で処理した場合など。 - GMRES: 非対称行列用。一般のCFD問題や電磁界解析で使われる。反復ごとに使用メモリが増えるという欠点がある。 - Bi-CGSTAB: 非対称行列用。GMRESよりメモリ使用量が固定で少ないが、収束が不安定な場合がある。実用的なCFDソルバーでよく採用されている。

🧑‍🎓

GMRESはメモリが増えると言いましたが、具体的にどういう仕組みで、どう対策するんですか?

🎓

GMRESはArnoldi過程で正規直交基底を構築するが、この基底ベクトルをすべて保存する必要がある。反復回数mが増えると、m本のn次元ベクトルを保存するので、メモリ使用量はO(mn)で増加する。対策は「リスタート」だ。例えば、m=50回反復した時点で得られた近似解を新しい初期値とし、Krylov部分空間の構築を最初からやり直す(GMRES(50)などと表記する)。ただし、リスタートすると最適性(残差最小)が保証されなくなるというトレードオフがある。

🧑‍🎓

収束判定の「残差ノルム」って、具体的にどの値を見ればいいんですか?「1e-6」とかなんとなく設定していますが。

🎓

相対残差ノルム

$$ \frac{\| \mathbf{b} - A\mathbf{x}_k \|}{\| \mathbf{b} \|} $$
が一般的だ。値の設定は問題による。構造力学の線形静解析なら1e-8まで厳しくしてもいいが、非線形解析の各増分ステップやCFDの定常計算では1e-4〜1e-6で十分なことが多い。重要なのは、結果(最大応力、抗力など)がその閾値以下で変化しなくなる「収束した」領域を見極めることだ。安易に1e-3とかにすると、解が粗すぎて物理的に意味をなさない場合がある。

Krylov部分空間法の実務適用

前処理の重要性と選択

🧑‍🎓

Krylov法を使う時は必ず「前処理」が必要と言われます。前処理をしないとどうなるんですか?また、ILUとかICとかありますが、何が違うんですか?

🎓

前処理なしのKrylov法は、実用問題ではほとんど収束しないか、非常に時間がかかる。前処理行列

$$ M $$
を適用して、元の方程式
$$ A\mathbf{x}=\mathbf{b} $$
を、条件数が良く(固有値が1近くに集まり)、反復が早く収束する
$$ M^{-1}A\mathbf{x} = M^{-1}\mathbf{b} $$
に変換するのが目的だ。
- IC (不完全コレスキー分解): 対称正定値行列用。CG法と組み合わせる。Fill-inレベル(元の行列の非ゼロパターンをどの程度保持するか)を0(IC(0))や1(IC(1))で設定する。 - ILU (不完全LU分解): 非対称行列用。GMRESやBi-CGSTABと組み合わせる。こちらもFill-inレベル(ILU(0), ILU(1))やしきい値(ILUT)で精度を制御する。レベルを上げると前処理自体の計算コストとメモリが増える。

🧑‍🎓

Fill-inレベルは、具体的にどうやって決めればいいですか?とりあえず0にしておけばいいんでしょうか。

🎓

それは問題の難しさによる。単純な線形弾性問題ならIC(0)やILU(0)で十分収束する。しかし、メッシュのアスペクト比が極端に悪い(1:1000以上)とか、材料特性の差が非常に大きい(ゴムと鋼の接触)ような「条件数が悪い」問題では、ILU(0)では収束しないか遅い。その場合、ILU(1)やILUT(しきい値=0.01など)にすると、反復回数が10分の1以下に激減することがある。まずは0で試し、収束が悪ければレベルを上げる、というのが実践的なアプローチだ。

🧑‍🎓

ソフトウェアのソルバー設定で「Vサイクル」や「AMG」という前処理も見かけます。これらはILUなどとどう違うんですか?

🎓

それらは「代数的マルチグリッド法(AMG)」ベースの前処理だ。ILUが行列の「局所的な」近似分解であるのに対し、AMGは「大域的な」スケールの誤差を除去するように設計されている。特に、弾性問題などで現れるスカラー拡散方程式とは異なる、複雑な連成や変形モードを持つ問題(例えば、ほぼ非圧縮性材料)に対して強力だ。Ansys Mechanicalでは、スパース直接ソルバーに代わるデフォルトの反復ソルバーとして、AMG前処理付きのCG法が採用されている。計算規模が大きい場合、直接法よりメモリと時間で大幅に優位になる。

Krylov部分空間法のソフトウェア比較

各CAEソフトウェアでの実装とデフォルト

🧑‍🎓

Ansys、Abaqus、COMSOLといった主要ソフトでは、Krylov法はどのように実装され、ユーザーはどこまで設定をいじれるんですか?

🎓

各社とも高度にチューニングされたソルバーライブラリ(PETSc, Trilinos, 自社開発)を採用しているが、露出度はソフトにより異なる。

- Ansys Mechanical: デフォルトは「プログラム制御」。これは問題規模とタイプに応じて、スパース直接法かAMG前処理付きPCG(反復法)を自動選択する。ユーザーは「ソルバータイプ」で「直接」か「反復」を強制選択でき、反復法を選んだ場合、前処理(AMG, IC, ジャコビなど)や収束許容値を詳細設定できる。 - Abaqus/Standard: デフォルトソルバーは直接法だが、大規模モデル向けに「反復法線形ソルバー」が用意されている。こちらはAMG前処理付きCG法だ。主に固体力学用に最適化されており、接触や複雑な非線形を含む問題では直接法が推奨されることが多い。 - COMSOL Multiphysics: 物理場ごとに最適なソルバーを自動提案するが、ユーザーの介入度が最も高い。線形ソルバーとして「直接(PARDISO, MUMPSなど)」「反復(GMRES, FGMRES, BiCGSTABなど)」を選択でき、前処理(ILU, SOR, 幾何/代数的マルチグリッド)も細かく選べる。マルチフィジックス連成に強い。

🧑‍🎓

CFDソフトでは事情が違いますか?OpenFOAMのようなオープンソースではどうなっていますか?

🎓

大きく違う。CFDでは圧力-速度連成のため、非対称行列が中心となり、GMRESやBi-CGSTABが主力だ。

- Ansys Fluent: 圧力補正法(SIMPLE系)の内部で、圧力のポアソン方程式を解くのに(前処理付き)CG法やAMGサイクルを使用する。分離ソルバーでは各方程式ごとにソルバー(多重グリッド、GMRESなど)を設定できる。 - OpenFOAM: ユーザーがソルバーと前処理を方程式ごとに直接指定する。例えば、`fvSolution`ファイルで `p`(圧力)のソルバーを `GAMG`(幾何的代数マルチグリッド)に、前処理を `DIC`(対角不完全コレスキー)に設定するなど、非常に詳細な制御が可能だ。これが学習曲線を急峻にしているが、その分最適化の余地も大きい。

Krylov部分空間法のトラブル対応

収束しない・遅い場合の対策

🧑‍🎓

反復ソルバーが全然収束しない、または「収束失敗」でエラーになることがあります。最初にチェックすべきポイントは何ですか?

🎓

以下の順で確認する。

1. モデルの物理的妥当性: 拘束不足(剛体モード)はないか。材料定数(ヤング率、密度)に極端な値(1e20など)やゼロが混入していないか。これが原因で行列が特異または悪条件になる。 2. メッシュ品質: 要素のアスペクト比、スキュー角、歪みをチェック。アスペクト比1000:1のような要素があると、条件数が悪化し収束が極端に遅くなる。 3. ソルバー設定のミスマッチ: 非対称問題(流体など)にCG法を使っていないか。対称問題にGMRESを使うと無駄にメモリを使うが、収束自体はする。

🧑‍🎓

モデルとメッシュは問題なさそうなのに、収束が遅いです。前処理を変えるべきですか?

🎓

そうだ。まずは前処理の「強度」を上げてみる。例えば、ILU(0)からILU(1)やILUTに変更し、Fill-inの許容量やしきい値を緩和する。AnsysのAMG前処理なら、「緩和タイプ」を「ガウス・ザイデル」からより強力な「SOR」や「チェビシェフ多項式」に変える。ただし、前処理自体の計算コストとメモリは増えるので、トレードオフを考える必要がある。

🧑‍🎓

「NaN(非数)」や「無限大」がソルバーから報告されることがあります。これはKrylov法特有の問題ですか?

🎓

直接法より反復法で起こりやすい。原因は主に二つ。

1. 前処理の不安定性: 特にILU分解で、分解中に極端に小さいピボット(ほぼゼロ)が現れると、除算でオーバーフローを起こす。対策は、ピボットングを行うオプション(ILUPなど)を有効にするか、より安定した前処理(例えば、ブロック・ジャコビ前処理にILUを組み合わせる)に切り替える。 2. アルゴリズム自体の発散: Bi-CGSTABは理論的に残差が振動しやすく、発散することがある。その場合は、より安定した(ただしメモリを食う)GMRES(50)などに切り替えるのが確実だ。OpenFOAMでは、`fvSolution`で `solver` を `biCGStab` から `GAMG` に変えるだけで収束する場合も多い。

🧑‍🎓

反復ソルバーを使うと、直接法と比べて結果が微妙に違うことがあります。これは許容範囲の誤差なんですか?

🎓

収束許容値が十分に厳しければ(例えば1e-8以下)、直接法との差は無視できるレベルだ。しかし、許容値を1e-4などの緩い値に設定していると、特に感度の高い量(応力集中部の最大応力、流体力学的な抗力係数)に数%の差が出ることがある。重要なのは、関心ある物理量が収束許容値に対して「収束」しているかを確認することだ。許容値を1e-4, 1e-5, 1e-6と段階的に厳しくし、結果が変わらなくなるポイントを見つければ、その結果は信頼できる。それが「グリッド依存性試験」ならぬ「ソルバー収束性試験」だ。

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