// test_aquad.java public class test_aquad { public test_aquad() { double xmin = pass.a; double xmax = pass.b; double eps = 0.001; double area, err, exact; System.out.println("test_aquad.java testing aquad.java x^2, later 1/x"); area = aquad(xmin, xmax, eps); // exact = Math.log(xmax)-Math.log(xmin); // for 1/x exact = 8.0/3.0-xmin*xmin*xmin/3.0; // for x^2 err = area-exact; System.out.println("xmin="+xmin+", xmax="+xmax+", area="+area+ ", exact="+exact+", err="+err+"\n"); xmin = 0.01; area = aquad(xmin, xmax, eps); // f(x) passed below // exact = Math.log(xmax)-Math.log(xmin); // for 1/x exact = 8.0/3.0-xmin*xmin*xmin/3.0; // for x^2 err = area-exact; System.out.println("xmin="+xmin+", xmax="+xmax+", area="+area+ ", exact="+exact+", err="+err+"\n"); xmin = 0.001; area = aquad(xmin, xmax, eps); // exact = Math.log(xmax)-Math.log(xmin); // for 1/x exact = 8.0/3.0-xmin*xmin*xmin/3.0; // for x^2 err = area-exact; System.out.println("xmin="+xmin+", xmax="+xmax+", area="+area+ ", exact="+exact+", err="+err+"\n"); xmin = 0.0001; area = aquad(xmin, xmax, eps); // exact = Math.log(xmax)-Math.log(xmin); // for 1/x exact = 8.0/3.0-xmin*xmin*xmin/3.0; // for x^2 err = area-exact; System.out.println("xmin="+xmin+", xmax="+xmax+", area="+area+ ", exact="+exact+", err="+err+"\n"); xmin = 0.00001; area = aquad(xmin, xmax, eps); // exact = Math.log(xmax)-Math.log(xmin); // for 1/x exact = 8.0/3.0-xmin*xmin*xmin/3.0; // for x^2 err = area-exact; System.out.println("xmin="+xmin+", xmax="+xmax+", area="+area+ ", exact="+exact+", err="+err+"\n"); //xmin = 0.0; //xmax = 1.0; //eps = 0.001; //area = aquad(f1, xmin, xmax, eps); //exact = 29.85832540; //err = area - exact; //System.out.println("xmin="+xmin+", xmax="+xmax+", area="+area+ // ", exact="+exact+", err="+err+"\n"); System.out.println("test_aquad.java finished"); } // aquad adaptive quadrature numerical integration test // for a desired accuracy on irregular functions. // define the function to be integrated as: // double f(double x) in file pass_funct.java // { // // compute value // return value; // } // // integrate from xmin to xmax // approximate desired absolute error in all intervals, eps // accuracy absolutely not guaranteed double aquad(double xmin, double xmax, double eps) // function f(x) comes from pass.f(x) { double area, temp, part, h; double err, minint, maxerr; int nmax = 2000; double sbin[] = new double[2000]; double ebin[] = new double[2000]; double abin[] = new double[2000]; int fbin[] = new int[2000]; int i, j, k, n, nn, done, nf; int kmax = 20; n=32; // initial number of bins h = (xmax-xmin)/(double)n; for(i=0; i=kmax) break; // quit if more than kmax subdivisions area = 0.0; maxerr = 0.0; for(i=0; i maxerr) maxerr = err; if(err*1.414 < eps) // heuristic { fbin[i] = 1; // this interval finished } else { done = 0; // must keep dividing if(nn>=nmax) // quit, out of space { done = 1; for(j=i+1; j