アーノルディ法(Arnoldi's Method)は非対称行列のKrylov部分空間における正規直交基底を求める方法である. ちなみに対称行列に限定したLanczos法もある. Arnoldi法のアルゴリズムを以下に示す. > 任意のベクトル&ref(ls_arnoldi.eq1.gif,nolink,70%);を設定(ただし&ref(ls_arnoldi.eq2.gif,nolink,70%);)~ for(&ref(ls_arnoldi.eq3.gif,nolink,70%);){~ &ref(ls_arnoldi.eq4.gif,nolink,70%);~ &ref(ls_arnoldi.eq5.gif,nolink,70%);~ &ref(ls_arnoldi.eq6.gif,nolink,70%);~ もし,&ref(ls_arnoldi.eq7.gif,nolink,70%);なら反復終了~ &ref(ls_arnoldi.eq8.gif,nolink,70%);~ }~ ここでAは対象となる非対称行列である. wの計算手順をまとめて書くと, #ref(ls_arnoldi.eq9.gif,nolink,70%) となり,&ref(ls_arnoldi.eq10.gif,nolink,70%);なので, &ref(ls_arnoldi.eq11.gif,nolink,70%);は[[グラム・シュミットの直交化法]]でベクトル&ref(ls_arnoldi.eq12.gif,nolink,70%);から&ref(ls_arnoldi.eq13.gif,nolink,70%);に 直交するベクトルを求めていることになる. そのため, Arnoldi法でj=mまで計算された場合, &ref(ls_arnoldi.eq14.gif,nolink,70%);はKrylov部分空間の正規直交基底 #ref(ls_arnoldi.eq15.gif,nolink,70%) を構成する. さて,アルゴリズムより, #ref(ls_arnoldi.eq16.gif,nolink,70%) であり,これを変形すると, #ref(ls_arnoldi.eq17.gif,nolink,70%) ここで&ref(ls_arnoldi.eq18.gif,nolink,70%);である. この式がどのような形になっているのかを確かめるために, m=3の場合で,&ref(ls_arnoldi.eq19.gif,nolink,70%);を列とする行列を使って書き下してみる. #ref(ls_arnoldi.eq20.gif,nolink,70%) 上記の式はこのように書ける.これをm次元に一般化する. &ref(ls_arnoldi.eq21.gif,nolink,70%);の行列&ref(ls_arnoldi.eq22.gif,nolink,70%);を使うと, #ref(ls_arnoldi.eq23.gif,nolink,70%) &ref(ls_arnoldi.eq24.gif,nolink,70%);は基本ベクトルである. &ref(ls_arnoldi.eq25.gif,nolink,70%);はヘッセンベルグ標準形と呼ばれる形式になっており, 行列AをKrylov部分空間に射影した行列となっている. &ref(ls_arnoldi.eq26.gif,nolink,70%);は直交行列なので,この式の両辺に&ref(ls_arnoldi.eq27.gif,nolink,70%);を掛けると, #ref(ls_arnoldi.eq28.gif,nolink,70%) となる. ちなみに,Aと&ref(ls_arnoldi.eq25.gif,nolink,70%);の固有値は同じとなるので, この方法は固有値計算にも用いられる. **修正グラム・シュミット法を用いたArnoldi法 [#a76b0fa1] 修正グラムシュミット法([[グラム・シュミットの直交化法]]参照)を使ったArnoldi法のアルゴリズムを以下に示す. > 任意のベクトル&ref(ls_arnoldi.eq1.gif,nolink,70%);を設定(ただし&ref(ls_arnoldi.eq2.gif,nolink,70%);)~ for(j = 1,2,...,m){~ &ref(ls_arnoldi.eq29.gif,nolink,70%);~ for(i = 1,2,...,i){~ for(i = 1,2,...,j){~ &ref(ls_arnoldi.eq30.gif,nolink,70%);~ &ref(ls_arnoldi.eq31.gif,nolink,70%);~ }~ &ref(ls_arnoldi.eq32.gif,nolink,70%);~ if(&ref(ls_arnoldi.eq33.gif,nolink,70%);) 反復終了~ &ref(ls_arnoldi.eq8.gif,nolink,70%);~ } 丸め誤差がなければ通常のArnoldi法と結果は同じとなる.