strsna - estimate reciprocal condition numbers for specified eigenvalues and/or right eigenvectors of a real upper quasi-triangular matrix T (or of any matrix Q*T*Q**T with Q orthogonal)
SUBROUTINE STRSNA( JOB, HOWMNY, SELECT, N, T, LDT, VL, LDVL, VR, * LDVR, S, SEP, MM, M, WORK, LDWORK, WORK1, INFO) CHARACTER * 1 JOB, HOWMNY INTEGER N, LDT, LDVL, LDVR, MM, M, LDWORK, INFO INTEGER WORK1(*) LOGICAL SELECT(*) REAL T(LDT,*), VL(LDVL,*), VR(LDVR,*), S(*), SEP(*), WORK(LDWORK,*)
SUBROUTINE STRSNA_64( JOB, HOWMNY, SELECT, N, T, LDT, VL, LDVL, VR, * LDVR, S, SEP, MM, M, WORK, LDWORK, WORK1, INFO) CHARACTER * 1 JOB, HOWMNY INTEGER*8 N, LDT, LDVL, LDVR, MM, M, LDWORK, INFO INTEGER*8 WORK1(*) LOGICAL*8 SELECT(*) REAL T(LDT,*), VL(LDVL,*), VR(LDVR,*), S(*), SEP(*), WORK(LDWORK,*)
SUBROUTINE TRSNA( JOB, HOWMNY, SELECT, [N], T, [LDT], VL, [LDVL], * VR, [LDVR], S, SEP, MM, M, [WORK], [LDWORK], [WORK1], [INFO]) CHARACTER(LEN=1) :: JOB, HOWMNY INTEGER :: N, LDT, LDVL, LDVR, MM, M, LDWORK, INFO INTEGER, DIMENSION(:) :: WORK1 LOGICAL, DIMENSION(:) :: SELECT REAL, DIMENSION(:) :: S, SEP REAL, DIMENSION(:,:) :: T, VL, VR, WORK
SUBROUTINE TRSNA_64( JOB, HOWMNY, SELECT, [N], T, [LDT], VL, [LDVL], * VR, [LDVR], S, SEP, MM, M, [WORK], [LDWORK], [WORK1], [INFO]) CHARACTER(LEN=1) :: JOB, HOWMNY INTEGER(8) :: N, LDT, LDVL, LDVR, MM, M, LDWORK, INFO INTEGER(8), DIMENSION(:) :: WORK1 LOGICAL(8), DIMENSION(:) :: SELECT REAL, DIMENSION(:) :: S, SEP REAL, DIMENSION(:,:) :: T, VL, VR, WORK
#include <sunperf.h>
void strsna(char job, char howmny, logical *select, int n, float *t, int ldt, float *vl, int ldvl, float *vr, int ldvr, float *s, float *sep, int mm, int *m, int ldwork, int *info);
void strsna_64(char job, char howmny, logical *select, long n, float *t, long ldt, float *vl, long ldvl, float *vr, long ldvr, float *s, float *sep, long mm, long *m, long ldwork, long *info);
strsna estimates reciprocal condition numbers for specified eigenvalues and/or right eigenvectors of a real upper quasi-triangular matrix T (or of any matrix Q*T*Q**T with Q orthogonal).
T must be in Schur canonical form (as returned by SHSEQR), that is, block upper triangular with 1-by-1 and 2-by-2 diagonal blocks; each 2-by-2 diagonal block has its diagonal elements equal and its off-diagonal elements of opposite sign.
= 'E': for eigenvalues only (S);
= 'V': for eigenvectors only (SEP);
= 'B': for both eigenvalues and eigenvectors (S and SEP).
= 'A': compute condition numbers for all eigenpairs;
= 'S': compute condition numbers for selected eigenpairs specified by the array SELECT.
SELECT(j)
must be set to .TRUE.. To select condition numbers
corresponding to a complex conjugate pair of eigenvalues w(j)
and w(j+1), either SELECT(j)
or SELECT(j+1)
or both, must be
set to .TRUE..
If HOWMNY = 'A', SELECT is not referenced.
SEP(j)
is set to 0; this can only occur when the true value would be
very small anyway.
If JOB = 'E', SEP is not referenced.
dimension(LDWORK,N+1)
If JOB = 'E', WORK is not referenced.
dimension(N)
If JOB = 'E', WORK1 is not referenced.
= 0: successful exit
< 0: if INFO = -i, the i-th argument had an illegal value
The reciprocal of the condition number of an eigenvalue lambda is defined as
S(lambda) = |v'*u| / (norm(u)*norm(v))
where u and v are the right and left eigenvectors of T corresponding
to lambda; v' denotes the conjugate-transpose of v, and norm(u)
denotes the Euclidean norm. These reciprocal condition numbers always
lie between zero (very badly conditioned) and one (very well
conditioned). If n = 1, S(lambda)
is defined to be 1.
An approximate error bound for a computed eigenvalue W(i)
is given by
EPS * norm(T) / S(i)
where EPS is the machine precision.
The reciprocal of the condition number of the right eigenvector u corresponding to lambda is defined as follows. Suppose
T = ( lambda c )
( 0 T22 )
Then the reciprocal condition number is
SEP( lambda, T22 ) = sigma-min( T22 - lambda*I )
where sigma-min denotes the smallest singular value. We approximate
the smallest singular value by the reciprocal of an estimate of the
one-norm of the inverse of T22 - lambda*I. If n = 1, SEP(1)
is
defined to be abs(T(1,1)).
An approximate error bound for a computed right eigenvector VR(i)
is given by
EPS * norm(T) / SEP(i)