f08xece.c

/* nag_lapackeig_dhgeqz (f08xec) Example Program.
 *
 * Copyright 2025 Numerical Algorithms Group.
 *
 * Mark 31.1, 2025.
 */
#include<nag.h>
#include<stdio.h>
intmain(void){
/* Scalars */
Integeri,ihi,ilo,inca,irows,j,jlen,k,n,pda,pdb;
Integeralpha_len,beta_len,scale_len,tau_len;
Integerexit_status=0;
doubler;
NagErrorfail;
Nag_OrderTypeorder;
/* Arrays */
double*a=0,*alphai=0,*alphar=0,*b=0,*beta=0;
double*lscale=0,*q=0,*rscale=0,*tau=0,*z=0;
#ifdef NAG_COLUMN_MAJOR
#define A(I, J) a[(J - 1) * pda + I - 1]
#define B(I, J) b[(J - 1) * pdb + I - 1]
order=Nag_ColMajor;
#else
#define A(I, J) a[(I - 1) * pda + J - 1]
#define B(I, J) b[(I - 1) * pdb + J - 1]
order=Nag_RowMajor;
#endif
INIT_FAIL(fail);
printf("nag_lapackeig_dhgeqz (f08xec) Example Program Results\n\n");
/* Skip heading in data file */
scanf("%*[^\n] ");
scanf("%"NAG_IFMT"%*[^\n] ",&n);
pda=n;
pdb=n;
alpha_len=n;
beta_len=n;
scale_len=n;
tau_len=n;
#ifdef NAG_COLUMN_MAJOR
inca=1;
#else
inca=pda;
#endif
/* Allocate memory */
if(!(a=NAG_ALLOC(n*n,double))||
!(alphai=NAG_ALLOC(alpha_len,double))||
!(alphar=NAG_ALLOC(alpha_len,double))||
!(b=NAG_ALLOC(n*n,double))||
!(beta=NAG_ALLOC(beta_len,double))||
!(lscale=NAG_ALLOC(scale_len,double))||
!(q=NAG_ALLOC(1*1,double))||
!(rscale=NAG_ALLOC(scale_len,double))||
!(tau=NAG_ALLOC(tau_len,double))||!(z=NAG_ALLOC(1*1,double))){
printf("Allocation failure\n");
exit_status=-1;
gotoEND;
}
/* READ matrix A from data file */
for(i=1;i<=n;++i){
for(j=1;j<=n;++j)
scanf("%lf",&A(i,j));
}
scanf("%*[^\n] ");
/* READ matrix B from data file */
for(i=1;i<=n;++i){
for(j=1;j<=n;++j)
scanf("%lf",&B(i,j));
}
scanf("%*[^\n] ");
/* Balance matrix pair (A,B) */
/* nag_lapackeig_dggbal (f08whc).
 * Balance a pair of real general matrices
 */
nag_lapackeig_dggbal(order,Nag_DoBoth,n,a,pda,b,pdb,&ilo,&ihi,lscale,
rscale,&fail);
if(fail.code!=NE_NOERROR){
printf("Error from nag_lapackeig_dggbal (f08whc).\n%s\n",fail.message);
exit_status=1;
gotoEND;
}
/* Matrix A after balancing */
/* nag_file_print_matrix_real_gen (x04cac).
 * Print real general matrix (easy-to-use)
 */
fflush(stdout);
nag_file_print_matrix_real_gen(order,Nag_GeneralMatrix,Nag_NonUnitDiag,n,
n,a,pda,"Matrix A after balancing",0,
&fail);
if(fail.code!=NE_NOERROR){
printf("Error from nag_file_print_matrix_real_gen (x04cac).\n%s\n",
fail.message);
exit_status=1;
gotoEND;
}
printf("\n");
/* Matrix B after balancing */
/* nag_file_print_matrix_real_gen (x04cac), see above. */
fflush(stdout);
nag_file_print_matrix_real_gen(order,Nag_GeneralMatrix,Nag_NonUnitDiag,n,
n,b,pdb,"Matrix B after balancing",0,
&fail);
if(fail.code!=NE_NOERROR){
printf("Error from nag_file_print_matrix_real_gen (x04cac).\n%s\n",
fail.message);
exit_status=1;
gotoEND;
}
printf("\n");
/* Reduce B to triangular form using QR */
irows=ihi+1-ilo;
/* nag_lapackeig_dgeqrf (f08aec).
 * QR factorization of real general rectangular matrix
 */
nag_lapackeig_dgeqrf(order,irows,irows,&B(ilo,ilo),pdb,tau,&fail);
if(fail.code!=NE_NOERROR){
printf("Error from nag_lapackeig_dgeqrf (f08aec).\n%s\n",fail.message);
exit_status=1;
gotoEND;
}
/* Apply the orthogonal transformation to matrix A */
/* nag_lapackeig_dormqr (f08agc).
 * Apply orthogonal transformation determined by nag_lapackeig_dgeqrf
 * (f08aec) or nag_lapackeig_dgeqpf (f08bec)
 */
nag_lapackeig_dormqr(order,Nag_LeftSide,Nag_Trans,irows,irows,irows,
&B(ilo,ilo),pdb,tau,&A(ilo,ilo),pda,&fail);
if(fail.code!=NE_NOERROR){
printf("Error from nag_lapackeig_dormqr (f08agc).\n%s\n",fail.message);
exit_status=1;
gotoEND;
}
/* Compute the generalized Hessenberg form of (A,B) */
/* nag_lapackeig_dgghd3 (f08wfc).
 * Orthogonal reduction of a pair of real general matrices
 * to generalized upper Hessenberg form
 */
nag_lapackeig_dgghd3(order,Nag_NotQ,Nag_NotZ,irows,1,irows,&A(ilo,ilo),
pda,&B(ilo,ilo),pdb,q,1,z,1,&fail);
if(fail.code!=NE_NOERROR){
printf("Error from nag_lapackeig_dgghd3 (f08wfc).\n%s\n",fail.message);
exit_status=1;
gotoEND;
}
/* A and B can have corresonding columns negated. To standardize, select sign
 * of corresponding columns so that largest element of A column is positive.
 */
for(j=1;j<=n;++j){
jlen=j+1;
if(jlen>n){
jlen=n;
}
nag_blast_damax_val(jlen,&A(1,j),inca,&k,&r,&fail);
if(A(k+1,j)<0.0){
for(i=1;i<=jlen;++i){
A(i,j)=-A(i,j);
}
for(i=1;i<=j;++i){
B(i,j)=-B(i,j);
}
}
}
/* Matrix A in generalized Hessenberg form */
/* nag_file_print_matrix_real_gen (x04cac), see above. */
fflush(stdout);
nag_file_print_matrix_real_gen(order,Nag_GeneralMatrix,Nag_NonUnitDiag,n,
n,a,pda,"Matrix A in Hessenberg form",0,
&fail);
if(fail.code!=NE_NOERROR){
printf("Error from nag_file_print_matrix_real_gen (x04cac).\n%s\n",
fail.message);
exit_status=1;
gotoEND;
}
printf("\n");
/* Matrix B in generalized Hessenberg form */
/* nag_file_print_matrix_real_gen (x04cac), see above. */
fflush(stdout);
nag_file_print_matrix_real_gen(order,Nag_GeneralMatrix,Nag_NonUnitDiag,n,
n,b,pdb,"Matrix B is triangular",0,&fail);
if(fail.code!=NE_NOERROR){
printf("Error from nag_file_print_matrix_real_gen (x04cac).\n%s\n",
fail.message);
exit_status=1;
gotoEND;
}
/* Compute the generalized Schur form */
/* nag_lapackeig_dhgeqz (f08xec).
 * Eigenvalues and generalized Schur factorization of real
 * generalized upper Hessenberg form reduced from a pair of
 * real general matrices
 */
nag_lapackeig_dhgeqz(order,Nag_EigVals,Nag_NotQ,Nag_NotZ,n,ilo,ihi,a,
pda,b,pdb,alphar,alphai,beta,q,1,z,1,&fail);
if(fail.code!=NE_NOERROR){
printf("Error from nag_lapackeig_dhgeqz (f08xec).\n%s\n",fail.message);
exit_status=1;
gotoEND;
}
/* Print the generalized eigenvalues */
printf("\n Generalized eigenvalues\n");
for(i=1;i<=n;++i){
if(beta[i-1]!=0.0){
printf(" %4"NAG_IFMT" (%7.3f,%7.3f)\n",i,
alphar[i-1]/beta[i-1],alphai[i-1]/beta[i-1]);
}else
printf(" %4"NAG_IFMT"Eigenvalue is infinite\n",i);
}
END:
NAG_FREE(a);
NAG_FREE(alphai);
NAG_FREE(alphar);
NAG_FREE(b);
NAG_FREE(beta);
NAG_FREE(lscale);
NAG_FREE(q);
NAG_FREE(rscale);
NAG_FREE(tau);
NAG_FREE(z);
returnexit_status;
}

AltStyle によって変換されたページ (->オリジナル) /