![](/img/trans.png)
[英]Is there any faster alternative to stats:uniroot function in R?
[英]R function "uniroot": get some mistake
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() 值不是相反的符號
我不明白問題是什么以及如何解決它。
我不明白您要做什么,但是:
當您運行uniroot()
時,它會做的第一件事是評估區間上下端的 function 以查看它們是否具有相反的符號。 如果不是,則不能保證 function 在區間中有根,並且uniroot()
甚至不會嘗試。
您指定的間隔是(-1,1)
。 FX
在區間的兩端都為零,因此FX(x) - U2
在兩端都等於-U2
,因此目標將始終為負數(介於 0 和 -1 之間)並且兩端都為負數。
原則上,您可以設置extendInt = "yes"
讓uniroot()
擴大您正在查看的區間,但這會失敗(“在 1000 次迭代中沒有發現符號變化”),可能是因為您指定的初始區間是對稱的零——因此,如果 R 嘗試在兩側將其擴大相同的量,則(1-x^2)
將始終在區間的兩端具有相同的值,因此您的測試 function 也將相同,因此它將具有同一個標志...
由於您的 function 永遠不會達到 3/4,因此只要您的U2
值大於 3/4(25% 的時間),您的目標 function 就不會有任何真正的根源......
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.