strco.f 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. *DECK STRCO
  2. SUBROUTINE STRCO (T, LDT, N, RCOND, Z, JOB)
  3. C***BEGIN PROLOGUE STRCO
  4. C***PURPOSE Estimate the condition number of a triangular matrix.
  5. C***LIBRARY SLATEC (LINPACK)
  6. C***CATEGORY D2A3
  7. C***TYPE SINGLE PRECISION (STRCO-S, DTRCO-D, CTRCO-C)
  8. C***KEYWORDS CONDITION NUMBER, LINEAR ALGEBRA, LINPACK,
  9. C TRIANGULAR MATRIX
  10. C***AUTHOR Moler, C. B., (U. of New Mexico)
  11. C***DESCRIPTION
  12. C
  13. C STRCO estimates the condition of a real triangular matrix.
  14. C
  15. C On Entry
  16. C
  17. C T REAL(LDT,N)
  18. C T contains the triangular matrix. The zero
  19. C elements of the matrix are not referenced, and
  20. C the corresponding elements of the array can be
  21. C used to store other information.
  22. C
  23. C LDT INTEGER
  24. C LDT is the leading dimension of the array T.
  25. C
  26. C N INTEGER
  27. C N is the order of the system.
  28. C
  29. C JOB INTEGER
  30. C = 0 T is lower triangular.
  31. C = nonzero T is upper triangular.
  32. C
  33. C On Return
  34. C
  35. C RCOND REAL
  36. C an estimate of the reciprocal condition of T .
  37. C For the system T*X = B , relative perturbations
  38. C in T and B of size EPSILON may cause
  39. C relative perturbations in X of size EPSILON/RCOND .
  40. C If RCOND is so small that the logical expression
  41. C 1.0 + RCOND .EQ. 1.0
  42. C is true, then T may be singular to working
  43. C precision. In particular, RCOND is zero if
  44. C exact singularity is detected or the estimate
  45. C underflows.
  46. C
  47. C Z REAL(N)
  48. C a work vector whose contents are usually unimportant.
  49. C If T is close to a singular matrix, then Z is
  50. C an approximate null vector in the sense that
  51. C NORM(A*Z) = RCOND*NORM(A)*NORM(Z) .
  52. C
  53. C***REFERENCES J. J. Dongarra, J. R. Bunch, C. B. Moler, and G. W.
  54. C Stewart, LINPACK Users' Guide, SIAM, 1979.
  55. C***ROUTINES CALLED SASUM, SAXPY, SSCAL
  56. C***REVISION HISTORY (YYMMDD)
  57. C 780814 DATE WRITTEN
  58. C 890531 Changed all specific intrinsics to generic. (WRB)
  59. C 890831 Modified array declarations. (WRB)
  60. C 890831 REVISION DATE from Version 3.2
  61. C 891214 Prologue converted to Version 4.0 format. (BAB)
  62. C 900326 Removed duplicate information from DESCRIPTION section.
  63. C (WRB)
  64. C 920501 Reformatted the REFERENCES section. (WRB)
  65. C***END PROLOGUE STRCO
  66. INTEGER LDT,N,JOB
  67. REAL T(LDT,*),Z(*)
  68. REAL RCOND
  69. C
  70. REAL W,WK,WKM,EK
  71. REAL TNORM,YNORM,S,SM,SASUM
  72. INTEGER I1,J,J1,J2,K,KK,L
  73. LOGICAL LOWER
  74. C***FIRST EXECUTABLE STATEMENT STRCO
  75. LOWER = JOB .EQ. 0
  76. C
  77. C COMPUTE 1-NORM OF T
  78. C
  79. TNORM = 0.0E0
  80. DO 10 J = 1, N
  81. L = J
  82. IF (LOWER) L = N + 1 - J
  83. I1 = 1
  84. IF (LOWER) I1 = J
  85. TNORM = MAX(TNORM,SASUM(L,T(I1,J),1))
  86. 10 CONTINUE
  87. C
  88. C RCOND = 1/(NORM(T)*(ESTIMATE OF NORM(INVERSE(T)))) .
  89. C ESTIMATE = NORM(Z)/NORM(Y) WHERE T*Z = Y AND TRANS(T)*Y = E .
  90. C TRANS(T) IS THE TRANSPOSE OF T .
  91. C THE COMPONENTS OF E ARE CHOSEN TO CAUSE MAXIMUM LOCAL
  92. C GROWTH IN THE ELEMENTS OF Y .
  93. C THE VECTORS ARE FREQUENTLY RESCALED TO AVOID OVERFLOW.
  94. C
  95. C SOLVE TRANS(T)*Y = E
  96. C
  97. EK = 1.0E0
  98. DO 20 J = 1, N
  99. Z(J) = 0.0E0
  100. 20 CONTINUE
  101. DO 100 KK = 1, N
  102. K = KK
  103. IF (LOWER) K = N + 1 - KK
  104. IF (Z(K) .NE. 0.0E0) EK = SIGN(EK,-Z(K))
  105. IF (ABS(EK-Z(K)) .LE. ABS(T(K,K))) GO TO 30
  106. S = ABS(T(K,K))/ABS(EK-Z(K))
  107. CALL SSCAL(N,S,Z,1)
  108. EK = S*EK
  109. 30 CONTINUE
  110. WK = EK - Z(K)
  111. WKM = -EK - Z(K)
  112. S = ABS(WK)
  113. SM = ABS(WKM)
  114. IF (T(K,K) .EQ. 0.0E0) GO TO 40
  115. WK = WK/T(K,K)
  116. WKM = WKM/T(K,K)
  117. GO TO 50
  118. 40 CONTINUE
  119. WK = 1.0E0
  120. WKM = 1.0E0
  121. 50 CONTINUE
  122. IF (KK .EQ. N) GO TO 90
  123. J1 = K + 1
  124. IF (LOWER) J1 = 1
  125. J2 = N
  126. IF (LOWER) J2 = K - 1
  127. DO 60 J = J1, J2
  128. SM = SM + ABS(Z(J)+WKM*T(K,J))
  129. Z(J) = Z(J) + WK*T(K,J)
  130. S = S + ABS(Z(J))
  131. 60 CONTINUE
  132. IF (S .GE. SM) GO TO 80
  133. W = WKM - WK
  134. WK = WKM
  135. DO 70 J = J1, J2
  136. Z(J) = Z(J) + W*T(K,J)
  137. 70 CONTINUE
  138. 80 CONTINUE
  139. 90 CONTINUE
  140. Z(K) = WK
  141. 100 CONTINUE
  142. S = 1.0E0/SASUM(N,Z,1)
  143. CALL SSCAL(N,S,Z,1)
  144. C
  145. YNORM = 1.0E0
  146. C
  147. C SOLVE T*Z = Y
  148. C
  149. DO 130 KK = 1, N
  150. K = N + 1 - KK
  151. IF (LOWER) K = KK
  152. IF (ABS(Z(K)) .LE. ABS(T(K,K))) GO TO 110
  153. S = ABS(T(K,K))/ABS(Z(K))
  154. CALL SSCAL(N,S,Z,1)
  155. YNORM = S*YNORM
  156. 110 CONTINUE
  157. IF (T(K,K) .NE. 0.0E0) Z(K) = Z(K)/T(K,K)
  158. IF (T(K,K) .EQ. 0.0E0) Z(K) = 1.0E0
  159. I1 = 1
  160. IF (LOWER) I1 = K + 1
  161. IF (KK .GE. N) GO TO 120
  162. W = -Z(K)
  163. CALL SAXPY(N-KK,W,T(I1,K),1,Z(I1),1)
  164. 120 CONTINUE
  165. 130 CONTINUE
  166. C MAKE ZNORM = 1.0
  167. S = 1.0E0/SASUM(N,Z,1)
  168. CALL SSCAL(N,S,Z,1)
  169. YNORM = S*YNORM
  170. C
  171. IF (TNORM .NE. 0.0E0) RCOND = YNORM/TNORM
  172. IF (TNORM .EQ. 0.0E0) RCOND = 0.0E0
  173. RETURN
  174. END