Arnoldi法では非対称行列を扱ったが,Aが対称行列だった場合,
アルゴリズムを簡素化できる.
これがランチョス(Lanczos)法である.

まず,Arnoldi法でAが実対称行列だったとき,
&ref(ls_lanzcos1.eq1.gif,nolink,70%);も対称行列になる.
さらに&ref(ls_lanzcos1.eq2.gif,nolink,70%);はヘッセンベルグ行列であり,&ref(ls_lanzcos1.eq3.gif,nolink,70%);,ただし i > j+1 である.
よって,&ref(ls_lanzcos1.eq2.gif,nolink,70%);が対称行列ならば,i < j-1 でも&ref(ls_lanzcos1.eq3.gif,nolink,70%);となる.
つまり,以下のような三重対角行列(対角成分とその左右のみに値がある行列)となる.
#ref(ls_lanzcos1.eq4.gif,nolink,70%)

ここで,&ref(ls_lanzcos1.eq5.gif,nolink,70%);とした.

&ref(ls_lanzcos1.eq6.gif,nolink,70%);の代わりに&ref(ls_lanzcos1.eq7.gif,nolink,70%);を使って,
Arnoldi法(修正グラム・シュミットを用いたもの)を書き換える.

今,i < j-1で&ref(ls_lanzcos1.eq6.gif,nolink,70%);が0となることから,i=j-1,jについてのみ考えればよい.
i=j-1では,&ref(ls_lanzcos1.eq8.gif,nolink,70%);なので,&ref(ls_lanzcos1.eq9.gif,nolink,70%);と置き換えることができる.
ただし,&ref(ls_lanzcos1.eq10.gif,nolink,70%);と置いておく.
次に,i=jでは,&ref(ls_lanzcos1.eq11.gif,nolink,70%);なので,&ref(ls_lanzcos1.eq12.gif,nolink,70%);と置き換えることができる.
最後に&ref(ls_lanzcos1.eq13.gif,nolink,70%);と置き換え,&ref(ls_lanzcos1.eq14.gif,nolink,70%);は次の反復において&ref(ls_lanzcos1.eq15.gif,nolink,70%);として用いられる.
これらのことを適用するとアルゴリズムは以下のようになる.


>
任意のベクトル&ref(ls_lanzcos1.eq16.gif,nolink,70%);を設定(ただし&ref(ls_lanzcos1.eq17.gif,nolink,70%);)~
&ref(ls_lanzcos1.eq18.gif,nolink,70%);を設定~
for(j = 1,2,...,m){~
  &ref(ls_lanzcos1.eq9.gif,nolink,70%);~
  &ref(ls_lanzcos1.eq19.gif,nolink,70%);
  &ref(ls_lanzcos1.eq12.gif,nolink,70%);
  &ref(ls_lanzcos1.eq19.gif,nolink,70%);~
  &ref(ls_lanzcos1.eq12.gif,nolink,70%);~
  &ref(ls_lanzcos1.eq20.gif,nolink,70%);~
  if(&ref(ls_lanzcos1.eq21.gif,nolink,70%);) 反復終了~
  &ref(ls_lanzcos1.eq22.gif,nolink,70%);~
}


これがLanczos法である.

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS