|
|
◆ zgsevs()
| void zgsevs |
( |
char |
jobz, |
|
|
int |
n, |
|
|
const doublecomplex |
val[], |
|
|
const int |
ptr[], |
|
|
const int |
ind[], |
|
|
int |
base, |
|
|
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)) により複素疎行列の固有値・固有ベクトルを求める. 疎行列は CSC 形式または CSR 形式で格納されているものとする.
固有値問題を解くためには arpack ルーチン znaupd および zneupd (シフト&インバートモード (Mode 3)) を使用する.
シフト&インバートモードではσ(シフト)を指定してその近くの固有値を求めることができる.
元の固有値問題を としたとき, OP = (A - σ*I)^(-1) として, 別の固有値問題 の固有値νを求めたとすると, 元の問題の固有値λを ν = 1/(λ - σ) より求めることができる. すなわち, 最大のνを求めれば, σに最も近いλを求めることができる.
- 引数
-
| [in] | jobz | = 'N': 固有値のみ求める.
= 'V': 固有値と固有ベクトルを求める. |
| [in] | n | 行列の行および列数. (n >= 0) (n = 0 の場合, 処理を行わずに戻る) |
| [in] | val[] | 配列 val[lval] (lval >= nnz)
入力行列の非ゼロ要素の値. (nnz は非ゼロ要素数) |
| [in] | ptr[] | 配列 ptr[lptr] (lptr >= n + 1)
入力行列の列ポインタ(CSC形式の場合)または行ポインタ(CSR形式の場合). |
| [in] | ind[] | 配列 ind[lind] (lind >= nnz)
入力行列の行インデクス(CSC形式の場合)または列インデクス(CSR形式の場合). (nnz は非ゼロ要素数) |
| [in] | base | ptr[] および ind[] のインデクス形式.
= 0: 0-ベース(C形式): 開始インデクス値が 0.
= 1: 1-ベース(Fortran形式): 開始インデクス値が 1. |
| [in] | format | 行列の格納形式.
= 0: CSR 形式.
= 1: CSC 形式. |
| [in] | sigma | シフト&インバートモード (OP = (A - σ*I)^(-1), B = I) におけるシフトσ. |
| [out] | d[] | 配列 d[ld] (ld >= nev)
A*z = λ*z の固有値のリッツ値による近似が入る. |
| [in] | ldz | 配列 z の整合寸法 (リッツベクトルを求めるとき ldz >= n, そうでないとき ldz >= 1) |
| [out] | z[] | 配列 z[ldz * lz] (lz >= nev)
固有値問題 A*z = λ*z のリッツ値に対応するリッツベクトル(近似固有ベクトル)を返す.
jobz = 'N' の場合, z[] は参照されない. |
| [in] | which | OP = (A - σ*I)^(-1) の固有値について次のように求められる.
= "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 >= 2*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: 最大反復回数に達した. iparam[4] に収束したリッツ値の数を返す.
= 3: リスタート付きアーノルディ反復中にシフト値が適用できなかった. ncv を nev に比較して大きくすると改善するかもしれない (ncv >= 2*nev が推奨される).
= 11: 初期残差ベクトルが 0 である.
= 12: アーノルディ分解に失敗した.
= 13: LAPACK ルーチンで固有値の計算に失敗した.
= 14: znaupd は十分な精度の固有値を得られなかった.
= 15 〜 19: 内部処理エラー. |
|