private double integrationRec(Function<Double, Double> f, double lower, double upper, double res, double counter) {
double localTol = gain * tol;
double half = 0.5 * (lower + upper);
double newResDw = integrator.integrate(f, lower, half);
double newResUp = integrator.integrate(f, half, upper);
double newRes = newResUp + newResDw;
if (Math.abs(res - newRes) < localTol || counter == 0 ||
(Math.abs(res) < 1.e-14 && Math.abs(newResUp) < 1.e-14 && Math.abs(newResDw) < 1.e-14)) {
return newRes + (newRes - res) / gain;
}
return integrationRec(f, lower, half, newResDw, counter - 1) +
integrationRec(f, half, upper, newResUp, counter - 1);
}