我正在尝试通过使用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所包含,并且不会发生相同的错误。但是,使用相同的输入获得的两个函数的结果却截然不同。