|TOP Page|
GMRes法Y.Saadらによって提案された、非対称行列を解くことができる反復法である。
GMRes法とは回目の反復において、部分空間
に属する全てのベクトル
から残差の2乗ノルム
を最小化するような解
を探す見つける方法である。つまり、
![]() |
但し、はk階のクリロフ部分空間
である。
簡単のため、まず回反復を行った後に解を求める方法を説明する。この方法では、まず
個の正規直交基底を作成し、直交基底の中から残差を最小にする解を求める。残差の大きさが求まるのが
解の反復の後であるので、残差が十分小さくなれば途中で反復を打ち切るようなことはできない。各反復毎に残差の多きさあを求める方法は後に説明する。
Arnoldi法を用いて正規直交化されたクリロフ部分空間の正規直交基底
を並べた行列を
,Gram-Shumitの直交化の際の係数を行列にしたものを
とする。
は
を満たす、
のヘッセンベルグ行列である。
はクリロフ部分空間
の基底であったから、
に属するベクトル
は次のように表すことができる。
ここでは次のようなベクトルである。
これらを用いてベクトルに対する残差
を計算する。
、
とおくと残差
は
となる。但し、であることから
となること、また、Arnoldi法の性質から
となることも用いた
これらを用いると最小にすべき残差の2乗ノルムは
となる。ここで、が正規直交基底であることを用いた。
結局GMRes法はを最小化するベクトル
を探すことと同じといえる。
ヘッセンベルグ行列にギブンス回転(Givens Rotation)の操作を繰り返すことで上三角行列に変換することができる。回転操作はノルムを変化させないので回転した後の残差のノルムを最小化すれば、回転する前の残差のノルムを最小化したことと同じになる。
わかりやすいようにの場合の
のヘッセンベルグ行列
を例にとって上三角行列への変換を説明する。
次のようなの行列
を考える
  但し、
,
この行列を
の左から掛けたものを
とすると
となり成分を消去できる。
同様にして次のようなの行列
を考える
  但し、
,
この行列を
の左から掛けたものを
とすると
となり成分を消去できる。
この操作を繰り替えすことでヘッセンベルグ行列を上三角行列
に変換することができる。
ここでとした。
前ではの場合について具体的にヘッセンベルグ行列から上三角行列への変換について述べた。ここでは一般的な場合について述べる。
次のよな行列を考える
但し、
,
このを掛け合わせた次のような行列
を考えると
上三角行列への変換は次のようになる。
これらを用いると残差は次のように変形できる。
これらを用いると最小にすべき残差の2乗ノルムは
のようになる。但し、がユニタリーであることを用いた。
これらを用いるとGMRes法のアルゴリズムは次のようになる。
この章は残差を最小にするの値を上三角行列
から求める方法について述べる。
を
の
番目の成分を除いた、大きさが
のベクトルであるとする。また、
を
から
番目の行を除いた正方行列であるとする。
の
番目の行は成分が全て0であるので
が成立つ。と
が互いに直交していることを用いると
が成立つ。等号成立はの時である。
以上から残差ノルムを最小化するベクトルは次のように求めることができる。
このとき、残差ノルムの最小値はである。またこの時の残差ベクトル
は、
のようになる。
なお、
の計算はが上三角行列であることから後退代入を用いて簡単に求めることができる。
これらを用いるとGMResのアルゴリズムは次のようになる。
今までの方法は個の基底
を作ってから残差の2乗ノルムを最小化するような解
を求めていたが、実際には各反復毎に残差の大きさ
を求め、必要とされる小ささよりも小さくなった段階で反復をうちきることで無駄な反復をするすることなく解を求めることができる。
ここでは各反復毎に正規直交基底や上三角形行列、残差の大きさを更新する方法について考える。
Arnordi法のアルゴリズムからk回目の反復において生成されるクリロフ部分空間の基底ベクトルはベクトル
をGram-Shumitの直交化法やHausholder変換を用いてベクトル列
と直交化した後に正規化したものだった。
を作る際の直交化の際の係数は
であり、直交化後に正規化するときの係数が
であった。
ここでベクトルを次のように置く。
このを用いて
回目の反復におけるヘッセンベルグ行列
は次のように表される。
但しは
回目の反復におけるヘッセンベルグ行列
の下に成分が全て0である行を追加した行列である。
反復における上三角行列
から
反復における上三角行列
を求める方法を考える
の一番下の行に成分が全て0である行を追加した行列は
であった。この行列は次のように回転行列を用いてヘッセンベルグ行列
から求めることができた。
ここでに先ほどの関係を代入して
ここでは
の一番下の行に成分が全て0の行を追加した行列である。
は一番下の大きさが2の対角成分以外は対角が単位行列である回転行列であった。
は下2行が0であるから、
である。
回転行列はベクトル
の
番目の成分が0になるように選ばれる。
つまり、を満たす。
またはユニタリー行列であるから
である。
つまり、である。
これらを用いると
このようにして回目の反復における上三角行列
から
回目の反復における上三角行列
を求めることができる。
回反復目における残差の大きさは
と表されるのであった。但しベクトル
は
であり、
はベクトル
の
番目の成分であった。つまりベクトル
の一番最後の成分の絶対値が残差のノルムになるのである。
ここでベクトルがどのように更新されるのかを調べる。
と表される。ここで
は大きさ
のベクトル
の一番最後の成分に0を付け加えることによって大きさを
にしたベクトルである。
は対角成分が
から
までが単位行列、
成分と
成分が回転行列になっている行列であるから
は1ステップ前のベクトルの値
を元にして次のように求めることができる。
よって回反復目における残差のノルム
は次のようになる
であるから残差が増加することはないこと確認できる。
以上をまとめると、回目の反復ではまず、新しいクリロフ部分空間の正規直行基底
を作成し、正規直交基底を作った際の係数ベクトル
に、今までの回転行列
を掛けた後、係数のベクトルのサイズが1つ減るような新しい回転行列
を作成して上三角行列を作る。新しい回転行列を
ベクトルにかけることによって
ベクトルを更新し、
ベクトルの最後の成分から現在の残差のノルムを求める。
  1.   Compute
  2.   For Do:
  3.     
  4.      For Do:
  5.        
  6.        
  7.      End Do
  8.     
  9.     
  10.    
  11.    
  12.     Break Loop
  13.  End Do:
  14. 
  15. 
Full-GMRes法は適当な反復数を決めずに残差のノルムが小さくなるまで反復を繰り返す方法である。Full-GMRes法では残差が小さくなるまで無限に反復を繰り返し、正規直交基底も収束まで無限に増え続ける。計算機上ではリソースが限られているので現実的ではない。
GMRes(m)法はリスタートつきGMRes法とも呼ばれ、反復数がに達した時点でそれまでのクリロフ部分空間の基底や上三角行列などを全て捨ててその時点での反復解を初期値として計算しなおす(リスタートする)というアルゴリズムである。このリスタトまでの反復数
の最適な値を求めることは困難である。
が問題依存のある値よりも小さければいくらリスタートを繰り返しても収束が困難であることが知られている。この方法は良く使われる。
次のプログラムは次のような移流拡散問題の例
から生じる行列をGMRes(m)法で解くプログラムである。
DOWNLOAD | GMRes.zip |
---|
OS:WindowsXP, Windows2000 開発環境:VC++ 2005 言語:C++
結果を表示する場合は次のようにすればよい。
解くべき方程式を前処理行列
を使って次のように変形する。
これはが
の右から掛けられているので右前処理と呼ばれる。
係数行列がから
に変わっている。この
の性質が単位行列に近ければ元の方程式よりも早い収束が期待される。
この前処理を使ってGMResで解を求める方法は基本的にGMRes法での部分を
に変えて
を求め、最後に1回解く事で
を求めるというだけで特別な変更はない。また残差については
であるからに対する残差はそのまま
に対する残差でもある。よって逐次的に残差の大きさを更新しながら
を求める際に得られる残差の大きさは
に対する残差の大きさでもある。よって残差の大きさが反復途中にも得られるために右前処理法は逐次的に更新する方法によく使われる。
  1.   Compute
  2.   For Do:
  3.     
  4.      For Do:
  5.        
  6.        
  7.      End Do
  8.     
  9.     
  10.    
  11.    
  12.     Break Loop
  13.  End Do:
  14. 
  15. 
  16. 
次のプログラムは次のような移流拡散問題の例
から生じる行列を「ILU分解による右前処理つきGMRes(m)法」で解くプログラムである。
DOWNLOAD | ILU-GMRes.zip |
---|
OS:WindowsXP 開発環境:VC++ 2005 言語:C++
結果を表示する場合は次のようにすればよい。
基本的に実数行列に対するGMRes法と手続きは同じであるが、複素行列の場合ギブンス回転のやり方のみ注意が必要である。
回転行列をとすると、回転行列は内積の値を変化させないので任意の複素ベクトル
について以下が成り立つ。
つまり、エルミート行列(Hermetian matrix)であることがわかる。ここで回転
が
平面の中での回転であるとすると、
成分以外は全て変化しない。つまり
は
に関する項以外は単位行列であることがわかる。そこで
に関する小行列を
とする。つまり
は次のような行列
このような場合、がエルミート行列であるためには、小行列
もエルミート行列でなくてはならない。
また、はベクトル
の第2成分が0となるように選ばれた。
この2つの条件つまり、エルミート行列であるという条件、ベクトルとの積の最後の成分が0であるという条件からは一意に
は定まらない。つまり、この2つの条件を満たすならどのように
を選んでも構わない。
例えば、ここではが次のような行列であると限定して考える。
但しは実数である。
すると、がエルミート行列であるという条件は次のように書ける。
また、ベクトルとの積の最後の成分が0であるという条件は次のとおり、
これらを解くとは次のようになる。
例えばこのようなをもちいた回転行列
を使うことで、GMRes法を使って複素行列を解くことができる。
また、複素数の場合はである。間違えやすくバグに陥り易いので注意が必要である。
[1]Y.Saad and M.H. Shultz. GMRES: a generalized minimal residual algorithm for solving non-symmetric linear systems. SIAM J. Sci. Stat. Comp., 7:856-869, 1986.