C   16

zroots.c

Guest on 15th January 2022 05:04:28 AM

  1. #include <math.h>
  2. #include "complex.h"
  3.  
  4. #define EPS 2.0e-6
  5. #define MAXM 100
  6.  
  7. void zroots(a,m,roots,polish)
  8. fcomplex a[],roots[];
  9. int m,polish;
  10. {
  11.         int jj,j,i;
  12.         fcomplex x,b,c,ad[MAXM];
  13.         void laguer();
  14.  
  15.         for (j=0;j<=m;j++) ad[j]=a[j];
  16.         for (j=m;j>=1;j--) {
  17.                 x=Complex(0.0,0.0);
  18.                 laguer(ad,j,&x,EPS,0);
  19.                 if (fabs(x.i) <= (2.0*EPS*fabs(x.r))) x.i=0.0;
  20.                 roots[j]=x;
  21.                 b=ad[j];
  22.                 for (jj=j-1;jj>=0;jj--) {
  23.                         c=ad[jj];
  24.                         ad[jj]=b;
  25.                         b=Cadd(Cmul(x,b),c);
  26.                 }
  27.         }
  28.         if (polish)
  29.                 for (j=1;j<=m;j++)
  30.                         laguer(a,m,&roots[j],EPS,1);
  31.         for (j=2;j<=m;j++) {
  32.                 x=roots[j];
  33.                 for (i=j-1;i>=1;i--) {
  34.                         if (roots[i].r <= x.r) break;
  35.                         roots[i+1]=roots[i];
  36.                 }
  37.                 roots[i+1]=x;
  38.         }
  39. }
  40.  
  41. #undef EPS
  42. #undef MAXM

Raw Paste


Login or Register to edit or fork this paste. It's free.