int main(){ double result, teto,base, real; double tol = 0.5e-5; teto = 1+tol; //100% + tol base = 1-tol; //100% - tol result = AdaptiveSimpson(0,4,first,tol); real = 2.0; printf("[%s] the result was: %0.15f\n",((result<real*teto)&&(result>real*base))?"Success":"Fail",result ); result = AdaptiveSimpson(1,3,second,tol); real = 6.9986217091241; printf("[%s] the result was: %0.15f\n",((result<real*teto)&&(result>real*base))?"Success":"Fail",result ); result = AdaptiveSimpson(0,M_PI,third,tol); real = 5.8696044010894; printf("[%s] the result was: %0.15f\n",((result<real*teto)&&(result>real*base))?"Success":"Fail",result ); return 0; }
/// Nested adaptive Simpson integration over a 2D rectangle Float AdaptiveSimpson2D(const std::function<Float(Float, Float)>& f, Float x0, Float y0, Float x1, Float y1, Float eps = 1e-6f, int depth = 6) { /* Lambda function that integrates over the X axis */ auto integrate = [&](Float y) { return AdaptiveSimpson(std::bind(f, std::placeholders::_1, y), x0, x1, eps, depth); }; Float value = AdaptiveSimpson(integrate, y0, y1, eps, depth); return value; }
double AdaptiveSimpson (double a, double b, double (*f) (double x), double tol){ double sab, sacb, c; if(tol == 0){ puts("[Warning] Machine Precision has been reached"); return DoubleSimpson(a,b,f); } sab = Simpson(a,b,f); sacb = DoubleSimpson(a,b,f); if(fabs(sab -sacb) < tol*15 ){ //printf("\t dif: %0.7f 15*tol: %0.7f\n",sab-sacb,15*tol); return sacb; } c = (a+b)/2; sacb = AdaptiveSimpson(a,c,f,tol/2); sacb += AdaptiveSimpson(c,b,f,tol/2); return sacb; }