/* aquadt.c adaptive quadrature numerical integration test */ /* for a desired accuracy on irregular functions. */ /* define the function to be integrated as: */ /* double f(double x) */ /* { */ /* // compute value */ /* return value; */ /* } */ /* */ /* integrate from xmin to xmax */ /* approximate desired absolute error in all intervals, eps */ /* accuracy absolutely not guaranteed */ #include #undef abs #define abs(x) ((x)<0.0?(-(x)):(x)) double aquad(double f(double x), double xmin, double xmax, double eps) { double area, temp, part, h; double err, minint, maxerr; int nmax = 2000; double sbin[2000]; double ebin[2000]; double abin[2000]; int fbin[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