【问题标题】: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% 的时间!),您的目标函数就不会有任何 真正的根源 ...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-03
      • 2018-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多