// poly43.java reads 35 coefficents (many may be zero) of polynomial // in x, y, z, up to 4th power terms , all values and arithmetic is complex, // the roots of the polynomial=0 are printed values of x, y, z // real numbers are standard floating point, complex are (readl,imag) // the possible coefficents c___ are: // c + cx*x + cy*y + cz*z + p1 // cxx*x^x + cxy*x*y + cxz*x*z + cyy*y*y + cyz*y*z + czz*z*z + p2 // cxxx*x*x*x + cxxy*x*x*y + cxxz*x*x*z + cxyy*x*y*y + cxyz*x*y*z + p3 // cxzz*x*z*z + cyyy*y*y*y + cyyz*y*y*z + cyzz*y*z*z + czzz*z*z*z + p3 // cxxxx*x*x*x*x + cxxxy*x*x*x*y + cxxxz*x*x*x*z + cxxyy*x*x*y*y + p4 // cxxyz*x*x*y*z + cxxzz*x*x*z*z + cxyyy*x*y*y*y + cxyyz*x*y*y*z + p4 // cxyzz*x*y*z*z + cxzzz*x*z*z*z + cyyyy*y*y*y*y + cyyyz*y*y*y*z + p4 // cyyzz*y*y*z*z + cyzzz*y*z*z*z + czzzz*z*z*z*z p4 // // these coefficents are stored in an array with subscrits P: term // P[0] + P[1]*x + P[2]*y + P[3]*z + // P[4]*x^x + P[5]*x*y + P[6]*x*z + P[7]*y*y + P[8]*y*z + P[9]*z*z + // P[10]*x*x*x + P[11]*x*x*y + P[12]*x*x*z + P[13]*x*y*y + P[14]*x*y*z + // P[15]*x*z*z + P[16]*y*y*y + P[17]*y*y*z + P[18]*y*z*z + P[19]*z*z*z + // P[20]*x*x*x*x + P[21]*x*x*x*y + P[22]*x*x*x*z + P[23]*x*x*y*y + // P[24]*x*x*y*z + P[25]*x*x*z*z + P[26]*x*y*y*y + P[27]*x*y*y*z + // P[28]*x*y*z*z + P[29]*x*z*z*z + P[30]*y*y*y*y + P[31]*y*y*y*z + // P[32]*y*y*z*z + P[33]*y*z*z*z + P[34]*z*z*z*z // // polynomial coefficients are stored in complex array p global // precomputed values xp2=x*x xp3=x*x*x xp4=x*x*x*x yp2,yp3,yp4 zp2,zp3,zp4 // err = eval(x, y, z) computes value of P at point x,y,z // fpxv = fpx(x, y, z) computes derivative of P wrt x // fpyv = fpy(x, y, z) computes derivative of P wrt y // fpzv = fpz(x, y, z) computes derivative of P wrt z // for newtons method // sfpx(P, Der) computes 35 coefficients in Der that is derivative of P wrt x // sfpy(P, Der) computes 35 coefficients in Der that is derivative of P wrt y // sfpz(P, Der) computes 35 coefficients in Der that is derivative of P wrt z import java.io.*; public class poly43 { Complex P[] = new Complex[35]; Complex P1[] = new Complex[35]; Complex P2[] = new Complex[35]; Complex P3[] = new Complex[35]; Complex P4[] = new Complex[35]; Complex pwr[] = new Complex[35]; Complex Der[] = new Complex[35]; Complex Int[] = new Complex[35]; Complex R[] = new Complex[35]; Complex C0 = new Complex(0.0,0.0); Complex C1 = new Complex(1.0,0.0); Complex C2 = new Complex(2.0,0.0); Complex C3 = new Complex(3.0,0.0); Complex C4 = new Complex(4.0,0.0); Complex Chalf = new Complex(0.5,0.0); Complex Cthird = new Complex(0.333333333333333,0.0); Complex Cquarter = new Complex(0.25,0.0); Complex xp2, xp3, xp4, yp2, yp3, yp4, zp2, zp3, zp4; // precomputed powers String eqn[] = {" c [0] ", " cx [1] ", " cy [2] ", " cz [3] ", " cxx [4] ", " cxy [5] ", " cxz [6] ", " cyy [7] ", " cyz [8] ", " czz [9] ", " cxxx [10] ", " cxxy [11] ", " cxxz [12] ", " cxyy [13] ", " cxyz [14] ", " cxzz [15] ", " cyyy [16] ", " cyyz [17] ", " cyzz [18] ", " cyzzz [19] ", " cxxxx [20] ", " cxxxy [21] ", " cxxxz [22] ", " cxxyy [23] ", " cxxyz [24] ", " cxxzz [25] ", " cxyyy [26] ", " cxyyz [27] ", " cxyzz [28] ", " cxzzz [29] ", " cxyyy [30] ", " cxyyz [31] ", " cyyzz [32] ", " cxxxy [33] ", " cxxxx [34] "}; String ends = "end................. "; public poly43() // constructor { Complex x, y, z, tx, ty, tz, err, val, tval; Complex bestx, besty, bestz, bestval, tbestval; Complex bestdx, bestdy, bestdz; Complex dx, dy, dz, tdx, tdy, tdz, tbdx, tbdy, tbdz; Complex mone = new Complex(-1.0,0.0); Complex eye = new Complex(0.0,1.0); Complex meye = new Complex(0.0,-1.0); double tol = 1.0e-6; Complex fpxv, fpyv, fpzv; // values of derivatives System.out.println("poly43 running"); System.out.println("read data that defines polynomial"); read_data(); // initial guess x = C0; // one finds 0,0,0 y = C0; z = C0; xp2 = x.multiply(x); xp3 = x.multiply(xp2); xp4 = x.multiply(xp3); yp2 = y.multiply(y); yp3 = y.multiply(yp2); yp4 = y.multiply(yp3); zp2 = z.multiply(z); zp3 = z.multiply(zp2); zp4 = z.multiply(zp3); // brute force compute roots of P val = eval(x, y, z); System.out.println("val="+val); bestval = val; bestx = x; besty = y; bestz = z; dx = C1; // factor * zero, one, none, eye, -eye dy = C1; dz = C1; tdx = C0; tdy = C0; tdz = C0; bestdx = C0; bestdy = C0; bestdz = C0; tx = C0; ty = C0; tz = C0; System.out.println("x="+x+", y="+y+", z="+z); System.out.println("val="+val); tbestval = bestval; tbdx = tdx; tbdy = tdy; tbdz = tdz; outerloop: for(int n=0; n<2; n++) // iterations { if(bestval.abs() < tol) break outerloop; for(int i=0; i<5; i++) { if(i==0) tdx = C0; // just x if(i==1) tdx = dx; // real if(i==2) tdx = dx.multiply(mone); // -real if(i==3) tdx = dx.multiply(eye); // imag if(i==4) tdx = dx.multiply(meye); // -imag tx = x.add(tdx); for(int j=0; j<5; j++) { if(j==0) tdy = C0; // just y if(j==1) tdy = dy; // real if(j==2) tdy = dy.multiply(mone); // -real if(j==3) tdy = dy.multiply(eye); // imag if(j==4) tdy = dy.multiply(meye); // -imag ty = y.add(tdy); for(int k=0; k<5; k++) { if(k==0) tdz = C0; // just z if(k==1) tdz = dz; // real if(k==2) tdz = dz.multiply(mone); // -real if(k==3) tdz = dz.multiply(eye); // imag if(k==4) tdz = dz.multiply(meye); // -imag tz = z.add(tdz); if(i!=0 | j!=0 | k!=0) // not start { val = eval(tx, ty, tz); System.out.println("tx="+tx+", ty="+ty+", tz="+tz); System.out.println("val="+val); // check if best if(val.abs()0; i--) { if(Pa[i].abs()==0) { n = n-1; } else { break; } } // end i for(int i=0; i19) return -1; return tt[i][j]; } Complex pr2(Complex c1, Complex c2) // product 2 { return c1.multiply(c2); } Complex pr3(Complex c1, Complex c2, Complex c3) // product 3 { return c1.multiply(c2.multiply(c3)); } Complex pr4(Complex c1, Complex c2, Complex c3, Complex c4) // product 4 { return c1.multiply(c2.multiply(c3.multiply(c4))); } Complex pr5(Complex c1, Complex c2, Complex c3, Complex c4, Complex c5) // product 5 { return c1.multiply(c2.multiply(c3.multiply(c4.multiply(c5)))); } // fpx is derivative of polynomial P with respect to x Complex fpx(Complex x, Complex y, Complex z) { // term of derivative // 0 f' P[0]c wrt x Complex deriv = P[1]; // P[1] f' P[1]x // 0 f' P[2]y // 0 f' P[3]z deriv=deriv.add(pr3(P[4],C2,x)); // 2x f' P[4]xx deriv=deriv.add(pr2(P[5],y)); // y f' P[5]xy deriv=deriv.add(pr2(P[6],z)); // z f' P[6]xz // 0 f' P[7]yy // 0 f' P[8]yz // 0 f' P[9]zz deriv=deriv.add(pr3(P[10],C3,xp2)); // 3xx f' P[10]xxx deriv=deriv.add(pr4(P[11],C2,x,y)); // 2xy f' P[11]xxy deriv=deriv.add(pr4(P[12],C2,x,z)); // 2xz f' P[12]xxz deriv=deriv.add(pr2(P[13],yp2)); // yy f' P[13]xyy deriv=deriv.add(pr3(P[14],y,z)); // yz f' P[14]xyz deriv=deriv.add(pr2(P[15],zp2)); // zz f' P[15]xzz // 0 f' P[16]yyy // 0 f' P[17]yyz // 0 f' P[18]yzz // 0 f' P[19]zzz deriv=deriv.add(pr3(P[20],C4,xp3)); // 4xxx f' P[20]xxxx deriv=deriv.add(pr4(P[21],C3,xp2,y)); // 3xxy f' P[21]xxxy deriv=deriv.add(pr4(P[22],C3,xp2,z)); // 3xxz f' P[22]xxxz deriv=deriv.add(pr4(P[23],C2,x,yp2)); // 2xyy f' P[23]xxyy deriv=deriv.add(pr5(P[24],C2,x,y,z)); // 2xyz f' P[24]xxyz deriv=deriv.add(pr4(P[25],C2,x,zp2)); // 2xzz f' P[25]xxzz deriv=deriv.add(pr2(P[26],yp3)); // yyy f' P[26]xyyy deriv=deriv.add(pr3(P[27],yp2,z)); // yyz f' P[27]xyyz deriv=deriv.add(pr3(P[28],y,zp2)); // yzz f' P[28]xyzz deriv=deriv.add(pr2(P[29],zp3)); // zzz f' P[29]xzzz // 0 f' P[30]yyyy // 0 f' P[31]yyyz // 0 f' P[32]yyzz // 0 f' P[33]yzzz // 0 f' P[34]zzzz return deriv; } // end fpx // fpy is derivative of polynomial P with respect to y Complex fpy(Complex x, Complex y, Complex z) { // 0 f' P[0]c wrt y // 0 f' P[1]x Complex deriv = P[2]; // c f' P[2]y // 0 f' P[3]z // 0 f' P[4]xx deriv=deriv.add(pr2(P[5],x)); // x f' P[5]xy // 0 f' P[6]xz deriv=deriv.add(pr3(P[7],C2,y)); // 2y f' P[7]yy deriv=deriv.add(pr2(P[8],z)); // z f' P[8]yz // 0 f' P[9]zz // 0 f' P[10]xxx deriv=deriv.add(pr2(P[11],xp2)); // xx f' P[11]xxy // 0 f' P[12]xxz deriv=deriv.add(pr4(P[13],x,C2,y)); // x2y f' P[13]xyy deriv=deriv.add(pr3(P[14],x,z)); // xz f' P[14]xyz // 0 f' P[15]xzz deriv=deriv.add(pr3(P[16],C3,yp2)); // 3yy f' P[16]yyy deriv=deriv.add(pr4(P[17],C2,y,z)); // 2yz f' P[17]yyz deriv=deriv.add(pr2(P[18],zp2)); // zz f' P[18]yzz // 0 f' P[19]zzz // 0 f' P[20]xxxx deriv=deriv.add(pr2(P[21],xp3)); // xxx f' P[21]xxxy // 3xxz f' P[22]xxxz deriv=deriv.add(pr4(P[23],xp2,C2,y)); // xx2y f' P[23]xxyy deriv=deriv.add(pr3(P[24],xp2,z)); // xxz f' P[24]xxyz // 0 f' P[25]xxzz deriv=deriv.add(pr4(P[26],x,C3,yp2)); // x3yy f' P[26]xyyy deriv=deriv.add(pr5(P[27],x,C2,y,z)); // x2yz f' P[27]xyyz deriv=deriv.add(pr3(P[28],x,zp2)); // xzz f' P[28]xyzz // 0 f' P[29]xzzz deriv=deriv.add(pr3(P[30],C4,yp3)); // 4yyy f' P[30]yyyy deriv=deriv.add(pr4(P[31],C3,yp2,z)); // 3yyz f' P[31]yyyz deriv=deriv.add(pr4(P[32],C2,y,zp2)); // 2yzz f' P[32]yyzz deriv=deriv.add(pr2(P[33],zp3)); // zzz f' P[33]yzzz // 0 f' P[34]zzzz return deriv; } // end fpy // fpz is derivative of polynomial P with respect to z Complex fpz(Complex x, Complex y, Complex z) { // term // 0 f' P[0]c wrt z // 0 f' P[1]x // 0 f' P[2]y Complex deriv = P[3]; // c f' P[3]z // 0 f' P[4]xx // 0 f' P[5]xy deriv=deriv.add(pr2(P[6],x)); // x f' P[6]xz // 0 f' P[7]yy deriv=deriv.add(pr2(P[8],z)); // y f' P[8]yz deriv=deriv.add(pr3(P[9],C2,z)); // 2z f' P[9]zz // 0 f' P[10]xxx // 0 f' P[11]xxy deriv=deriv.add(pr2(P[12],xp2)); // xx f' P[12]xxz // 0 f' P[13]xyy deriv=deriv.add(pr3(P[14],x,y)); // xyz f' P[14]xyz deriv=deriv.add(pr4(P[15],x,C2,z)); // x2z f' P[15]xzz // 0 f' P[16]yyy deriv=deriv.add(pr2(P[17],yp2)); // yy f' P[17]yyz deriv=deriv.add(pr4(P[18],y,C2,z)); // y2z f' P[18]yzz deriv=deriv.add(pr3(P[19],C3,zp2)); // 3zz f' P[19]zzz // 0 f' P[20]xxxx // 0 f' P[21]xxxy deriv=deriv.add(pr2(P[22],xp3)); // xxx f' P[22]xxxz // 0 f' P[23]xxyy deriv=deriv.add(pr3(P[24],xp2,y)); // xxy f' P[24]xxyz deriv=deriv.add(pr4(P[25],xp2,C2,z)); // xx2z f' P[25]xxzz // 0 f' P[26]xyyy deriv=deriv.add(pr3(P[27],x,yp2)); // xyy f' P[27]xyyz deriv=deriv.add(pr5(P[28],x,y,C2,z)); // xy2z f' P[28]xyzz deriv=deriv.add(pr4(P[29],x,C3,z)); // x3zz f' P[29]xzzz // 0 f' P[30]yyyy deriv=deriv.add(pr2(P[31],yp3)); // yyy f' P[31]yyyz deriv=deriv.add(pr4(P[32],yp2,C2,z)); // yy2z f' P[32]yyzz deriv=deriv.add(pr4(P[33],y,C3,z)); // y3zz f' P[33]yzzz deriv=deriv.add(pr3(P[34],C4,z)); // 4zzz f' P[34]zzzz return deriv; } // end fpz // sfpx(P, Der) computes 35 coefficients in der that is derivative of P wrt x void sfpx(Complex P[], Complex Der[]) // ?? at y,z needed or P[2],P[3] { for(int i=0; i<35; i++) Der[i] = C0; // for none Der[0] = P[1]; // [0]c = f'x // none f'y // none f'y // none f'z Der[1] = C2; // [1]x = f'xx ?? Der[1] = Der[1].add(P[2]); // add(y) // [1]x = f'xy ?? } // end sfpx // sfpy(P, Der) computes 35 coefficients in der that is derivative of P wrt y void sfpy(Complex P[], Complex Der[]) // ?? at y,z needed or P[2],P[3] { for(int i=0; i<35; i++) Der[i] = C0; // for none Der[0] = P[1]; // [0]c = f'x // none f'y // none f'y // none f'z Der[2] = C2; // [1]x = f'yy ?? Der[2] = Der[1].add(P[2]); // add(y) // [1]x = f'xy ?? } // end sfpy // sfpz(P, Der) computes 35 coefficients in der that is derivative of P wrt z void sfpz(Complex P[], Complex Der[]) // ?? at x,y needed or P[2],P[3] { for(int i=0; i<35; i++) Der[i] = C0; // for none Der[0] = P[1]; // [0]c = f'x // none f'y // none f'y // none f'z Der[3] = C2; // [1]x = f'xx ?? Der[3] = Der[1].add(P[2]); // add(y) // [1]x = f'xy ?? } // end sfpz void poly_roots(Complex x, Complex y, Complex z, Complex R[]) // of P { Complex tx, ty, tz, err, val, tval; Complex bestx, besty, bestz, bestval, tbestval; Complex fpxv, fpyv, fpzv; double tol = 0.1; System.out.println("poly_roots start x="+x+", y="+y+", z="+z); val = eval(x, y, z); System.out.println("at initial x,y,z val="+val); bestval = val; bestx = x; besty = y; bestz = z; tx = x; ty = y; tz = z; fpxv = fpx(bestx, besty, bestz); System.out.println("fpxv="+fpxv); fpyv = fpy(bestx, besty, bestz); System.out.println("fpyv="+fpyv); fpzv = fpz(bestx, besty, bestz); System.out.println("fpzv="+fpzv); if(fpxv.abs()>tol) tx = x.subtract(val.divide(fpxv)); if(fpyv.abs()>tol) ty = y.subtract(val.divide(fpyv)); if(fpzv.abs()>tol) tz = z.subtract(val.divide(fpzv)); tval = eval(tx, ty, tz); System.out.println("tx="+tx); System.out.println("ty="+ty); System.out.println("tz="+tz); System.out.println("tval="+tval); if(tval.abs()< bestval.abs()) { bestval=tval; bestx = tx; besty = ty; bestz = tz; } else { System.out.println("did not converge"); R[0] = bestx; R[1] = besty; R[2] = bestz; return; } for(int k=0; k<10; k++) { fpxv = fpx(bestx, besty, bestz); System.out.println("fpxv="+fpxv); fpyv = fpy(bestx, besty, bestz); System.out.println("fpyv="+fpyv); fpzv = fpz(bestx, besty, bestz); System.out.println("fpzv="+fpzv); if(fpxv.abs()>tol) tx = bestx.subtract(tval.divide(fpxv)); if(fpyv.abs()>tol) ty = besty.subtract(tval.divide(fpyv)); if(fpzv.abs()>tol) tz = bestz.subtract(tval.divide(fpzv)); tval = eval(tx, ty, tz); System.out.println("tx="+tx); System.out.println("ty="+ty); System.out.println("tz="+tz); System.out.println("tval="+tval); if(tval.abs()< bestval.abs()) { bestval=tval; bestx = tx; besty = ty; bestz = tz; } else { System.out.println("did not converge"); R[0] = bestx; R[1] = besty; R[2] = bestz; return; } } // end k R[0] = bestx; R[1] = besty; R[2] = bestz; } // end poly_root public static void main (String args[]) { new poly43(); // construct and execute } } // end poly34.java