cpqr79.f 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. *DECK CPQR79
  2. SUBROUTINE CPQR79 (NDEG, COEFF, ROOT, IERR, WORK)
  3. C***BEGIN PROLOGUE CPQR79
  4. C***PURPOSE Find the zeros of a polynomial with complex coefficients.
  5. C***LIBRARY SLATEC
  6. C***CATEGORY F1A1B
  7. C***TYPE COMPLEX (RPQR79-S, CPQR79-C)
  8. C***KEYWORDS COMPLEX POLYNOMIAL, POLYNOMIAL ROOTS, POLYNOMIAL ZEROS
  9. C***AUTHOR Vandevender, W. H., (SNLA)
  10. C***DESCRIPTION
  11. C
  12. C Abstract
  13. C This routine computes all zeros of a polynomial of degree NDEG
  14. C with complex coefficients by computing the eigenvalues of the
  15. C companion matrix.
  16. C
  17. C Description of Parameters
  18. C The user must dimension all arrays appearing in the call list
  19. C COEFF(NDEG+1), ROOT(NDEG), WORK(2*NDEG*(NDEG+1))
  20. C
  21. C --Input--
  22. C NDEG degree of polynomial
  23. C
  24. C COEFF COMPLEX coefficients in descending order. i.e.,
  25. C P(Z)= COEFF(1)*(Z**NDEG) + COEFF(NDEG)*Z + COEFF(NDEG+1)
  26. C
  27. C WORK REAL work array of dimension at least 2*NDEG*(NDEG+1)
  28. C
  29. C --Output--
  30. C ROOT COMPLEX vector of roots
  31. C
  32. C IERR Output Error Code
  33. C - Normal Code
  34. C 0 means the roots were computed.
  35. C - Abnormal Codes
  36. C 1 more than 30 QR iterations on some eigenvalue of the
  37. C companion matrix
  38. C 2 COEFF(1)=0.0
  39. C 3 NDEG is invalid (less than or equal to 0)
  40. C
  41. C***REFERENCES (NONE)
  42. C***ROUTINES CALLED COMQR, XERMSG
  43. C***REVISION HISTORY (YYMMDD)
  44. C 791201 DATE WRITTEN
  45. C 890531 Changed all specific intrinsics to generic. (WRB)
  46. C 890531 REVISION DATE from Version 3.2
  47. C 891214 Prologue converted to Version 4.0 format. (BAB)
  48. C 900315 CALLs to XERROR changed to CALLs to XERMSG. (THJ)
  49. C 900326 Removed duplicate information from DESCRIPTION section.
  50. C (WRB)
  51. C 911010 Code reworked and simplified. (RWC and WRB)
  52. C***END PROLOGUE CPQR79
  53. COMPLEX COEFF(*), ROOT(*), SCALE, C
  54. REAL WORK(*)
  55. INTEGER NDEG, IERR, K, KHR, KHI, KWR, KWI, KAD, KJ
  56. C***FIRST EXECUTABLE STATEMENT CPQR79
  57. IERR = 0
  58. IF (ABS(COEFF(1)) .EQ. 0.0) THEN
  59. IERR = 2
  60. CALL XERMSG ('SLATEC', 'CPQR79',
  61. + 'LEADING COEFFICIENT IS ZERO.', 2, 1)
  62. RETURN
  63. ENDIF
  64. C
  65. IF (NDEG .LE. 0) THEN
  66. IERR = 3
  67. CALL XERMSG ('SLATEC', 'CPQR79', 'DEGREE INVALID.', 3, 1)
  68. RETURN
  69. ENDIF
  70. C
  71. IF (NDEG .EQ. 1) THEN
  72. ROOT(1) = -COEFF(2)/COEFF(1)
  73. RETURN
  74. ENDIF
  75. C
  76. SCALE = 1.0E0/COEFF(1)
  77. KHR = 1
  78. KHI = KHR+NDEG*NDEG
  79. KWR = KHI+KHI-KHR
  80. KWI = KWR+NDEG
  81. C
  82. DO 10 K=1,KWR
  83. WORK(K) = 0.0E0
  84. 10 CONTINUE
  85. C
  86. DO 20 K=1,NDEG
  87. KAD = (K-1)*NDEG+1
  88. C = SCALE*COEFF(K+1)
  89. WORK(KAD) = -REAL(C)
  90. KJ = KHI+KAD-1
  91. WORK(KJ) = -AIMAG(C)
  92. IF (K .NE. NDEG) WORK(KAD+K) = 1.0E0
  93. 20 CONTINUE
  94. C
  95. CALL COMQR (NDEG,NDEG,1,NDEG,WORK(KHR),WORK(KHI),WORK(KWR),
  96. 1 WORK(KWI),IERR)
  97. C
  98. IF (IERR .NE. 0) THEN
  99. IERR = 1
  100. CALL XERMSG ('SLATEC', 'CPQR79',
  101. + 'NO CONVERGENCE IN 30 QR ITERATIONS.', 1, 1)
  102. RETURN
  103. ENDIF
  104. C
  105. DO 30 K=1,NDEG
  106. KM1 = K-1
  107. ROOT(K) = CMPLX(WORK(KWR+KM1),WORK(KWI+KM1))
  108. 30 CONTINUE
  109. RETURN
  110. END