【问题标题】:R function "uniroot": get some mistakeR函数“uniroot”:出错了
【发布时间】:2022-01-07 14:18:13
【问题描述】:
FX <- function(x)(3/4)*(1-x^2)
M <- 5000
X2 <- rep(NA,M)
for (i in 1:M) {
U2 <- runif(1)
fct <- function(x)FX(x)-U2
X2[i] <- uniroot(fct,c(-1,1))$root
}
我曾尝试执行此 R 代码,但每次我都会出错:
uniroot(fct, c(-1, 1)) 中的错误:
f() 端点的值不是相反的符号
我不明白问题是什么以及如何解决它。
【问题讨论】:
标签:
r
error-handling
uniroot
【解决方案1】:
我不明白你在试图做什么,但是:
当您运行uniroot() 时,它会做的第一件事是评估区间上下端的函数,看它们是否具有相反的符号。如果不是,则无法保证函数在区间中有根,uniroot() 甚至不会尝试。
您指定的时间间隔是(-1,1)。 FX在区间的两端都为零,所以FX(x) - U2在两端都等于-U2,所以目标总是负数(在0和-1之间)和两端。
原则上,您可以将extendInt = "yes" 设置为让uniroot() 扩大您正在查看的区间,但这会失败(“在 1000 次迭代中没有发现符号变化”),可能是因为您指定的初始区间是对称的大约为零——因此,如果 R 尝试在两侧将其扩大相同的量,(1-x^2) 在区间的两端将始终具有相同的值,因此您的测试函数也将相同,因此将具有相同的符号...
由于您的函数永远不会超过 3/4,只要您的 U2 值大于 3/4(25% 的时间!),您的目标函数就不会有任何 真正的根源 ...