XLPack 6.1
Excel VBA Numerical Library Reference Manual
Loading...
Searching...
No Matches

◆ Zhegvd()

Sub Zhegvd ( IType As  Long,
Jobz As  String,
Uplo As  String,
N As  Long,
A() As  Complex,
B() As  Complex,
W() As  Double,
Info As  Long 
)

(Divide and conquer driver) Generalized eigenvalue problem of Hermitian matrices

Purpose
This routine computes all the eigenvalues, and optionally, the eigenvectors of a real generalized Hermitian-definite eigenproblem, of the form
A*x = lambda*B*x, A*B*x = lambda*x or B*A*x = lambda*x.
Here A and B are assumed to be Hermitian and B is also positive definite.
If eigenvectors are desired, it uses a divide and conquer algorithm.
Parameters
[in]ItypeSpecifies the problem type to be solved:
= 1: A*x = lambda*B*x.
= 2: A*B*x = lambda*x.
= 3: B*A*x = lambda*x.
[in]Jobz= "N": Compute eigenvalues only.
= "V": Compute eigenvalues and eigenvectors.
[in]Uplo= "U": Upper triangles of A and B are stored.
= "L": Lower triangles of A and B are stored.
[in]NOrder of the matrices A and B. (N >= 0) (If N = 0, returns without computation)
[in,out]A()Array A(LA1 - 1, LA2 - 1) (LA1 >= N, LA2 >= N)
[in] The Hermitian matrix A. If Uplo = "U", the leading N x N upper triangular part of A() contains the upper triangular part of the matrix A. If Uplo = "L", the leading N x N lower triangular part of A() contains the lower triangular part of the matrix A.
[out] Jobz = "V": If Info = 0, A() contains the matrix Z of eigenvectors. The eigenvectors are normalized as follows:
  Itype = 1 or 2: Z^H*B*Z = I
  Itype = 3: Z^H*inv(B)*Z = I
Jobz = "N": The upper triangle (if Uplo = "U") or the lower triangle (if Uplo = "L") of A(), including the diagonal, is destroyed.
[in,out]B()Array B(LB1 - 1, LB2 - 1) (LB1 >= N, LB2 >= N)
[in] The Hermitian positive definite matrix B. If Uplo = "U", the leading N x N upper triangular part of B() contains the upper triangular part of the matrix B. If Uplo = "L", the leading N x N lower triangular part of B() contains the lower triangular part of the matrix B.
[out] If Info <= N, the part of B() containing the matrix is overwritten by the triangular factor U or L from the Cholesky factorization B = U^H*U or B = L*L^H.
[out]W()Array W(LW - 1) (LW >= N)
If Info = 0, the eigenvalues in ascending order.
[out]Info= 0: Successful exit
= -1: The argument Itype had an illegal value (Itype < 1 or Itype > 3)
= -2: The argument Jobz had an illegal value (Jobz <> "V" nor "N")
= -3: The argument Uplo had an illegal value (Uplo <> "U" nor "L")
= -4: The argument N had an illegal value (N < 0)
= -5: The argument A() is invalid.
= -6: The argument B() is invalid.
= -7: The argument W() is invalid.
= i (0 < i <= N): If Jobz = "N", then the algorithm failed to converge; i off-diagonal elements of an intermediate tridiagonal form did not converge to zero. If Jobz = "V", then the algorithm failed to compute an eigenvalue while working on the submatrix lying in rows and columns i/(N + 1) through mod(i, N + 1).
= i (i > N): The leading minor of order i-N of B is not positive definite. The factorization of B could not be completed and no eigenvalues or eigenvectors were computed.
Reference
LAPACK
Example Program
Compute the eigenvalues and the eigenvectors of a generalized Hermitian-definite eigenproblem of the form Ax = λBx, where A is an Hermitian matrix and B is an Hermitian positive definite matrix.
( 0.20 -0.11+0.93i 0.81-0.37i )
A = ( -0.11-0.93i -0.32 -0.80+0.92i )
( 0.81+0.37i -0.80-0.92i -0.29 )
( 2.20 -0.11+0.93i 0.81-0.37i )
B = ( -0.11-0.93i 2.32 -0.80+0.92i )
( 0.81+0.37i -0.80-0.92i 2.29 )
Sub Ex_Zhegvd()
Const N = 3
Dim A(N - 1, N - 1) As Complex, B(N - 1, N - 1) As Complex, W(N - 1) As Double
Dim Info As Long
A(0, 0) = Cmplx(0.2, 0)
A(1, 0) = Cmplx(-0.11, -0.93): A(1, 1) = Cmplx(-0.32, 0)
A(2, 0) = Cmplx(0.81, 0.37): A(2, 1) = Cmplx(-0.8, -0.92): A(2, 2) = Cmplx(-0.29, 0)
B(0, 0) = Cmplx(2.2, 0)
B(1, 0) = Cmplx(-0.11, -0.93): B(1, 1) = Cmplx(2.32, 0)
B(2, 0) = Cmplx(0.81, 0.37): B(2, 1) = Cmplx(-0.8, -0.92): B(2, 2) = Cmplx(2.29, 0)
Call Zhegvd(1, "V", "L", N, A(), B(), W(), Info)
Debug.Print "Eigenvalues =", W(0), W(1), W(2)
Debug.Print "Eigenvectors ="
Debug.Print Creal(A(0, 0)), Cimag(A(0, 0)), Creal(A(0, 1)), Cimag(A(0, 1))
Debug.Print Creal(A(1, 0)), Cimag(A(1, 0)), Creal(A(1, 1)), Cimag(A(1, 1))
Debug.Print Creal(A(2, 0)), Cimag(A(2, 0)), Creal(A(2, 1)), Cimag(A(2, 1))
Debug.Print Creal(A(0, 2)), Cimag(A(0, 2))
Debug.Print Creal(A(1, 2)), Cimag(A(1, 2))
Debug.Print Creal(A(2, 2)), Cimag(A(2, 2))
Debug.Print "Info =", Info
End Sub
Example Results
Eigenvalues = -4.97466704628586 5.03789053905172E-02 0.392451765416646
Eigenvectors =
-0.819151009277443 -3.74256105252903E-17 -0.413822310464714 3.74256105252903E-17
0.320545559438499 -0.890210156692715 -0.332130735287233 1.67477550936547E-02
0.935832442766443 -6.14475107289119E-02 -0.126697019588926 0.325735727937686
-0.354935871366059 -8.42076236819031E-17
0.17251768647939 0.196424402514893
-0.125117400789647 -0.228553336347363
Info = 0