[R] making uniroot a bit more robust?

Martin Maechler maechler at stat.math.ethz.ch
Fri Nov 17 23:30:07 CET 2006


 cleaning up my overflowing R mail box...

>>>>> "Tamas" == Tamas K Papp <tpapp at princeton.edu>
>>>>>     on Fri, 27 Oct 2006 16:11:46 -0400 writes:

    Tamas> Hi, I wonder if it would make sense to make uniroot
    Tamas> detect zeros at the endpoints, eg

    Tamas> if f(lower)==0, return lower as the root, else if
    Tamas> f(upper)==0, return upper as the root, else stop if
    Tamas> f(upper)*f(lower) > 0 (currently it stops if >=),
    Tamas> else proceed to the algorithm proper.

    Tamas> Currently I am using a wrapper function to implement
    Tamas> this, and I found it useful.  But I didn't want to
    Tamas> send a (wishlist) bug report before asking on the
    Tamas> list...

good practice. Sorry you didn't get an answer earlier.
"The" list should probably have been R-devel, not R-help...

The following is an example

  > uniroot(function(x) x^2-1, interval=0:1)
  Error in uniroot(function(x) x^2 - 1, interval = 0:1) : 
	  f() values at end points not of opposite sign

Note that the error message is well appropriate;
However I agree that uniroot() should ideally behave a bit more
smartly.

If you provide a patch, please make sure to use something like

   if ((fl <- f(lower, ...)) == 0) 
      return(list(root=lower, f.root=0, iter=0L, estim.prec = 0)
   if ((fu <- f(upper, ...)) == 0) 
      return(list(root=upper, f.root=0, iter=0L, estim.prec = 0)
   if (fl * fu > 0)
      stop("f() values at end points are of the same sign")

or maybe there's a more elegant way.

Martin Maechler, ETH Zurich



More information about the R-help mailing list