/* 複素Newton法 */ /* complex_newton.c */ #include #include #define NMAX 10 #define EPS 1.0e-14 double complex f(double complex z); /* f(z) */ double complex df(double complex z); /* f'(z) */ int main(void) { int n; double absfz; double complex z,u,fz,dfz; z = -1.0 + 1.0 * I; /* 初期値(-1+i) */ n = 0; absfz = cabs(f(z)); printf("%2s %20s %19s %10s\n","n","Re(z_n) ","Im(z_n) ","|f(z_n)|"); printf("%2d %20.15f %19.15f %10.3e\n",n,creal(z),cimag(z),absfz); while(absfz > EPS && n < NMAX) { fz = f(z); dfz = df(z); u = fz/dfz; z = z - u; n++; absfz=cabs(f(z)); printf("%2d %20.15f %19.15f %10.3e\n",n,creal(z),cimag(z),absfz); } return 0; } double complex f(double complex z) { double complex w; w = (z * z - 2.0) * z - 5.0; return w; } double complex df(double complex z) { double complex w; w = 3.0 * z * z - 2.0; return w; }