0
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() 值不是相反的符号

我不明白问题是什么以及如何解决它。

4

1 回答 1

2

我不明白您要做什么,但是:

当你运行时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% 的时间!),您的目标函数将没有任何真正的根......

于 2021-11-30T22:23:22.413 回答