You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

dlae2.f 4.8 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. *> \brief \b DLAE2 computes the eigenvalues of a 2-by-2 symmetric matrix.
  2. *
  3. * =========== DOCUMENTATION ===========
  4. *
  5. * Online html documentation available at
  6. * http://www.netlib.org/lapack/explore-html/
  7. *
  8. *> \htmlonly
  9. *> Download DLAE2 + dependencies
  10. *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.tgz?format=tgz&filename=/lapack/lapack_routine/dlae2.f">
  11. *> [TGZ]</a>
  12. *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.zip?format=zip&filename=/lapack/lapack_routine/dlae2.f">
  13. *> [ZIP]</a>
  14. *> <a href="http://www.netlib.org/cgi-bin/netlibfiles.txt?format=txt&filename=/lapack/lapack_routine/dlae2.f">
  15. *> [TXT]</a>
  16. *> \endhtmlonly
  17. *
  18. * Definition:
  19. * ===========
  20. *
  21. * SUBROUTINE DLAE2( A, B, C, RT1, RT2 )
  22. *
  23. * .. Scalar Arguments ..
  24. * DOUBLE PRECISION A, B, C, RT1, RT2
  25. * ..
  26. *
  27. *
  28. *> \par Purpose:
  29. * =============
  30. *>
  31. *> \verbatim
  32. *>
  33. *> DLAE2 computes the eigenvalues of a 2-by-2 symmetric matrix
  34. *> [ A B ]
  35. *> [ B C ].
  36. *> On return, RT1 is the eigenvalue of larger absolute value, and RT2
  37. *> is the eigenvalue of smaller absolute value.
  38. *> \endverbatim
  39. *
  40. * Arguments:
  41. * ==========
  42. *
  43. *> \param[in] A
  44. *> \verbatim
  45. *> A is DOUBLE PRECISION
  46. *> The (1,1) element of the 2-by-2 matrix.
  47. *> \endverbatim
  48. *>
  49. *> \param[in] B
  50. *> \verbatim
  51. *> B is DOUBLE PRECISION
  52. *> The (1,2) and (2,1) elements of the 2-by-2 matrix.
  53. *> \endverbatim
  54. *>
  55. *> \param[in] C
  56. *> \verbatim
  57. *> C is DOUBLE PRECISION
  58. *> The (2,2) element of the 2-by-2 matrix.
  59. *> \endverbatim
  60. *>
  61. *> \param[out] RT1
  62. *> \verbatim
  63. *> RT1 is DOUBLE PRECISION
  64. *> The eigenvalue of larger absolute value.
  65. *> \endverbatim
  66. *>
  67. *> \param[out] RT2
  68. *> \verbatim
  69. *> RT2 is DOUBLE PRECISION
  70. *> The eigenvalue of smaller absolute value.
  71. *> \endverbatim
  72. *
  73. * Authors:
  74. * ========
  75. *
  76. *> \author Univ. of Tennessee
  77. *> \author Univ. of California Berkeley
  78. *> \author Univ. of Colorado Denver
  79. *> \author NAG Ltd.
  80. *
  81. *> \date September 2012
  82. *
  83. *> \ingroup auxOTHERauxiliary
  84. *
  85. *> \par Further Details:
  86. * =====================
  87. *>
  88. *> \verbatim
  89. *>
  90. *> RT1 is accurate to a few ulps barring over/underflow.
  91. *>
  92. *> RT2 may be inaccurate if there is massive cancellation in the
  93. *> determinant A*C-B*B; higher precision or correctly rounded or
  94. *> correctly truncated arithmetic would be needed to compute RT2
  95. *> accurately in all cases.
  96. *>
  97. *> Overflow is possible only if RT1 is within a factor of 5 of overflow.
  98. *> Underflow is harmless if the input data is 0 or exceeds
  99. *> underflow_threshold / macheps.
  100. *> \endverbatim
  101. *>
  102. * =====================================================================
  103. SUBROUTINE DLAE2( A, B, C, RT1, RT2 )
  104. *
  105. * -- LAPACK auxiliary routine (version 3.4.2) --
  106. * -- LAPACK is a software package provided by Univ. of Tennessee, --
  107. * -- Univ. of California Berkeley, Univ. of Colorado Denver and NAG Ltd..--
  108. * September 2012
  109. *
  110. * .. Scalar Arguments ..
  111. DOUBLE PRECISION A, B, C, RT1, RT2
  112. * ..
  113. *
  114. * =====================================================================
  115. *
  116. * .. Parameters ..
  117. DOUBLE PRECISION ONE
  118. PARAMETER ( ONE = 1.0D0 )
  119. DOUBLE PRECISION TWO
  120. PARAMETER ( TWO = 2.0D0 )
  121. DOUBLE PRECISION ZERO
  122. PARAMETER ( ZERO = 0.0D0 )
  123. DOUBLE PRECISION HALF
  124. PARAMETER ( HALF = 0.5D0 )
  125. * ..
  126. * .. Local Scalars ..
  127. DOUBLE PRECISION AB, ACMN, ACMX, ADF, DF, RT, SM, TB
  128. * ..
  129. * .. Intrinsic Functions ..
  130. INTRINSIC ABS, SQRT
  131. * ..
  132. * .. Executable Statements ..
  133. *
  134. * Compute the eigenvalues
  135. *
  136. SM = A + C
  137. DF = A - C
  138. ADF = ABS( DF )
  139. TB = B + B
  140. AB = ABS( TB )
  141. IF( ABS( A ).GT.ABS( C ) ) THEN
  142. ACMX = A
  143. ACMN = C
  144. ELSE
  145. ACMX = C
  146. ACMN = A
  147. END IF
  148. IF( ADF.GT.AB ) THEN
  149. RT = ADF*SQRT( ONE+( AB / ADF )**2 )
  150. ELSE IF( ADF.LT.AB ) THEN
  151. RT = AB*SQRT( ONE+( ADF / AB )**2 )
  152. ELSE
  153. *
  154. * Includes case AB=ADF=0
  155. *
  156. RT = AB*SQRT( TWO )
  157. END IF
  158. IF( SM.LT.ZERO ) THEN
  159. RT1 = HALF*( SM-RT )
  160. *
  161. * Order of execution important.
  162. * To get fully accurate smaller eigenvalue,
  163. * next line needs to be executed in higher precision.
  164. *
  165. RT2 = ( ACMX / RT1 )*ACMN - ( B / RT1 )*B
  166. ELSE IF( SM.GT.ZERO ) THEN
  167. RT1 = HALF*( SM+RT )
  168. *
  169. * Order of execution important.
  170. * To get fully accurate smaller eigenvalue,
  171. * next line needs to be executed in higher precision.
  172. *
  173. RT2 = ( ACMX / RT1 )*ACMN - ( B / RT1 )*B
  174. ELSE
  175. *
  176. * Includes case RT1 = RT2 = 0
  177. *
  178. RT1 = HALF*RT
  179. RT2 = -HALF*RT
  180. END IF
  181. RETURN
  182. *
  183. * End of DLAE2
  184. *
  185. END