/* Weierstrass method */ /* weierstrass.c */ #include #include #include #define KMAX 12 #define EPS 1.0e-12 #define N 5 /* f(z) の次数 */ #define r 3.875 /* 零点を含む重心中心の円の半径の上限 */ double complex c = 1.0; /* f(z)の最高次の係数 */ double complex f(double complex z); int main(void) { int i,j,k; double res; /* 残差 */ double complex z[N],z0[N],w; /* Aberth の初期値 */ for(j = 0; j < N;j++){ z[j] =0.6 + r * cexp(I * M_PI * (2.0 * j / N + 1.0 / (2 * N))); } res = 0.0; for(j = 0;j < N;j++) if(res < cabs(f(z[j]))) res = cabs(f(z[j])); k = 0; printf("%2d %10.3e\n",k,res); for(j = 0;j < N;j++) printf(" %d %20.15f %20.15f\n",j,creal(z[j]),cimag(z[j])); while(res > EPS && k < KMAX){ k++; for(j = 0;j < N;j++){ z0[j] = z[j]; } for(j = 0;j < N;j++){ w = 1.0; for(i = 0;i < N;i++){ if (j == i) continue; w *= (z0[j] - z0[i]); } z[j] = z0[j] - f(z0[j]) / (c * w); } res = 0.0; for(j = 0;j < N;j++) if(cabs(f(z[j])) > res) res = cabs(f(z[j])); printf("%2d %10.3e\n",k,res); for(j = 0;j < N;j++) printf(" %d %20.15f %20.15f\n",j,creal(z[j]),cimag(z[j])); } /* end while */ return 0; } double complex f(double complex z) { double complex w; w = -50 + z * (80 + z * (-37 + z * (9 + z * (-3 + z)))); return w; }