Hi,
My eigenvalues appear to be correct for either zheev or zheevd. However, when I retrieve the eigenvectors there is exactly 1 correct eigenvector, the rest aren't orthonormal at all.
Could someone help please?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
typedef struct {
double real, imag;
}doublecomplex;
int main()
{
int n=4;
int width=10;
char v='v', u='u';
int info;
doublecomplex *A;
A=(doublecomplex *) malloc(sizeof(doublecomplex)*n*n);
double w[n];
int lwork = 2*n + n*n;
doublecomplex work[lwork];
int lrwork = 1+5*n +2*n*n;
double rwork[lrwork];
int liwork = 3+5*n;
int iwork[liwork];
int z,i,j=0;
//randomizes a hermitian matrix with values within ->width
srand(time(NULL));
for(i=0;i<n;i++){
A[n*i+i].real=width*(rand() / ((double)RAND_MAX + 1)-0.5);
A[n*i+i].imag=0.0e+00;
printf("A(%d,%d)=%+2.10e+i*%+2.10e\n",i+1,i+1,A[n*i+i].real,A[n*i+i].imag);
for(j=0; j<i;j++){
A[n*i+j].real=width*(rand() / ((double)RAND_MAX + 1)-0.5);
A[n*i+j].imag=width*(rand() / ((double)RAND_MAX + 1)-0.5);
A[n*j+i].real= A[n*i+j].real;
A[n*j+i].imag= -A[n*i+j].imag;
printf("A(%d,%d)=%+2.10e+i*%+2.10e\n",j+1,i+1,A[n*i+j].real,A[n*i+j].imag);
printf("A(%d,%d)=%+2.10e+i*%+2.10e\n",i+1,j+1,A[n*j+i].real,A[n*j+i].imag);
}
}
printf("\n");
zheevd_(&v,&u,&n,A,&n,w,work,&lwork,rwork,&lrwork,iwork,&liwork,&info);
for(i=0;i<n;i++){
printf("E(%d,%d)=%+2.10e\n",i+1,i+1,w[i]);
}
printf("\n");
for(i=0;i<n;i++){
printf("W(%d,%d)=%+2.10e+i*%+2.10e\n",i+1,i+1,A[n*i+i].real,A[n*i+i].imag);
for(j=0; j<i;j++){
printf("W(%d,%d)=%+2.10e+i*%+2.10e\n",j+1,i+1,A[n*i+j].real,A[n*i+j].imag);
printf("W(%d,%d)=%+2.10e+i*%+2.10e\n",i+1,j+1,A[n*j+i].real,A[n*j+i].imag);
}
}
return 0;
}
Users browsing this forum: No registered users and 4 guests