cpzero.f 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. *DECK CPZERO
  2. SUBROUTINE CPZERO (IN, A, R, T, IFLG, S)
  3. C***BEGIN PROLOGUE CPZERO
  4. C***PURPOSE Find the zeros of a polynomial with complex coefficients.
  5. C***LIBRARY SLATEC
  6. C***CATEGORY F1A1B
  7. C***TYPE COMPLEX (RPZERO-S, CPZERO-C)
  8. C***KEYWORDS POLYNOMIAL ROOTS, POLYNOMIAL ZEROS, REAL ROOTS
  9. C***AUTHOR Kahaner, D. K., (NBS)
  10. C***DESCRIPTION
  11. C
  12. C Find the zeros of the complex polynomial
  13. C P(Z)= A(1)*Z**N + A(2)*Z**(N-1) +...+ A(N+1)
  14. C
  15. C Input...
  16. C IN = degree of P(Z)
  17. C A = complex vector containing coefficients of P(Z),
  18. C A(I) = coefficient of Z**(N+1-i)
  19. C R = N word complex vector containing initial estimates for zeros
  20. C if these are known.
  21. C T = 4(N+1) word array used for temporary storage
  22. C IFLG = flag to indicate if initial estimates of
  23. C zeros are input.
  24. C If IFLG .EQ. 0, no estimates are input.
  25. C If IFLG .NE. 0, the vector R contains estimates of
  26. C the zeros
  27. C ** WARNING ****** If estimates are input, they must
  28. C be separated, that is, distinct or
  29. C not repeated.
  30. C S = an N word array
  31. C
  32. C Output...
  33. C R(I) = Ith zero,
  34. C S(I) = bound for R(I) .
  35. C IFLG = error diagnostic
  36. C Error Diagnostics...
  37. C If IFLG .EQ. 0 on return, all is well
  38. C If IFLG .EQ. 1 on return, A(1)=0.0 or N=0 on input
  39. C If IFLG .EQ. 2 on return, the program failed to converge
  40. C after 25*N iterations. Best current estimates of the
  41. C zeros are in R(I). Error bounds are not calculated.
  42. C
  43. C***REFERENCES (NONE)
  44. C***ROUTINES CALLED CPEVL
  45. C***REVISION HISTORY (YYMMDD)
  46. C 810223 DATE WRITTEN
  47. C 890531 Changed all specific intrinsics to generic. (WRB)
  48. C 890531 REVISION DATE from Version 3.2
  49. C 891214 Prologue converted to Version 4.0 format. (BAB)
  50. C***END PROLOGUE CPZERO
  51. C
  52. REAL S(*)
  53. COMPLEX R(*),T(*),A(*),PN,TEMP
  54. C***FIRST EXECUTABLE STATEMENT CPZERO
  55. IF( IN .LE. 0 .OR. ABS(A(1)) .EQ. 0.0 ) GO TO 30
  56. C
  57. C CHECK FOR EASILY OBTAINED ZEROS
  58. C
  59. N=IN
  60. N1=N+1
  61. IF(IFLG .NE. 0) GO TO 14
  62. 1 N1=N+1
  63. IF(N .GT. 1) GO TO 2
  64. R(1)=-A(2)/A(1)
  65. S(1)=0.0
  66. RETURN
  67. 2 IF( ABS(A(N1)) .NE. 0.0 ) GO TO 3
  68. R(N)=0.0
  69. S(N)=0.0
  70. N=N-1
  71. GO TO 1
  72. C
  73. C IF INITIAL ESTIMATES FOR ZEROS NOT GIVEN, FIND SOME
  74. C
  75. 3 TEMP=-A(2)/(A(1)*N)
  76. CALL CPEVL(N,N,A,TEMP,T,T,.FALSE.)
  77. IMAX=N+2
  78. T(N1)=ABS(T(N1))
  79. DO 6 I=2,N1
  80. T(N+I)=-ABS(T(N+2-I))
  81. IF(REAL(T(N+I)) .LT. REAL(T(IMAX))) IMAX=N+I
  82. 6 CONTINUE
  83. X=(-REAL(T(IMAX))/REAL(T(N1)))**(1./(IMAX-N1))
  84. 7 X=2.*X
  85. CALL CPEVL(N,0,T(N1),CMPLX(X,0.0),PN,PN,.FALSE.)
  86. IF (REAL(PN).LT.0.) GO TO 7
  87. U=.5*X
  88. V=X
  89. 10 X=.5*(U+V)
  90. CALL CPEVL(N,0,T(N1),CMPLX(X,0.0),PN,PN,.FALSE.)
  91. IF (REAL(PN).GT.0.) V=X
  92. IF (REAL(PN).LE.0.) U=X
  93. IF((V-U) .GT. .001*(1.+V)) GO TO 10
  94. DO 13 I=1,N
  95. U=(3.14159265/N)*(2*I-1.5)
  96. 13 R(I)=MAX(X,.001*ABS(TEMP))*CMPLX(COS(U),SIN(U))+TEMP
  97. C
  98. C MAIN ITERATION LOOP STARTS HERE
  99. C
  100. 14 NR=0
  101. NMAX=25*N
  102. DO 19 NIT=1,NMAX
  103. DO 18 I=1,N
  104. IF(NIT .NE. 1 .AND. ABS(T(I)) .EQ. 0.) GO TO 18
  105. CALL CPEVL(N,0,A,R(I),PN,TEMP,.TRUE.)
  106. IF(ABS(REAL(PN))+ABS(AIMAG(PN)) .GT. REAL(TEMP)+
  107. 1 AIMAG(TEMP)) GO TO 16
  108. T(I)=0.0
  109. NR=NR+1
  110. GO TO 18
  111. 16 TEMP=A(1)
  112. DO 17 J=1,N
  113. 17 IF(J .NE. I) TEMP=TEMP*(R(I)-R(J))
  114. T(I)=PN/TEMP
  115. 18 CONTINUE
  116. DO 15 I=1,N
  117. 15 R(I)=R(I)-T(I)
  118. IF(NR .EQ. N) GO TO 21
  119. 19 CONTINUE
  120. GO TO 26
  121. C
  122. C CALCULATE ERROR BOUNDS FOR ZEROS
  123. C
  124. 21 DO 25 NR=1,N
  125. CALL CPEVL(N,N,A,R(NR),T,T(N+2),.TRUE.)
  126. X=ABS(CMPLX(ABS(REAL(T(1))),ABS(AIMAG(T(1))))+T(N+2))
  127. S(NR)=0.0
  128. DO 23 I=1,N
  129. X=X*REAL(N1-I)/I
  130. TEMP=CMPLX(MAX(ABS(REAL(T(I+1)))-REAL(T(N1+I)),0.0),
  131. 1 MAX(ABS(AIMAG(T(I+1)))-AIMAG(T(N1+I)),0.0))
  132. 23 S(NR)=MAX(S(NR),(ABS(TEMP)/X)**(1./I))
  133. 25 S(NR)=1./S(NR)
  134. RETURN
  135. C ERROR EXITS
  136. 26 IFLG=2
  137. RETURN
  138. 30 IFLG=1
  139. RETURN
  140. END