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;
}
Exemple #2
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;
}
Exemple #3
0
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;

}