There are three types of problems to consider.
In all cases A and B
are real symmetric (or complex Hermitian) and B is positive definite.
These decompositions are computed for real symmetric matrices
by the driver routines
xSYGV, xSPGV and (for type 1 only) xSBGV (see subsection 2.2.5.1).
These decompositions are computed for complex Hermitian matrices
by the driver routines
xHEGV, xHPGV and (for type 1 only) xHBGV (see subsection 2.2.5.1).
In each of the following three decompositions,
is real and diagonal with diagonal entries
, and
the columns
of Z are linearly independent vectors.
The
are called
eigenvalues and the
are
eigenvectors.
.
The eigendecomposition may be written
and
(or
and
if A and B are complex).
This may also be written
.
.
The eigendecomposition may be written
and
(
and
if A
and B are complex).
This may also be written
.
.
The eigendecomposition may be written
and
(
and
if A
and B are complex).
This may also be written
.
The approximate error bounds
for the computed eigenvalues
are

The approximate error
bounds
for the computed eigenvectors
,
which bound the acute angles between the computed eigenvectors and true
eigenvectors
, are

These bounds are computed differently, depending on which of the above three problems are to be solved. The following code fragments show how.
EPSMCH = SLAMCH( 'E' )
* Solve the eigenproblem A - lambda B (ITYPE = 1)
ITYPE = 1
* Compute the norms of A and B
ANORM = SLANSY( '1', UPLO, N, A, LDA, WORK )
BNORM = SLANSY( '1', UPLO, N, B, LDB, WORK )
* The eigenvalues are returned in W
* The eigenvectors are returned in A
CALL SSYGV( ITYPE, 'V', UPLO, N, A, LDA, B, LDB, W,
$ WORK, LWORK, INFO )
IF( INFO.GT.0 .AND. INFO.LE.N ) THEN
PRINT *,'SSYGV did not converge'
ELSE IF( INFO.GT.N ) THEN
PRINT *,'B not positive definite'
ELSE IF ( N.GT.0 ) THEN
* Get reciprocal condition number RCONDB of Cholesky
* factor of B
CALL STRCON( '1', UPLO, 'N', N, B, LDB, RCONDB,
$ WORK, IWORK, INFO )
RCONDB = MAX( RCONDB, EPSMCH )
CALL SDISNA( 'Eigenvectors', N, N, W, RCONDZ, INFO )
DO 10 I = 1, N
EERRBD( I ) = ( EPSMCH / RCONDB**2 ) *
$ ( ANORM / BNORM + ABS( W(I) ) )
ZERRBD( I ) = ( EPSMCH / RCONDB**3 ) *
$ ( ( ANORM / BNORM ) / RCONDZ(I) +
$ ( ABS( W(I) ) / RCONDZ(I) ) * RCONDB )
10 CONTINUE
END IF
For example, if
,

then ANORM = 120231, BNORM = 120, and RCOND = .8326, and the approximate eigenvalues, approximate error bounds, and true errors are

This code fragment cannot be adapted to use xSBGV (or xHBGV), because xSBGV does not return a conventional Cholesky factor in B, but rather a ``split'' Choleksy factorization (performed by xPBSTF). A future LAPACK release will include error bounds for xSBGV.
EPSMCH = SLAMCH( 'E' )
* Solve the eigenproblem A*B - lambda I (ITYPE = 2)
ITYPE = 2
* Compute the norms of A and B
ANORM = SLANSY( '1', UPLO, N, A, LDA, WORK )
BNORM = SLANSY( '1', UPLO, N, B, LDB, WORK )
* The eigenvalues are returned in W
* The eigenvectors are returned in A
CALL SSYGV( ITYPE, 'V', UPLO, N, A, LDA, B, LDB, W,
$ WORK, LWORK, INFO )
IF( INFO.GT.0 .AND. INFO.LE.N ) THEN
PRINT *,'SSYGV did not converge'
ELSE IF( INFO.GT.N ) THEN
PRINT *,'B not positive definite'
ELSE IF ( N.GT.0 ) THEN
* Get reciprocal condition number RCONDB of Cholesky
* factor of B
CALL STRCON( '1', UPLO, 'N', N, B, LDB, RCONDB,
$ WORK, IWORK, INFO )
RCONDB = MAX( RCONDB, EPSMCH )
CALL SDISNA( 'Eigenvectors', N, N, W, RCONDZ, INFO )
DO 10 I = 1, N
EERRBD(I) = ( ANORM * BNORM ) * EPSMCH +
$ ( EPSMCH / RCONDB**2 ) * ABS( W(I) )
ZERRBD(I) = ( EPSMCH / RCONDB ) * ( ( ANORM *
$ BNORM ) / RCONDZ(I) + 1.0 / RCONDB )
10 CONTINUE
END IF
For the same A and B as above, the approximate eigenvalues, approximate error bounds, and true errors are
