Hello,
Yes, it's FAQ 7.31 but it's not uniroot's fault.
The proper way of checking the result would be to call the function fun,
not to take the digits output by the print method and compute the
function's expression with them.
rui@rui:~$ R -q -f rhelp.R
fun <- function(x) {x^x -23}
# Clearly the root lies somewhere between 2.75 and 3.00
x0 <- uniroot(fun, lower = 2.75, upper = 3.00, tol = 0.001)
# uniroot result
x0$f.root
#[1] 0.0001136763
# check the root, right
fun(x0$root)
#[1] 0.0001136763
# OP result, wrong
2.923125^2.923125 - 23
#[1] 0.0001222225
sessionInfo()
R version 4.1.1 (2021-08-10)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: Ubuntu 20.04.3 LTS
Matrix products: default
BLAS: /usr/lib/x86_64-linux-gnu/blas/libblas.so.3.9.0
LAPACK: /usr/lib/x86_64-linux-gnu/lapack/liblapack.so.3.9.0
locale:
[1] LC_CTYPE=pt_PT.UTF-8 LC_NUMERIC=C
[3] LC_TIME=pt_PT.UTF-8 LC_COLLATE=pt_PT.UTF-8
[5] LC_MONETARY=pt_PT.UTF-8 LC_MESSAGES=pt_PT.UTF-8
[7] LC_PAPER=pt_PT.UTF-8 LC_NAME=C
[9] LC_ADDRESS=C LC_TELEPHONE=C
[11] LC_MEASUREMENT=pt_PT.UTF-8 LC_IDENTIFICATION=C
attached base packages:
[1] stats graphics grDevices utils datasets methods base
loaded via a namespace (and not attached):
[1] compiler_4.1.1
Also, why change the default tol to a lesser one?
Hope this helps,
Rui Barradas
Às 18:42 de 27/08/21, Jeff Newmiller escreveu:
Yes. This kind of issue is covered in any decent undergraduate course in
numerical methods... it is not specific to R. It is also related to FAQ 7.31.
https://en.m.wikipedia.org/wiki/Root-finding_algorithms
https://en.m.wikipedia.org/wiki/Floating-point_arithmetic#Representable_numbers,_conversion_and_rounding
On August 27, 2021 10:30:38 AM PDT, Thomas Subia via R-help
<r-help@r-project.org> wrote:
Colleagues,
I've been using uniroot to identify a root of an equation.
As a check, I always verify that calculated root.
This is where I need some help.
Consider the following script
fun <- function(x) {x^x -23}
# Clearly the root lies somewhere between 2.75 and 3.00
uniroot(fun, lower = 2.75, upper = 3.00, tol = 0.001)
# output
$root
[1] 2.923125
$f.root
[1] 0.0001136763
# Let's verify this root.
2.923125^2.923125 - 23
0.0001222225
This result is different than what was calculated with uniroot
0.0001222225 # verified check using x = 2.923125
0.0001136763 # using $f.root
Does this imply that the root output of 2.923125 may need more significant
digits displayed?
I suspect that whatever root is calculated, that root may well be dependent
on what interval one defines where the root may occur
and what tolerance one has input.
I am not sure that is the case, nevertheless, it's worth asking the
question.
Some guidance would be appreciated.
Thanks!
Thomas Subia
______________________________________________
R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.
______________________________________________
R-help@r-project.org mailing list -- To UNSUBSCRIBE and more, see
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.