Le 18/02/2023 à 21:44, J C Nash a écrit :
I wrote first cut at unirootR for Martin M and he revised and put in
Rmpfr.

The following extends Ben's example, but adds the unirootR with trace
output.

c1 <- 4469.822
c2 <- 572.3413
f <- function(x) { c1/x - c2/(1-x) }; uniroot(f, c(1e-6, 1))
uniroot(f, c(1e-6, 1))
library(Rmpfr)
unirootR(f, c(1e-6, 1), extendInt="no", trace=1)

This gives more detail on the iterations, and it looks like the Inf is the
issue. But certainly we could do more to avoid "gotchas" like this. If
someone is interested in some back and forth, I'd be happy to give it a
try, but I think progress would be better with more than one contributor.
For me, the following fix makes the job :

--- nlm.R.old    2018-09-25 10:44:49.000000000 +0200
+++ nlm.R    2023-02-20 10:46:39.893542531 +0100
@@ -143,14 +143,14 @@

     if(check.conv) {
     val <- tryCatch(.External2(C_zeroin2, function(arg) f(arg, ...),
-                   lower, upper, f.lower, f.upper,
+                   lower, upper, f.low., f.upp.,
                    tol, as.integer(maxiter)),
             warning = function(w)w)
     if(inherits(val, "warning"))
         stop("convergence problem in zero finding: ", conditionMessage(val))
     } else {
     val <- .External2(C_zeroin2, function(arg) f(arg, ...),
-              lower, upper, f.lower, f.upper,
+              lower, upper, f.low., f.upp.,
               tol, as.integer(maxiter))
     }
     iter <- as.integer(val[2L])


Best,
Serguei.


Best,

John Nash

On 2023-02-18 12:28, Ben Bolker wrote:
c1 <- 4469.822
c2 <- 572.3413
f <- function(x) { c1/x - c2/(1-x) }; uniroot(f, c(1e-6, 1))
uniroot(f, c(1e-6, 1))


    provides a root at -6.00e-05, which is outside of the specified bounds.  The default value of the "extendInt" argument to uniroot() is "no", as far as I can see ...

$root
[1] -6.003516e-05

$f.root
[1] -74453981

$iter
[1] 1

$init.it
[1] NA

$estim.prec
[1] 6.103516e-05


   I suspect this fails because f(1) (value at the upper bound) is infinite, although setting interval to c(0.01, 1) does work/give a sensible answer ...  (works for a lower bound of 1e-4, fails for 1e-5 ...)

   Setting the upper bound < 1 appears to avoid the problem.

  For what it's worth, the result has an "init.it" component, but the only thing the documentation says about it is " component ‘init.it’ was added in R 3.1.0".

   And, I think (?) that the 'trace' argument only produces any output if the 'extendInt' option is enabled?

   Inspired by https://stackoverflow.com/questions/75494696/solving-a-system-of-non-linear-equations-with-only-one-unknown/75494955#75494955

   cheers
    Ben Bolker

______________________________________________
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel

______________________________________________
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel

______________________________________________
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel

Reply via email to