为什么LAPACKE_dsygvd更改矩阵大小后会返回错误?

我正在尝试通过使用LAPACKE_dsygvd解决氢原子的广义特征值问题。对于生成器函数的参数,我使用从0.01开始并以0.01为N步长的间隔。我更改的是N的值。对于N = 14及以下的点,一切都很好,在这里我可以从分析解决方案中得到答案。但是,当我选择N = 15或更高时,会出现错误,并且信息返回的值>N。从LAPACK阅读文档后,它显示以下内容:

N:如果INFO = N + i,则对于1

但是我检查了矩阵B,它是正定的。我不知道怎么了。

下面我显示我的脚本

#include <cmath>
#include <cstdio>
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include "library.h"
#include "mkl.h"

using namespace std;

double Superposition(const double ai,const double aj,const int m);

double Hamiltonian(const double ai,const int m);

void print_matrix(double *A,int n) {
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            printf("%.7f ",A[i*n + j]);
        }
        cout << "\n";
    }
}

void print_vector(double *vec,int n) {
    for (int i = 0; i < n; i++) {
        cout << vec[i] << " ";
    }
    cout << "\n";
}

double* interval(double min,double step) {
    double *result;
    result = (double *)mkl_malloc( N*sizeof( double ),64 );
    for (int i = 0; i < N; i++) {
        result[i] = min + i*step;
    }
    return result;
}   
int main() {
    cout << Ry << "\n";
    double *S,*H,*I,*eigenvalues;
    double alpha,beta;
    int i,j,info;

    char* uplo = "U"; char* jobz = "V";

    I = interval(0.01,0.01);

    alpha = 1.0; beta = 0.0;

    S = (double *)mkl_malloc( N*N*sizeof( double ),64 );
    H = (double *)mkl_malloc( N*N*sizeof( double ),64 );
    eigenvalues = (double *)mkl_malloc( N*sizeof( double ),64 );

    for (i = 0; i < N; i++) {
        for (j = 0; j < N; j++) {
            int index = i*N + j;
            if (j < i) {
                S[index] = 0.0;
                H[index] = 0.0;
            }
            else {
                S[index] = Superposition(I[i],I[j],m);
                H[index] = Hamiltonian(I[i],m);
            }
        }
    }

    print_matrix(S,N); cout << "\n";
    print_matrix(H,N); cout << "\n" << "\n";

    info = LAPACKE_dsygv(LAPACK_ROW_MAJOR,1,*jobz,*uplo,N,H,S,eigenvalues);

    //print_matrix(H,N); cout << "\n";

    //for (i = 0; i < N; i++) {
    //  eigenvalues[i] /= Ry;
    //}
    cout << info << "\n" << "\n";
    print_matrix(H,N); cout << "\n";
    print_vector(eigenvalues,N);

    mkl_free(S);
    mkl_free(H);
    mkl_free(I);
    mkl_free(eigenvalues);
}

*编辑:我使用的dsygvd如MKL所包含,并且不会发生相同的错误。但是,使用相同的输入获得的两个函数的结果却截然不同。

jksaghefi 回答:为什么LAPACKE_dsygvd更改矩阵大小后会返回错误?

暂时没有好的解决方案,如果你有好的解决方案,请发邮件至:iooj@foxmail.com
本文链接:https://www.f2er.com/2663037.html

大家都在问