// pde44e_nuderiv4d.java // forth order pde with fourth degree solution // sufficient points must be available for each order,degree // // given a PDE, a scatering of points in 4D, boundary values, // // solve uxxxx(x,y,z,t) + uyyyy(x,y,z,t) + uzzzz(x,y,z,t) + // utttt(x,y,z,t) + u(x,y,z,t) = F(x,y,z,t) // F(x,y,z,t) = 2*(exp(x)+exp(y)+exp(z)+exp(t)) // // boundary conditions computed using u(x,y,z,t) // analytic solution is uana(x,y,z,t) = exp(x)+exp(y)+exp(z)+exp(t) // soultion, generally not known // used to compute boundary values // used for error checking // U(xf,yf,zf,tf) unknown at nfree vertices, DOF // U(xb,yb,zb,tb) known at nbound boundary vertices, nvert total vertices // nuderiv4d determines cxx etc. at a subset of vertices // // Uxx(xf,yf,zf,tf)= cxx(xf,yf,zf,tf)*U(xf,yf,zf,tf)+ unknown U m=70 points // cxx(xfi,yfi,zfi,tfi)*U(xfi,yfi,zfi.tfi)+...+ // unknown U(xfi,yfi,zfi,tfi) for each xf,yf,zf,tf // cxx(xbj,ybj,zbj,tbj)*U(xbj,ybj,zbj,tbj)+... // known value // ... // f(xf,yf,zf,tf) right hand side, known, computable // // substituting in the PDE, a set of linear simultaneous equations for U(xf,yf) // | a11 a12 ... a1n | |U(xf1,yf1,zf1,tf1)| = rhs(1) n = nfree // | a21 a22 ... a2n | * |U(xf2,yf2,zf2,tf2)| = rhs(2) // ... // | an1 an2 ... ann | |U(xfn,yfn,zfn,tfn)| = rhs(n) // // // rhs(1) = f(xf1,yf1,zf1,tf1) - cxx(xbj,ybj,zbj,tbj)*U(xbj,ybj,zbj,tbj) - // // ip[1]=j any bound xbj,ybj,zbj,tbj // // same code for a21, a22, ... new N.nu4d4 on next point // then rest of DOF points // solve for U(xfi,yfi) i=1..nfree class pde44e_nuderiv4d { int debug = 1; int nvert = 70; // number of unique vertices double x[] = new double[nvert]; double y[] = new double[nvert]; double z[] = new double[nvert]; double t[] = new double[nvert]; int uniqueb[] = new int[nvert]; // boundary vertices int nfree = 1; // degrees of freedom, must be first vertices int nbound = nvert-nfree; // number of boundary vertices double t_start, t_init, t_kf, t_simeq, t_end; pde44e_nuderiv4d() { int order = 4; int m; final int nc=70; // present limit of nuderiv4d double cxxxx[] = new double[nc]; double cyyyy[] = new double[nc]; double czzzz[] = new double[nc]; double ctttt[] = new double[nc]; int ip[] = new int[nc]; double ap; double error, maxerror; t_start = System.currentTimeMillis(); System.out.println("pde44e_nuderiv4d.java running"); System.out.println(" uxxxx(x,y,z,t) + uyyyy(x,y,z,t) + uzzzz(x,y,z,t) +"); System.out.println(" utttt(x,y,z,t) + u(x,y,z,t) = F(x,y,z,t)"); System.out.println("F(x,y,z,t) = 2*(exp(x)+exp(y)+exp(z)+exp(t))"); System.out.println("uana(x,y)=exp(x)+exp(y)+exp(z)+exp(t)"); System.out.println(" solution"); nuderiv4d N = new nuderiv4d(); double U[] = new double[nvert]; // known boundary double A[][] = new double[nfree][nfree]; // matrix double rhs[] = new double[nfree]; // right hand side, forcing function double ug[] = new double[nfree]; // solution computed // read in or generate data points, DOF (free) first, then boundary gen_data4(1); // initialize vertices System.out.println("vertex, x, y"); for(int i=0; i