#include #include #include complex f(complex z){ return ((z-2)*z-3)*z+10; } int main(){ complex z; complex p0=0,p1=1,p2=2; for(int n=0;n<10;n++){ complex fp0=f(p0),fp1=f(p1),fp2=f(p2); complex a = (fp0 * p1 - fp0 * p2 - p0 * fp1 + p2 * fp1 + p0 * fp2 - p1 * fp2) / (p0 * p0 * p1 - p0 * p0 * p2 - p0 * p1 * p1 + p0 * p2 * p2 + p1 * p1 * p2 - p1 * p2 * p2); complex b = -(p1 * p1 * fp0 - 2 * fp0 * p1 * p2 + fp0 * p2 * p2 - fp1 * p0 * p0 + 2 * fp1 * p0 * p2 - fp1 * p2 * p2 + fp2 * p0 * p0 - 2 * fp2 * p0 * p2 - p1 * p1 * fp2 + 2 * fp2 * p1 * p2) / (p0 - p2) / (p0 * p1 - p0 * p2 - p1 * p1 + p1 * p2); complex c = fp2; complex dm = -b-csqrt(b*b-4*a*c); complex dp = -b+csqrt(b*b-4*a*c); if(cabs(dm)>cabs(dp)){ z=p2+2*c/dm; } else { z=p2+2*c/dp; } // printf("a=%g,%g, b=%g,%g, c=%g,%g\n",a,b,c); complex fz=f(z); printf("z=%g,%g f(z)=%g,%g\n", creal(z),cimag(z),creal(fz),cimag(fz)); if(cabs(p2-z)<1e-13*cabs(z)) break; p0=p1; p1=p2; p2=z; } return 0; }