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, xSYGVX, xSYGVD,
xSPGV, xSPGVX, xSPGVD,
and (for type 1 only)
xSBGV, xSBGVX and xSBGVD
(see subsection 2.3.5.1).
These decompositions are computed for complex Hermitian matrices
by the driver routines
xHEGV, xHEGVX, xHEGVD,
xHPGV, xHPGVX, xHPGVD,
and (for type 1 only)
xHBGV, xHBGVX, xHBGVD
(see subsection 2.3.5.1).
In each of the following three decompositions,
is real and diagonal with diagonal entries
,
and
the columns zi of Z are linearly independent vectors.
The
are called
eigenvalues and the zi are
eigenvectors.
The approximate error bounds4.10for the computed eigenvalues
are
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 example4.11, if
,
i | ![]() |
EERRBD(i) | true
![]() |
ZERRBD(i) | true
![]() |
1 | -500.0 |
![]() |
![]() |
![]() |
![]() |
2 | 1000. |
![]() |
![]() |
![]() |
![]() |
3 | 1010. |
![]() |
![]() |
![]() |
![]() |
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'' Cholesky factorization (performed by xPBSTF).
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
i | ![]() |
EERRBD(i) | true
![]() |
ZERRBD(i) | true
![]() |
1 |
![]() |
1.3 |
![]() |
![]() |
![]() |
2 |
![]() |
1.6 | 1.5 |
![]() |
![]() |
3 |
![]() |
1.9 | 4.5 |
![]() |
![]() |