ctrsna - estimate reciprocal condition numbers for specified eigenvalues and/or right eigenvectors of a complex upper triangular matrix T (or of any matrix Q*T*Q**H with Q unitary)
SUBROUTINE CTRSNA( JOB, HOWMNY, SELECT, N, T, LDT, VL, LDVL, VR, * LDVR, S, SEP, MM, M, WORK, LDWORK, WORK1, INFO) CHARACTER * 1 JOB, HOWMNY COMPLEX T(LDT,*), VL(LDVL,*), VR(LDVR,*), WORK(LDWORK,*) INTEGER N, LDT, LDVL, LDVR, MM, M, LDWORK, INFO LOGICAL SELECT(*) REAL S(*), SEP(*), WORK1(*)
SUBROUTINE CTRSNA_64( JOB, HOWMNY, SELECT, N, T, LDT, VL, LDVL, VR, * LDVR, S, SEP, MM, M, WORK, LDWORK, WORK1, INFO) CHARACTER * 1 JOB, HOWMNY COMPLEX T(LDT,*), VL(LDVL,*), VR(LDVR,*), WORK(LDWORK,*) INTEGER*8 N, LDT, LDVL, LDVR, MM, M, LDWORK, INFO LOGICAL*8 SELECT(*) REAL S(*), SEP(*), WORK1(*)
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 COMPLEX, DIMENSION(:,:) :: T, VL, VR, WORK INTEGER :: N, LDT, LDVL, LDVR, MM, M, LDWORK, INFO LOGICAL, DIMENSION(:) :: SELECT REAL, DIMENSION(:) :: S, SEP, WORK1
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 COMPLEX, DIMENSION(:,:) :: T, VL, VR, WORK INTEGER(8) :: N, LDT, LDVL, LDVR, MM, M, LDWORK, INFO LOGICAL(8), DIMENSION(:) :: SELECT REAL, DIMENSION(:) :: S, SEP, WORK1
#include <sunperf.h>
void ctrsna(char job, char howmny, logical *select, int n, complex *t, int ldt, complex *vl, int ldvl, complex *vr, int ldvr, float *s, float *sep, int mm, int *m, int ldwork, int *info);
void ctrsna_64(char job, char howmny, logical *select, long n, complex *t, long ldt, complex *vl, long ldvl, complex *vr, long ldvr, float *s, float *sep, long mm, long *m, long ldwork, long *info);
ctrsna estimates reciprocal condition numbers for specified eigenvalues and/or right eigenvectors of a complex upper triangular matrix T (or of any matrix Q*T*Q**H with Q unitary).
= '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..
If HOWMNY = 'A', SELECT 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)