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

◆ zgsgvs()

void zgsgvs ( char  jobz,
char  uplo2,
int  n,
const doublecomplex  val[],
const int  ptr[],
const int  ind[],
int  base,
const doublecomplex  val2[],
const int  ptr2[],
const int  ind2[],
int  base2,
int  format,
doublecomplex  sigma,
doublecomplex  d[],
int  ldz,
doublecomplex  z[],
const char *  which,
int  nev,
double  tol,
doublecomplex  resid[],
int  ncv,
int  ldv,
doublecomplex  v[],
int  maxiter,
doublecomplex  workd[],
doublecomplex  workl[],
int  lworkl,
doublecomplex  workev[],
double  rwork[],
int  iwork[],
int *  info 
)

一般化固有値問題 (複素疎行列) (シフト&インバートモード) (ドライバ)

目的
本ルーチンはリスタート付きアーノルディ法 (Implicitly restarted Arnoldi method: IRAM) により一般化固有値問題
Ax = λBx
の固有値および必要により固有ベクトルを求める. ここで, A は複素一般疎行列, B は正定値エルミート疎行列である.

疎行列 A は CSC 形式または CSR 形式で格納されているものとする. また, エルミート疎行列 B は上三角部分のみ, 下三角部分のみあるいは両方(行列全体)が CSC 形式または CSR 形式で格納されているものとする.

一般化固有値問題を解くためには arpack ルーチン znaupd および zneupd (シフト&インバートモード (Mode 3)) を使用する.

シフト&インバートモードではσ(シフト)を指定してその近くの固有値を求めることができる.
OP = (A - σ*M)^(-1)*M, M = B として, 固有値問題
OPx = νMx
の固有値νを求めたとすると, 元の問題の固有値λを ν = 1/(λ - σ) より求めることができる. すなわち, 最大のνを求めれば, σに最も近いλを求めることができる.
引数
[in]jobz= 'N': 固有値のみ求める.
= 'V': 固有値と固有ベクトルを求める.
[in]uplo2行列 B の上三角部分あるいは下三角部分のどちらが格納されているかを指定.
= 'U': 上三角部分.
= 'L': 下三角部分.
= 'B': 行列全体(上および下三角部分).
指定された以外の三角部分(対角成分をを除く)は無視される.
[in]n行列の行および列数. (n >= 0) (n = 0 の場合, 処理を行わずに戻る)
[in]val[]配列 val[lval] (lval >= nnz)
行列 A の非ゼロ要素の値. (nnz は非ゼロ要素数)
[in]ptr[]配列 ptr[lptr] (lptr >= n + 1)
行列 A の列ポインタ(CSC 形式の場合)または行ポインタ(CSR 形式の場合).
[in]ind[]配列 ind[lind] (lind >= nnz)
行列 A の行インデクス(CSC形式の場合)または列インデクス(CSR形式の場合). (nnz は非ゼロ要素数)
[in]baseptr[] および ind[] のインデクス形式.
= 0: 0-ベース(C形式): 開始インデクス値が 0.
= 1: 1-ベース(Fortran形式): 開始インデクス値が 1.
[in]val2[]配列 val2[lval2] (lval2 >= nnz2)
行列 B の非ゼロ要素の値. (nnz2 は非ゼロ要素数)
[in]ptr2[]配列 ptr2[lptr2] (lptr2 >= n + 1)
行列 B の列ポインタ(CSC 形式の場合)または行ポインタ(CSR 形式の場合).
[in]ind2[]配列 ind2[lind2] (lind2 >= nnz2)
行列 B の行インデクス(CSC形式の場合)または列インデクス(CSR形式の場合). (nnz2 は非ゼロ要素数)
[in]base2ptr2[] および ind2[] のインデクス形式.
= 0: 0-ベース(C形式): 開始インデクス値が 0.
= 1: 1-ベース(Fortran形式): 開始インデクス値が 1.
[in]format行列 A および B の格納形式.
= 0: CSR 形式.
= 1: CSC 形式.
[in]sigmaシフト&インバートモード (OP = (A - σ*M)^(-1)*M, M = B) におけるシフトσ.
[out]d[]配列 d[ld] (ld >= nev)
A*z = λ*B*z の固有値のリッツ値による近似が入る.
[in]ldz配列 z の整合寸法 (リッツベクトルを求めるとき ldz >= n, そうでないとき ldz >= 1)
[out]z[]配列 z[ldz * lz] (lz >= nev)
固有値問題 A*z = λ*B*z のリッツ値に対応するリッツベクトル(近似固有ベクトル)を返す.
jobz = 'N' の場合, z[] は参照されない.
[in]which求める固有値を指定する. ただし, この指定は OP = (A - σ*M)^(-1)*M の固有値νを基準に適用される(d にはλが返される). 一般的には, "LM"とすればσの最も近くの固有値λを求めることができる.
= "LM": 絶対値最大のものから nev 個の固有値を求める.
= "SM": 絶対値最小のものから nev 個の固有値を求める.
= "LR": 実数部が最大のものから nev 個の固有値を求める.
= "SR": 実数部が最小のものから nev 個の固有値を求める.
= "LI": 虚数部が最大のものから nev 個の固有値を求める.
= "SI": 虚数部が最小のものから nev 個の固有値を求める.
[in]nev求める固有値の数. (0 < nev < n)
[in]tol停止基準: リッツ値の最大相対誤差. tol <= 0 の場合, マシン精度とみなす.
[out]resid[]配列 resid[lresid] (lresid >= n)
残差ベクトル.
[in]ncv行列 V の列数. (nev < ncv <= n)
各反復において生成されるアーノルディ基底ベクトルの数 (ncv >= 2*nev が推奨される).
[in]ldv配列 v の整合寸法. (ldv >= n)
[out]v[]配列 v[ldv * lv] (lv >= ncv)
ncv 本のアーノルディ基底ベクトルからなる行列 V.
[in]maxiterアーノルディ反復の最大回数.
[out]workd[]配列 workd[lworkd] (lworkd >= 3*n)
リバースコミュニケーションに使われる分散作業領域.
[out]workl[]配列 workl[lworkl]
ローカル作業領域.
[in]lworkl配列 workl[]のサイズ. (lworkl >= 3*ncv^2 + 5*ncv)
[out]workev[]配列 workev[lworkev] (lworkev >= 3*ncv)
倍精度実数作業領域.
[out]rwork[]配列 rwork[lrwork] (lrwork >= ncv)
(複製された)プライベート作業領域.
[out]iwork[]配列 iwork[liwork] (liwork >= max(ncv, 3))
整数作業領域.
iwork[0], ..., iwork[2] に次の値を返す.
iwork[0]: アーノルディ反復回数.
iwork[1]: 収束条件を満たすリッツ値の数 (nconv).
iwork[2]: OP*x 操作の回数 (numop).
[out]infoリターンコード.
= 0: 正常終了.
< 0: (-info)番目の入力パラメータの誤り.
= 1: 最大反復回数に達した.
= 3: リスタート付きアーノルディ反復中にシフト値が適用できなかった. ncv を nev に比較して大きくすると改善するかもしれない (ncv >= 2*nev が推奨される).
= 11: 初期残差ベクトルが 0 である.
= 12: アーノルディ分解に失敗した.
= 13: LAPACK ルーチンで固有値の計算に失敗した.
= 14: znaupd は十分な精度の固有値を得られなかった.
= 15 〜 19: 内部処理エラー.