XLPack 7.0
XLPack 数値計算ライブラリ (Excel VBA) リファレンスマニュアル
読み取り中…
検索中…
一致する文字列を見つけられません

◆ Dneupd()

Sub Dneupd ( Rvec As  Long,
Howmny As  String,
Selct() As  Long,
Dr() As  Double,
Di() As  Double,
Z() As  Double,
Sigmar As  Double,
Sigmai As  Double,
Workev() As  Double,
Bmat As  String,
N As  Long,
ByVal Which As  String,
Nev As  Long,
Resid() As  Double,
Ncv As  Long,
V() As  Double,
IParam() As  Long,
Ipntr() As  Long,
Workd() As  Double,
Workl() As  Double,
Info As  Long,
Optional Tol As  Double = 0 
)

アーノルディ分解の近似固有値・固有ベクトル (一般疎行列) (Arpack)

目的
本ルーチンは固有値問題 A*z = λ*B*z の近似固有値および(必要であれば)対応する近似固有ベクトルを求める.

これらの値は Dnaupd が返す線形演算子 OP および行列 B のアーノルディ分解(詳細は Dnaupd のマニュアルの「目的」の項を参照)より計算される. 本ルーチン呼び出しの前に Dnaupd を呼び出しておかなければならない.

近似固有値は昇順に格納される.

引数 Bmat, N, Which, Nev, Tol, Resid, Ncv, V, Iparam, Ipntr, Workd および Workl は Dnaupd の最後の呼び出し後, 変更することなく本ルーチンに渡さなければならない. これらのうち V, Ipntr および Workl は本ルーチンによって変更される.
引数
[in]Rvec固有値問題 A*z = λ*B*z の近似リッツ値に対応する不変部分空間の基底を求めるかどうか指定する.
= 0 (False): リッツ値のみ求める.
= 1 (True): リッツベクトルまたはシュールベクトルも求める.
[in]Howmny求めるリッツ値に対応する不変部分空間の基底の形式を指定する.
= "A": Nev 個のリッツベクトルを求める.
= "P": Nev 個のシュールベクトルを求める.
= "S": 配列 Select() で指定されたリッツベクトルを求める.
[out]Selct()配列 Selct(LSelct - 1) (LSelct >= Ncv)
Howmny = "S" の場合, Selct() は求めるリッツベクトルを指定する. リッツ値 (Dr(j), Di(j)) に対応するリッツベクトルを選択するには, Selct(j) を 1 (True) に設定する必要がある. Howmny = "A" または "P" の場合, Selct() は内部ワークスペースとして使用される.
[out]Dr()配列 Dr(LDr - 1) (LDr >= Nev + 1)
mode = 1 または 2, または, mode = 3 かつ Sigmai = 0.0 であれば, A*z = λ*B*z の固有値のリッツ値による近似の実数部が入る.
mode = 3 または 4 で Sigmai <> 0.0 であれば, Dnaupd により計算された OP のリッツ値の実数部が入る. Dnaupd による OP のリッツ値をもとの方程式 A*z = λ*B*z のそれに変換するためにはユーザーがさらに計算を行う必要がある.
[out]Di()配列 Di(LDi - 1) (LDi >= Nev + 1)
A*z = λ*B*z の固有値のリッツ値による近似の Dr() に対応する虚数部が入る.
[out]Z()配列 Z(Ldz - 1, LZ - 1) (Ldz >= N, LZ >= Nev + 1)
Rvec = 1 (Truw) かつ Howmny = "A" の場合, Z() の列は 固有値問題 A*z = λ*B*z の nconv (Iparam(4)) 個のリッツ値に対応する近似固有ベクトル(リッツベクトル)を表す.

虚数部が正のリッツ値に対応する複素リッツベクトルは連続する2列に格納される. 最初の列にはリッツベクトルの実数部, 2番目の列には虚数部が入る. 虚数部が負のリッツ値に対応するリッツベクトルは, 単に虚数部が正の場合に対応するリッツベクトルの複素共役になる.

Rvec = 0 (False) または Howmny = "P" の場合, Z() は参照されない.
[in]Sigmarmode = 3 または 4 の場合, シフトの実数部を表す. mode = 1 または 2 の場合, 参照されない.
[in]Sigmaimode = 3 または 4 の場合, シフトの虚数部を表す. mode = 1 または 2 の場合, 参照されない.
[out]Workev()配列 Workev[LWorkev] (LWorkev >= 3*Ncv)
ワークスペース.
[in]BmatDnaupd と同じ. Dnaupd の最終呼び出し後変更せずに渡すこと.
[in]NDnaupd と同じ. Dnaupd の最終呼び出し後変更せずに渡すこと.
[in]WhichDnaupd と同じ. Dnaupd の最終呼び出し後変更せずに渡すこと.
[in]NevDnaupd と同じ. Dnaupd の最終呼び出し後変更せずに渡すこと.
[in]TolDnaupd と同じ. Dnaupd の最終呼び出し後変更せずに渡すこと.
[in]Resid()配列 Resid(LResid - 1) (LResid >= N)
Dnaupd と同じ. Dnaupd の最終呼び出し後変更せずに渡すこと.
[in]NcvDnaupd と同じ. Dnaupd の最終呼び出し後変更せずに渡すこと.
[in,out]V()配列 V(Ldv - 1, LV - 1) (Ldv >= N, LV >= Ncv)
[in] Dnaupd と同じ. Dnaupd の最終呼び出し後変更せずに渡すこと. [out] Rvec = 1 (True) であれば, はじめの nconv 列に求められる不変部分空間を張る近似シュールベクトルが入る.
[in]Iparam()配列 Iparam(LIparam - 1) (LIparam >= 11)
Dnaupd と同じ. Dnaupd の最終呼び出し後変更せずに渡すこと.
[in,out]Ipntr()配列 Ipntr(LIpntr - 1) (LIpntr >= 14)
[in] Dnaupd と同じ. Dnaupd の最終呼び出し後変更せずに渡すこと.
[out] Ipntr(8) 〜 Ipntr(12) には Workl へのポインターが入る.
Ipntr(8): 元の式の Ncv 個のリッツ値の実数部へのポインター.
Ipntr(9): 元の式の Ncv 個のリッツ値の虚数部へのポインター.
Ipntr(10): Ncv 個のそれぞれの誤差限界へのポインター.
Ipntr(11): H の Ncv x Ncv 上疑三角シュール行列へのポインター.
Ipntr(12): 上ヘッセンベルグ行列 H の固有ベクトルからなる Ncv x Ncv 行列へのポインター. Rvec = 1 (True) のときにのみ参照される.
[in]Workd()配列 Workd(LWorkd - 1) (LWorkd >= 3*N)
Dnaupd と同じ. Dnaupd の最終呼び出し後変更せずに渡すこと.
[in,out]Workl()配列 Workl(LWorkl - 1) (LWorkl >= 3*Ncv^2 + 6*Ncv)
[in] Dnaupd と同じ. Dnaupd の最終呼び出し後変更せずに渡すこと. Workl(0) 〜 Workl(Ncv^2 + 3*Ncv - 1) には Dnaupd で得られた情報が入っている. これらは本ルーチンによって変更されることはない.
[out] Workl(Ncv^2 + 3*Ncv) 〜 Workl(3*Ncv^2 + 6*Ncv - 1) には変換していないリッツ値, H の上疑三角行列, および H の関連する不変部分空間の行列表現の実数部および虚数部が入る.
[out]Infoリターンコード.
= 0: 正常終了.
< 0: (-Info)番目の入力パラメータの誤り.
= 11: 初期残差ベクトルが 0 である.
= 12: Dnaupd は十分な精度の固有値を得られなかった.
= 13: Dneupd が得た変換後のリッツ値の数が Dnaupd が得た数と異なる.
= 14: 実シュール形の計算に失敗した (LAPACK ルーチン DLAHQR).
= 15: 固有ベクトルの計算に失敗した (LAPACK ルーチン DTREVC).
出典
ARPACK-NG (https://github.com/opencollab/arpack-ng)
使用例
Dnaupd の使用例を参照せよ.