2016-08-17 2 views
1

これはC++のLAPACKE_zheevx()関数による固有値計算の収束のための適切な公差( "abstol")の設定に関する質問です。LAPACKE_zheevx()が収束に失敗しました - C++で2 * DLAMCH( 'S')を使用してABSTOLを増加させる方法は?

デフォルト値「abstol」(すなわちabstol = -1)で固有値/固有ベクトルを計算するときにLAPACKE_zheev()が収束しないとき、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、固有値、EIGENVECTORS

+0

私は文字通りあなたが何を求めているのかは分かりません。最初はボット生成テキストのように見えました。 – tambre

+1

コメントのおかげで、私は質問を言い換えてみましょう。 – Boki

答えて

2

私はこれらのライブラリについては何も知らないが、グーグルのビットは、対応するLAPACKE_dlamch()機能があります明らかに:

double LAPACKE_dlamch(char cmach) 

だから、あなただけのLAPACKE_zheevx()abstol(12)のパラメータとしてLAPACKE_dlamch('S')を渡すことができる必要があります:

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 
) 
(実質的に移動するための方法である)ジョン・パーディの答えに加えて
2

Hereは、Fortranでdlamch.fの定義です。 one == rndステップが必要な理由

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; 
} 

、しかし、私に聞かないでください:その関数を通って行く、とhereからLAPACK、組み込み関数を取得し、一つは入力's'のためにC++に変換機能になることを見ています。

+0

ありがとうたくさんの人!私は今週それを試してみましょう、私は私の発見を投稿します。 – Boki

関連する問題