Использование подпрограммы Zheev в C для вычисления собственных векторов - PullRequest
0 голосов
/ 19 июня 2020

Я пишу код C, в котором мне нужно получить собственные векторы и собственные значения эрмитовой матрицы. Для этого я использую подпрограмму Жеева. Раньше мне нужно было вычислять только собственные значения, и ниже приведены соответствующие фрагменты кода для этого:

1.

extern void zheev_( 
    unsigned char  *JOBZ,
    unsigned char  * UPLO, 
    int            *N, 
    complex double *A, 
    int            *LDA,
    double         *W,
    complex double *WORK,
    int            *LWORK,
    double         *RWORK,
    int            *INFO );

Это было определение подпрограммы, которое я использовал для ввода.

2.

void Diagonalize_eval(complex double *H,int dim, double *W)
unsigned char JOBZ, UPLO;
int N, LDA, LWORK, INFO;

JOBZ='N';
UPLO ='U';
N=dim;
LDA=N;

complex double *WORK=NULL;
LWORK=-1;
WORK=(complex double*)malloc(sizeof(complex double)*3);
double *RWORK=(double*)malloc(sizeof(double)*(3*dim-2));

zheev_( &JOBZ, &UPLO, &N, H, &LDA, W, WORK, &LWORK, RWORK, &INFO );

LWORK=(int)(WORK[0]);
free(WORK);
WORK=(complex double*)malloc(sizeof(complex double)*LWORK);

zheev_( &JOBZ, &UPLO, &N, H, &LDA, W, WORK, &LWORK, RWORK, &INFO );

free(WORK); free(RWORK);

Это была функция, которую я использовал для получения собственных значений.

3.

double *E=( double*)malloc(sizeof(double)*V);
Diagonalize_eval(H,V,E);

И, наконец, я получил собственные значения Вот. Здесь H - это эрмитова матрица VxV.

Я знаю, что мне нужно изменить 'N' на 'V' в значении JOBZ, чтобы получить собственные векторы, но как мне изменить функцию Diagonalize_eval (или написать новый отдельный функция), чтобы получить собственные векторы? Дополнительный вопрос: ортонормированы ли собственные векторы, созданные Жеевым?

...