Thank you for the quick response, maybe someone can help me clarify one thing. After sifting through this and the boost doc (Double-exponential quadrature - 1.75.0) and, for example, this post by @bbbales2 (tanh_sinh integral is re-scaled internally but the tolerance isn't · Issue #449 · boostorg/math · GitHub), I have a hard time figuring out, what exactly the meaning of “L1” is. In the doc they say
Like the trapezoidal quadrature, the tanh-sinh quadrature produces an estimate of the L1 norm of the integral along with the requested integral. This is to establish a scale against which to measure the tolerance, and to provide an estimate of the condition number of the summation. This can be queried as follows:
But to be precise here, “the integral” is just a number, i.e. its L1-Norm is just its absolute value. Another meaning of “L1 norm” could be “the operator norm of the integration operator I induced by the L1 norm on the space of absolutely integrable functions”, i.e.
\displaystyle || I||_{\infty} = \sup_{f\neq0}\frac{|I(f)|}{||f||_{\infty}},
but this is useless here, since it does not depend on f. Lastly, they could mean the L1 norm of f itself, i.e. \int |f|, which I think is what is being calculated here, since in the boost code we find:
L1_I0 += (abs(yp) + abs(ym))*w;
(granted, I don’t understand everything that’s going on before).
Now in the boost doc (Setting the Maximum Interval Halvings and Memory Requirements - 1.74.0), it says that we want to compare error*L1 > 0.01
.
I understand that we need ||f||_{\infty} to get the condition number, which for integration is given by
\displaystyle\kappa(I(f))=(b-a)\frac{||f||_{\infty}}{|I(f)|},
but why is the error compared to the L1 norm of f and not just the absolute value of the last estimate, i.e. why do we want
\displaystyle |I_n(f) - I_{n+1}(f)| < \mathrm{tol} \cdot ||f||_{\infty} and not
\displaystyle |I_n(f) - I_{n+1}(f)| < \mathrm{tol} \cdot |I_n(f)|?
In my intuitive understanding, we want the change of the estimate, relative to its size, to be small enough (i.e. we don’t get much more information by refining the grid), so if we have a “big” function with ||f||_{\infty}>>0, the integral’s value could still change, but we already reached our exit condition.