dtrco.f 5.5 KB

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