Re: tol, atol and rtol behavior of scipy.sparse.linalg solvers

Ilhan Polat <[email protected]> Tue, 2 May 2023 21:09:30 +0200
Newsgroups gmane.comp.python.scientific.devel
Message-ID <CAEBuzr-Qoa_paJ5OwdbyO7YFW+S6zuG47vXUEqQVsU-dupfopg@mail.gmail.com>
 This has turned out to be a really nice teaching moment for me. I was
completely unaware of how much max() prevalent is. I guess spent my time
sitting in a bubble about sum() in my own circles. In fact that's the
reason why I kept using atol in assert_allclose with rtol = 0., in my
faulty line of thinking in hindsight, for better error control.

In the numerical integration schemes, you basically want to keep rtol for
the evolution, that is, from iteration to iteration to track the approach,
hence the name relative and typically atol for the landing. But I can now
see how max() is easier to reason about the 2-norm based control. I might
indeed vote for max() but to be honest I'm more undecided now than
yesterday.




On Tue, May 2, 2023 at 9:04 PM Robert Kern <[email protected]> wrote:

> On Mon, May 1, 2023 at 9:04 PM Charles R Harris <[email protected]>
> wrote:
>
>>
>> On Mon, May 1, 2023 at 5:21 PM Stefan van der Walt <[email protected]>
>> wrote:
>>
>>> On Mon, May 1, 2023, at 11:49, Ilhan Polat wrote:
>>>
>>> If atol is actually set to something, then we return max(atol,
>>> tol*norm(b)). Why max is used I don't understand.
>>>
>>> Typically, atol, rtol pair is used as tol = atol + rtol*<some metric>.
>>> This is more or less what everybody expects from this pair and their naming
>>> is chosen to reflect this. But I'm a bit lost in all the issues I could
>>> read.
>>>
>>>
>>> The first formulation — max(atol, rtol*norm(b)) — is what I'd expect.
>>> I.e., you use atol when answers are small, or rtol for larger answers.  I'm
>>> a bit surprised to see them summed; is this standard?
>>>
>>
>> IIRC, I first saw it in *Numerical Recipes* (1986).
>>
>
> To be fair, I *think* it ultimately derives from a principled combination
> of sources of numerical error. If your inputs have absolute roundoff error
> (i.e. rounded to the nearest 0.0001) and the floating point computation
> contributes `rtol` amount of relative roundoff error during the computation
> (usually something like `n_flops * eps`), then the total error should be
> about the sum of the two.
>
> In general, I still lean towards `max()`. The principled application of
> the sum depends on knowing the details of the computation and the data
> sources to properly scale each of the tolerances. I'm _pretty_ okay with
> understanding the details of these things, but in reality, I'll just stick
> with the defaults and tweak up or down when it doesn't work. And in that
> scenario, `max()` is more interpretable to me.
>
> --
> Robert Kern
> _______________________________________________
> SciPy-Dev mailing list -- [email protected]
> To unsubscribe send an email to [email protected]
> https://mail.python.org/mailman3/lists/scipy-dev.python.org/
> Member address: [email protected]
>

_______________________________________________
SciPy-Dev mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3/lists/scipy-dev.python.org/
Member address: [email protected]