残差 — CAE用語解説
理論と物理
残差とは何を表しているのか
CAEの解説でよく「残差」という言葉が出てきますが、具体的に何の「残り」を意味しているんですか?
良い質問だ。最も単純な例で説明しよう。支配方程式、例えば熱伝導の定常問題を考える。支配方程式は
ということは、残差が大きいと、計算結果は物理法則から大きく外れている、ということですか?
その通り。例えば、強制対流のCFD解析で運動量方程式の残差が10^0(=1)のオーダーで止まっている場合、それはナビエ-ストークス方程式がほとんど満たされていないことを示す。非圧縮性流れであれば、連続の式(質量保存)の残差は、流入質量流量の0.1%以下、例えば1e-4 kg/s程度まで収束させることが一般的な目標だ。
「収束させる」と言いますが、数学的には残差を完全にゼロにすることはできないのですか?
できない。理由は主に二つある。第一に、コンピュータは有限の精度(倍精度で約15桁)で計算するため、丸め誤差が必ず生じる。第二に、非線形問題や連立方程式を解く反復解法では、無限回の反復が必要になる。実務では、残差が十分小さくなり、かつ監視したい物理量(抗力、最大応力など)の変化が微小(例えば0.1%以内)になった時点で「収束した」と判断する。
数値解法と実装
ソルバーはどうやって残差を減らすのか
ソフトウェアの中では、残差を減らすために具体的にどんな計算が行われているんですか?
核心をつく質問だ。例えば陰解法のFEMソルバーでは、支配方程式を
CFDで「残差カーブ」を見ますが、なぜ方程式ごと(X速度、Y速度、連続など)に残差の大きさが全然違うんですか?
それは各方程式が持つ物理的なスケールと、ソルバー内での「スケーリング」による。例えば、Ansys Fluentではデフォルトで「スケールされた残差」を表示する。これは残差をその方程式の代表的な流量や力で割ることで、無次元化し比較可能にしている。それでも差が出るのは、解くのが難しい方程式だからだ。特に圧力-速度連成の要である連続の式(質量保存)の残差は、他の運動量方程式より1〜2桁小さくならないと流れ場は収束しない。これが「収束のネック」になることが多い。
反復計算で、残差が一度下がったまた上がる「振動」が見られることがあります。これは何が原因ですか?
それは不安定性の兆候だ。主な原因は三つ考えられる。第一に、物理的に不安定な現象(例えば、カルマン渦や燃焼不安定)を定常ソルバーで解こうとしている。第二に、非線形性が強すぎて、ソルバーの緩和係数が大きすぎる。第三に、メッシュ品質が悪く、離散化誤差が大きい場合だ。振動する場合は、まずアンダーリラクセーション係数をデフォルトの0.7から0.3など小さくして試すのが定石だ。
実践ガイド
収束判定の実際
実務では、残差がいくつまで下がれば「収束した」と安心して結果を採用できるのでしょうか?
絶対的な閾値はないが、経験則はある。構造解析(線形静解析)では、ソルバーの相対残差ノルムが1e-6以下であれば十分な精度と言える。一方、CFDの場合はより複雑だ。Ansys Fluentのマニュアルでは、スケールされた残差が「連続の式で1e-3、その他で1e-6」を一つの目安としているが、これはあくまで目安だ。最も重要なのは、関心ある物理量(例えば翼型の抗力係数Cd)の監視で、それが200〜300反復以上変化しなくなったことを確認することだ。残差だけ見て判断してはいけない。
メッシュを細かくすると、かえって残差が下がりにくくなることがあると聞きました。なぜですか?
鋭い指摘だ。その現象は、離散化誤差が減ることで、数値的な拡散(人工粘性)が減ることが原因の一つだ。特にCFDでは、粗いメッシュでは数値拡散が流れの変動を「なだめて」いたのが、細かいメッシュでは物理的な不安定性がそのまま現れるため、残差の振動が収束しにくくなる。また、メッシュ数が増えると条件数が悪化し、反復ソルバーの収束性が低下する。この場合は、マルチグリッド法のような高度なソルバーアルゴリズムの使用が必須になる。
解析を実行する前に、収束の見通しを立てるためのチェックリストはありますか?
ある。私が学生に課している最低限のチェックリストはこれだ:
ソフトウェア比較
ソフトごとの残差の扱い方
Ansys、Abaqus、COMSOLなどで、残差の表示の仕方や収束基準の設定方法に違いはありますか?
大きな違いがある。まず**Ansys Mechanical** (構造)では、ソルバー出力に「力の残差」や「収束ノルム」が表示され、デフォルトの収束基準は力とモーメントの残差が0.5%以下など相対値で設定される。**Abaqus/Standard**は「残差」という用語を、接触条件が満たされていない力として表示し、平衡反復の収束判定に用いる。
CFDソフトではどうですか?OpenFOAMのようなオープンソースは?
**Ansys Fluent**や**STAR-CCM+**は、先述したようにスケールされた残差をカラー付きのカーブでリアルタイム表示するのが特徴で、ユーザーにとって非常に見やすい。一方、**OpenFOAM**はデフォルトで「初期残差」を各反復ごとに表示する。これは各方程式の線形ソルバーに入力される残差の大きさで、最終的な収束状態とは異なる。OpenFOAMでは`solutionNorm`などの関数オブジェクトを設定して、真の残差ノルムを監視する必要がある。この点で、初心者にはハードルが高い。
COMSOLは「マルチフィジックス」が売りですが、残差の扱いは特殊ですか?
その通りだ。**COMSOL Multiphysics**は、複数の物理場を完全に連成して解く「Fully Coupled」アプローチをよく使う。この場合、全物理場の変数を含む単一の大きな残差ベクトルを扱う。収束プロットは、この全体の残差ノルムを示す。各物理ごとの残差を細かく見るには、「分離アプローチ」に切り替える必要がある。マルチフィジックス問題では、ある物理場の残差が別の物理場の収束を妨げる「収束の足を引っ張り合い」が起きるため、この全体残差の監視が特に重要になる。
トラブルシューティング
残差が下がらない・発散するとき
解析を走らせたら残差が全く下がらず、横ばいのままです。最初に疑うべき原因は何ですか?
まず**境界条件の矛盾**を疑え。例えば、流入速度と流出圧力を同時に指定した閉じた流路で、質量保存が成立たない設定をしていないか。第二に**メッシュ品質**、特にスキュー角が70度を超える悪い要素や、アスペクト比が1000を超える極端に細長い要素がないかチェックせよ。Abaqusならば、VERIFICATION CHECKを実行するとこれらの問題を検出してくれる。
残差が最初は下がるのですが、ある時点で急に跳ね上がり、その後「NaN」(非数)エラーで計算が止まります。これは典型的な何かのサインですか?
これは**数値的发散**の古典的なパターンだ。特にCFDで、密度や圧力が局所的に物理的にあり得ない値(例えば負の密度)になったときに発生する。原因は、強い圧力勾配や衝撃波を粗いメッシュで捉えようとしたり、緩和係数が大きすぎる場合だ。対策は、まずより保守的な初期条件と緩和係数(0.2以下)で再計算すること。それでもダメなら、高次精度スキームではなく、まずは1次風上差分など安定な離散化スキームで計算を始め、解が安定してからスキームを変更する「スキームの段階的変更」が有効だ。
「残差は収束しているが、物理量がまだ振動している」という状態です。これは収束とみなしていいのですか?
いいえ、それは**疑似収束**と呼ばれる状態で、最も危険なパターンの一つだ。残差の収束基準が緩すぎる(例えば1e-3)ために、ソルバーは「これ以上解を更新しなくていい」と判断するが、物理的にはまだ定常状態に達していない。この場合、必ず非定常解析に切り替えるべきだ。例えば、カルマン渦のような周期的な現象を定常ソルバーで解こうとすると、必ずこの状態に陥る。監視点の物理量の時間履歴(定常解析では反復履歴)を必ず確認し、周期的またはランダムな振動がないか確認することが、良い結果を得るための鉄則だ。
関連トピック
なった
詳しく
報告