void zrhqr(float a[], int m, float rtr[], float rti[]) { void balanc(float **a, int n); void hqr(float **a, int n, float wr[], float wi[]); int j,k; float **hess,xr,xi; hess=matrix(1,MAXM,1,MAXM); if (m > MAXM || a[m] == 0.0) nrerror("bad args in zrhqr"); for (k=1;k<=m;k++) { hess[1][k] = -a[m-k]/a[m]; for (j=2;j<=m;j++) hess[j][k]=0.0; if (k != m) hess[k+1][k]=1.0; } balanc(hess,m); hqr(hess,m,rtr,rti); for (j=2;j<=m;j++) { xr=rtr[j]; xi=rti[j]; for (k=j-1;k>=1;k--) { if (rtr[k] <= xr) break; rtr[k+1]=rtr[k]; rti[k+1]=rti[k]; } rtr[k+1]=xr; rti[k+1]=xi; } free_matrix(hess,1,MAXM,1,MAXM); }
int main(void) { int i,j; static float c[NP][NP]= {1.0,2.0,0.0,0.0,0.0, -2.0,3.0,0.0,0.0,0.0, 3.0,4.0,50.0,0.0,0.0, -4.0,5.0,-60.0,7.0,0.0, -5.0,6.0,-70.0,8.0,-9.0}; float *wr,*wi,**a; wr=vector(1,NP); wi=vector(1,NP); a=convert_matrix(&c[0][0],1,NP,1,NP); printf("matrix:\n"); for (i=1;i<=NP;i++) { for (j=1;j<=NP;j++) printf("%12.2f",a[i][j]); printf("\n"); } balanc(a,NP); elmhes(a,NP); hqr(a,NP,wr,wi); printf("eigenvalues:\n"); printf("%11s %16s \n","real","imag."); for (i=1;i<=NP;i++) printf("%15f %14f\n",wr[i],wi[i]); free_convert_matrix(a,1,NP,1,NP); free_vector(wi,1,NP); free_vector(wr,1,NP); return 0; }
int main(void) { int i,j; float *c,*r,**a; c=vector(1,NP); r=vector(1,NP); a=matrix(1,NP,1,NP); for (i=1;i<=NP;i++) for (j=1;j<=NP;j++) a[i][j] = (((i & 1) && !(j & 1)) ? 100.0 : 1.0); /* Write norms */ for (i=1;i<=NP;i++) { r[i]=c[i]=0.0; for (j=1;j<=NP;j++) { r[i] += fabs(a[i][j]); c[i] += fabs(a[j][i]); } } printf("rows:\n"); for (i=1;i<=NP;i++) printf("%12.2f",r[i]); printf("\ncolumns:\n"); for (i=1;i<=NP;i++) printf("%12.2f",c[i]); printf("\n\n***** Balancing matrix *****\n\n"); balanc(a,NP); /* Write norms */ for (i=1;i<=NP;i++) { r[i]=c[i]=0.0; for (j=1;j<=NP;j++) { r[i] += fabs(a[i][j]); c[i] += fabs(a[j][i]); } } printf("rows:\n"); for (i=1;i<=NP;i++) printf("%12.2f",r[i]); printf("\ncolumns:\n"); for (i=1;i<=NP;i++) printf("%12.2f",c[i]); printf("\n"); free_matrix(a,1,NP,1,NP); free_vector(r,1,NP); free_vector(c,1,NP); return 0; }