1

これは、C++ の LAPACKE_zheevx() 関数を使用した固有値計算の収束に対する適切な許容誤差 ("abstol") の設定に関する質問です。

LAPACKE_zheev() が "abstol" のデフォルト値 (つまり、abstol=-1) で固有値/固有ベクトルを計算するときに収束に失敗した場合、LAPACK のマニュアルでは、abstol=2*DLAMCH('S') を設定するように指示されています。ただし、DLAMCH は Fortran 関数であり、有効な C++ 関数として認識されない C++ を使用しています。C++ で LAPACK を使用する場合 (つまり、LAPACKE を使用する場合)、「abstol=2*DLAMCH('S')」を適切に設定する方法を教えてください。

よろしくお願いします!

背景: LAPACKE は LAPACK (数値代数の Fortran ライブラリ) の C++ インターフェイスです。LAPACKE_zheevx() は、LAPACK の ZHEEVX() 関数に対する LAPACKE の C++ インターフェイスです。

キーワード: LAPACK、LAPACKE、C++、ABSTOL、DLAMCH、CONVERGENCE、EIGENVALUES、EIGENVECTORS

4

2 に答える 2

2

Jon Purdyの答えに加えて(これは実際に行く方法です):

dlamch.fFortranでの の定義は次のとおりです。その関数を調べて、ここから Lapack 組み込み関数を取得すると、入力's'に対して C++ に変換された関数が次のようになることがわかります。

auto dlamch_s()
{
    auto one = 1.0;
    auto rnd = one;
    auto eps = (one == rnd ? 0.5 : 1.0) * std::numeric_limits<double>::epsilon();
    auto sfmin = std::numeric_limits<double>::min();
    auto small = one / std::numeric_limits<double>::max();
    if(small>=sfmin)
    {
        sfmin = small*(one + eps);
    }
    return sfmin;
}

one == rndただし、なぜこの手順が必要なのかは聞かないでください。

于 2016-08-17T21:09:30.570 に答える
2

これらのライブラリについては何も知りませんが、少しグーグルすると、対応するLAPACKE_dlamch()関数があることがわかります。

double LAPACKE_dlamch(char cmach)

したがって、次の(12番目の)パラメーターLAPACKE_dlamch('S')として渡すことができるはずです:abstolLAPACKE_zheevx()

lapack_int LAPACKE_zheevx (
    int matrix_layout,
    char jobz,
    char range,
    char uplo,
    lapack_int n,
    lapack_complex_double *a,
    lapack_int lda,
    double vl,
    double vu,
    lapack_int il,
    lapack_int iu,
    double abstol,
//  ^^^^^^^^^^^^^
    lapack_int *m,
    double *w,
    lapack_complex_double *z,
    lapack_int ldz,
    lapack_int *ifail
)
于 2016-08-17T20:52:59.303 に答える