2016-08-17 8 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++을 사용합니다. 누구든지 제대로 "abstol = 2 * DLAMCH ('S')"C++ (예 : LAPACKE 사용할 때) 함께 LAPACK 사용할 때 어떻게 도와주세요.

대단히 감사드립니다 !!

배경 : LAPACKE는 LAPACK (수치 대수에 대한 Fortran 라이브러리)의 C++ 인터페이스입니다. LAPACKE_zheevx()는 LAPACK의 ZHEEVX() 함수에 대한 LAPACKE의 C++ 인터페이스입니다.

키워드 : LAPACK, LAPACKE, C++, ABSTOL, DLAMCH는, 수렴, 고유 값,

+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는 포트란에서 dlamch.f의 정의입니다.

이 이 이
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 단계가 필요하다 :이 기능을 통해가는, 그리고 here에서 LAPACK - 내장 함수를 받고, 하나는 입력 's' C++로 변환하는 기능에 대한되고 있음을 본다 .

+0

고마워요! 이번 주에 시험해 볼게요. 제 연구 결과를 게시 할게요. – Boki