为什么uniroot()给出错误的结果?
fff的正确值介于0.0000085和0.0000086之间,但是为什么uniroot返回我0.0000000000001???请注意,uniroot的tol参数的默认值是tol=.Machine$double.eps^0.25-您得到的答案在这个公差范围内 还要注意,uniroot返回的对象包含错误估计:为什么uniroot()给出错误的结果?,r,R,fff的正确值介于0.0000085和0.0000086之间,但是为什么uniroot返回我0.0000000000001???请注意,uniroot的tol参数的默认值是tol=.Machine$double.eps^0.25-您得到的答案在这个公差范围内 还要注意,uniroot返回的对象包含错误估计: options(scipen=999) fff=function(x)588 * x * 1000000 - 5000 >uniroot(fff, lower=0.0000000000
options(scipen=999)
fff=function(x)588 * x * 1000000 - 5000
>uniroot(fff, lower=0.0000000000001, upper=1, extendInt = "yes",maxiter = 1000000000)$root
[1] 0.0000000000001
> fff(0.0000085)
[1] -2
> fff(0.0000086)
[1] 56.8
您可以显式设置tol并获得更好的答案:
> uniroot(fff, lower=0.0000000000001, upper=1, extendInt = "yes",maxiter = 1000000000)$estim.prec
[1] 0.00006103516
问题来自tol的配置,因为默认公差tol=.Machine$double.eps^0.25无法捕获所需结果的精度 换句话说,您需要提高分辨率,例如,可以通过设置tol=.Machine$double.eps来实现
> uniroot(fff, lower=0.0000000000001, upper=1, extendInt = "yes",maxiter = 1000000000, tol=0.0000001)$root
[1] 0.000008503401
r <- uniroot(
fff,
lower = 0.0000000000001,
upper = 1,
extendInt = "yes",
maxiter = 1000000000,
tol = .Machine$double.eps
)$root
> r
[1] 8.503401e-06
> fff(r)
[1] -9.094947e-13