硬さ検出
概要
多くの微分方程式には,刻み幅を制限し,それにより陽的な解法の効率をも制限するある種の硬さというものが存在する.
この問題を回避するために,多数の陰的メソッドが長年に渡り開発されてきた.
同じ刻み幅の場合,陰的メソッドは内的線形代数に関連するオーバーヘッドのために,陽的メソッドよりも効率がはるかに劣ることがある.
このコストは,ある特定の領域において陰的メソッドはかなり大きい刻み幅を取ることができるということにより埋め合せられる.
ランタイム時に硬さを自動的に検出し,必要に応じて適切なメソッドに切り替えるユーザフレンドリーなコードを提供するため,数々の試みが行われてきた.
ここでは,コードに硬さ検出を自動的に装備するために提案されてきた多数のストラテジーを紹介する.
硬さ検出をどのようにNDSolveに実装するかを記述するために,行列の優勢固有値の推定問題に特に注目してみる.
初期化
はじめに
硬さとは問題,解法,初期条件,局所的誤差許容度の組合せである.
硬さはメソッドが取ることのできる刻み幅を制約するため,陽的解法の効率を制約する.
硬さは線の方法による偏微分方程式の数値解法だけでなく,多数の実践的な系で発生する.
例題
ファン・デル・ポル(van der Pol)振動子は,非線形減衰を受けた非保存系の振動子であり,常微分方程式の硬い系の例である:
メソッド"StiffnessSwitching"ではデフォルトで1ペアの外挿メソッドが使われる.
解
問題は,解が急速に変化するとき,局所的確度が優勢な問題であるため硬いソルバを使う点はほとんどないということである.
効率を考えると,局所的確度(安定性ではない)が重要である領域を,メソッドが自動的に検出できたら便利であろう.
線形安定
線形安定理論は,ダールキスト(Dahlquist)のスカラー線形テスト方程式の研究から派生する:
これは初期問題(1)を研究するための簡約化されたモデルである.
(ここで であり は有理安定関数)を得るために(2)に適用されたメソッドを分析することである.
前進オイラー法
線形安定境界(LSB)は負の実軸との交点と取られることが多い.
固有値 では,線形安定の必要条件は,刻み幅が非常にゆるい制約の を満足する必要があるということを意味する.
しかし固有値 のとき,線形安定の必要条件は,刻み幅が非常に厳しい制約である を満足する必要があるということを意味する.
例題
以下の例題は,硬い系を解くのに陽的ルンゲ・クッタ法を使ったときの刻み幅シーケンスに対する硬さの効果を示している.
後退オイラー法
が得られる.このメソッドは左半分の平面には無条件で安定である.
つまり,安定を保つために刻み幅には制約が必要ないということである.
欠点は,方程式の陰的な系をそれぞれの積分ステップで解かなければならないということである.
タイプの不感性
タイプ不感性ソルバは各ステップで効率よく硬さを認識し反応するため,問題のタイプ(変化)に敏感でない.
このクラスで最もよく構築されたソルバの一つがLSODA [H83],[P83]である.
CVODE等,後の世代のLSODAはもはや固さ検出デバイスを装備しない.それは,後で説明するが,LSODAは優勢固有値を推測するためにノルム限界を使うが,その限界が非常に不正確であり得るためである.
A(α)安定のBDFメソッドの低次数は,高確度の系あるいは優勢固有値に大きい虚部のある系をとくのにLSODAおよびCVODEがあまり適していないことを意味する.線形の陰的スキームの外挿に基づくメソッド等,別のメソッドではそのようなことは問題にならない.
硬さ検出については1980年代,1990年代にスタンドアロンのFORTRANコードを使って多数の研究がされた.
それ以降新しい線形代数技術や効率的なソフトウェアが利用できるようになり,それがWolfram言語ですぐにアクセスできるようになっている.
硬さは一時的な現象であり得るため,硬さのないことを検出することも同様に重要である[S77],[B90].
"StiffnessTest"メソッドオプション
硬さのないソルバから硬い祖父場に切り替えるために使用できるアプローチがいくつかある.
直接の推定
硬さを検出する便利な方法に,問題のヤコビアン の優勢固有値を直接推定するというものがある([S77],[P83],[S83],[S84a],[S84c],[R87],[HW96]を参照).
そのような推定は数値積分の二次的結果として利用できることが多いので,比較的安価である.
がヤコビアンの優勢固有値に対応する固有ベクトルの近似を表し,が十分小さい場合,平均値定理により,主固有値のよい近似は以下のようになる:
リチャードソン(Richardson)の補外法は,ある種の陽的ルンゲ・クッタ(Runge–Kutta)法で行うように,この公式の量を算出する一連の微調整を提供する.
コストはせいぜい2回の関数評価ですむが,少なくともそのうちの1回は数値積分の二次的結果として利用できるので比較的安価である.
が線形安定領域を表すとする—線形安定領域と負の実軸との交点である.
積 は硬さを検出するためにメソッドの線形安定領域と比較することのできる推定値を与える:
解説
メソッド"DoubleStep","Extrapolation","ExplicitRungeKutta"にはオプション"StiffnessTest"があり,これは与えられた問題に,指定されたAccuracyGoalおよびPrecisionGoalで適用されたメソッドが硬いかどうかを見分けるために使われる.
メソッドオプションの"StiffnessTest"自体は(5)の弱形式を実装する多数のオプションを受け入れる.ここでテストは決まった回数だけ失敗することが許される.
その理由は,問題の中にはある領域だけがほどほどに硬いだけということがあり,明示的な積分法はまだ有効であるためである.
"NonstiffTest"メソッドオプション
"StiffnessSwitching"メソッドにはオプション"NonstiffTest"がある.これは硬いメソッドから硬くないメソッドへと切り替えるために使われる.
次の設定がオプション"NonstiffTest" に許される.
硬くないソルバへの切換え
ヤコビアンJ(あるいは近似)があるとき,以下のうちの一つを計算する:
線形代数の手法の多くは,1つの問題を高確度までとくことに焦点を当てている.
硬さ検出では,1桁か2桁までの解を持つ問題の連続が妥当である.
で,部分区間のいくつかにある行列のシーケンス を考えてみる:
連続行列のスペクトルはステップからステップでゆっくりと変化することが多い.
目的は下のような行列の連続 の優勢固有値(の限界)を推定する方法を探すことである:
NormBound
優勢固有値の限界を得るための簡単で効率的な方法は,ヤコビアン のノルム(ここで通常 あるいは )を使うことである.
この方法には,硬いソルバで実施される作業よりも小さい複雑性 がある.
例題
固有値の直接計算
小さい問題(例えば )では,優勢固有値を直接計算した方が効率がよいことがある.
オプション"NonstiffTest"の設定"Direct"は,Eigenvaluesと同じLAPACKルーチンを使って の優勢固有値を計算する.
大きい問題では,固有値の直接計算のコストは である.これは硬いソルバでの線形代数のコストと比較するとひどく高いものである.
この目的のために,多数の反復スキームが実装されている.これらは小さい部分空間での優勢固有空間を近似し,小さい問題では密な固有値メソッドを使って効率的に動作する.
ベキ乗法
Shampineはヤコビアンの優勢固有値を推定するためにベキ乗法を使うことを提唱した[S91].
ベキ乗法はあまり高く評価されている方法ではないが,Google社のページランキングに使用されているため,非常に関心が高まっている.
解説
プロパティ
特に,このメソッドは優勢固有値の複素共役ペアを持つ行列に適用されると収束しない.
一般化
ベキ乗法は,同一モジュール固有値の問題を克服するために適用することができる(例:NAPACK).
しかし,個の修正は一般にクラスタ化された固有値の遅い収束率という問題は回避しない.
部分空間反復
部分空間(同時)反復は,各ステップで m 個のベクトルに作用することによりベキ乗法の考えを一般化する.
すべてのベクトルが の同じ優勢固有ベクトル の倍数へと収束するのを妨げるため,正規直交化される:
レイリー・リッツ(Rayleigh-Ritz)の投影法
収束
部分空間(同時)反復は,各ステップで 個のベクトルに作用することによりベキ乗法の考えを一般化する.
となる.したがって,優勢固有値にのみ関心があるとしても例えば 以上を取るとよいことがある.
誤差制御
である.これは収束が遅いときは満足されないので十分ではない.
次数付きのシューア分解を使用するため,上三角行列 の最初の列の位置が検定される.
実装
- LOPSI [SJ81]
- シューア,レイリー・リッツ反復 [BS97]
「SRRITの魅力的な機能はモノトニックな一貫性を表示することである.つまり収束の誤差許容範囲は計算された残差の大きさのように減少する」[LS96].
SRRITは,最大のモジュロの固有値が左上の項目に現れる,次数付きのシューア分解を利用する.
再正規直交化の修正グラム・シュミット(Gram-Schmidt)は を形成するために使われる.これはハウスホルダー(householder)変換より速い.
KrylovIteration
列が,指定された部分空間 の直行基底をなすような 行列 があるとする:
レイリー・リッツ法は, の計算と関連する固有問題 を解くことからなる.
もとの問題 , の近似固有ペアはそれぞれリッツ値およびリッツベクトルと呼ばれる および を満足する.
この方法は部分空間 が の不変量部分空間を近似するときに最も効果がある.
この方法は, が行列 および与えられた初期ベクトル に関連付けられたクリロフ部分空間に等しい場合に効果的である:
解説
アーノルディ法はクリロフ部分空間の直交基底を計算し, のときの投影された 行列 を生成するクリロフベースの投影アルゴリズムである.
アーノルディ法の場合, は簡約されないヘッセンベルグ形式(追加の非零部分対角要素を含む上三角)を持つ.
残差 は不変量部分空間への近さを示し,関連付けられたノルム は計算されたリッツペアの正確さを示す:
再出発
リッツペアは,初期ベクトル が所望の固有値の方向に富んでいれば迅速に収束する.
そうでない場合,作業およびメモリが過剰になるのを避けるために再出発が必要になる.
明示的再出発は比較的実装が簡単であるが,暗示的再出発は大きい問題に必要な固有情報を保存しているため,より効率的である.しかしながら,暗示的再出発は数値的に安定した方法では実装が難しい.
実装がずっと簡単であるが暗示的再出発と同じくらい効果的である別の方法は,クリロフ・シューア法である[S01].
実装
- ARPACK [ARPACK98]
- SLEPc [SLEPc05]
自動ストラテジー
"Automatic"設定では,下のようなメソッドの融合が使われる.
- 部分空間反復が最大反復回数後に収束に失敗すると,デフォルト基底サイズ のクリロフ方を開始するために,優勢ベクトルが使われる.後続する積分ステップでは,前のステップからの結果のベクトルで開始したクリロフ法が使われる.
ステップの却下
評価時間のキャッシュは,優勢固有値推定が却下されたステップに対して再計算されないことを確実にする.
硬さ検出は以下の理由で,却下されたステップに対しても実行される.
反復メソッドオプション
"NonstiffTest"の反復メソッドには,変更することのできるオプションがある:
デフォルトの誤差許容範囲はただ1つの正しい数値を目標としているが,特に連続するステップで数回の反復が成功した後,実質的にもっと多くの正確な値を得ることがある.
反復の回数を制限するデフォルトの値は以下のようなものである:
これらの値が大きすぎると,収束の失敗は非常にコストの高いものとなる.
難しい問題では,ステップ全体で収束作業を分けた方がよい.このメソッドは前のステップからの基底ベクトルを効率よく調整するので,後続のステップで収束が成功する可能性もある.
レイテンシと切換え
"StiffnessSwitching"メソッドが継続的に硬いメソッドと硬くないメソッドとを切り換えようとするサイクルを避けるために,ある形でレイテンシを含ませることが重要である.
"StiffnessTest"および"NonstiffTest"のオプション"MaxRepetitions","SafetyFactor"はこの目的で使用される.
デフォルト設定では,切換えが非常に反応が早い.これは1ステップの積分メソッドに適している.
- "StiffnessTest"は硬くないメソッドのステップの最後に実行される.オプション"MaxRepetitions"のどちらかの値に達したら,ステップの却下が起り,ステップは硬いメソッドで再計算される.
例題
ヴァンデルポール
StiffnessTest
NonstiffTest
この例題は,全体的な硬さ切換えフレームワークが期待通りに動いているというより検定の例である.
CUSP
神経インパルスメカニズムに対するcusp catastrophyモデル[Z72]:
ヴァンデルポールと組み合せるとCUSP系になる[HW96]:
線の方法を使った拡散項の離散化が,次元の常微分方程式系を得るために使われる.
ヴァンデルポール系とは異なり,問題の大きさのため,固有値推定には反復メソッドが使われる.
刻み幅と次数選択
ヤコビアンの例題
硬いメソッドへの切換えは0.00113425付近で起きており,硬くないことの最初の検定は次のステップ で起きている.
Korteweg–deVries
Korteweg–deVriesの偏微分方程式は浅い水面の波動の数学的モデルである:
線の方法を使った離散化は192の常微分方程式系を形成するために使われる.
刻み幅
積分のはじめに硬いソルバが選ばれたら,外挿法は決して硬くないソルバに切り換えない.
従って,これは硬くないことの検出で最悪の場合の例だといえる.
それでも部分空間反復を使用するコストは積分全体の時間のほんの数パーセントに過ぎない.
ヤコビアンの例
ノルム境界はわずかに過大評価であるが,より重要なのは,実部および虚部の相対的な大きさにてついて言及していないという点である.
オプションの要約
StiffnessTest
オプション名
|
デフォルト値
| |
"MaxRepetitions" | {3,5} | 硬さ検定(6)の失敗が許される連続および合計回数を指定する |
"SafetyFactor" | 硬さ検定(7)の右辺と左辺に使う安全係数を指定する |
メソッドオプション"StiffnessTest"のオプション
NonstiffTest
オプション名
|
デフォルト値
| |
"MaxRepetitions" | {2,∞} | 硬さ検定(8)の失敗が許される連続および合計回数を指定する |
"SafetyFactor" | 硬さ検定(9)の右辺と左辺に使う安全係数を指定する |