[Rd] RFC: a "safe" uniroot() function for future R
Berend Hasselman
bhh at xs4all.nl
Mon Jun 3 09:01:25 CEST 2013
On 31-05-2013, at 10:34, Martin Maechler <maechler at stat.math.ethz.ch> wrote:
…..
> From the current feedbacks, I'd come to propose / further
> discuss the following issues:
>
> 1) the goal is to remain with one function uniroot()
>
> 2) Instead of the 'Sig' = "sign(f'(x_0))" {not quite, but typically}
> with 4 different value classes, namely
> NULL, -1, 0, 1, (where +/- 1 are equivalent to any positive
> or negative finite number respectively),
>
> we should either use a string with 4 different possible values
> or a {logical or NULL}, say 'upcrossing'
> (which also gives 4 values, NULL, NA, FALSE, TRUE).
>
>
> 3) [I'm not sure about this:]
> The new default of the 'Sig' replacement would correspond to
> the current Sig = NULL which does extend the search
> interval when that does not constitute a sign change.
>
> Alternatively, implicitly proposed by Ravi Varadhan, the
> default would correspond to Sig = 0, i.e. to the current
> uniroot() behavior which signals an error as soon as the initial
> interval is not large enough.
>
> Further opinions and suggestions for '2)' and '3)' are still
> very welcome!
I agree with Ravi. Ravi's example shows what can go wrong.
Let the default behaviour of a new uniroot() be the current behaviour.
No harm will be done to any existent applications.
An option would be to append a suggestion to the current error message: "Consider setting argument Sig to non-zero to expand the range of x" or something similar when Sig = 0 and uniroot can't find a solution.
In addition I think that it should be possible to specify an absolute lower and upper limit for x in order to avoid evaluating a function for invalid values of its argument (e.g. log(x) for negative x)
Silly example:
xstart <- c(100,110)
unirootS(f, xstart, Sig=10,trace=2)
Berend
More information about the R-devel
mailing list