[英]Uniroot solution in R
我想找到以下函數的根:
x=0.5
f <- function(y) ((1-pbeta(1-exp(-0.002926543
*( 107.2592+y)^1.082618 *exp(0.04097536*(107.2592+y))),shape1=0.2640229,shape2=0.1595841)) -
(1-pbeta(1-exp(-0.002926543*(x)^1.082618 *exp(0.04097536*(x))),shape1=0.2640229,shape2=0.1595841))^2)
sroot=uniroot(f, lower=0, upper=1000)$root
uniroot錯誤(f,lower = 0,upper = 1000):端點處的f()值不是符號相反
我該如何解決錯誤?
uniroot()
並謹慎使用它
uniroot
正在實施粗略的二分法 。 這種方法比(准)牛頓方法簡單得多,但需要更強的假設來確保根的存在: f(lower) * f(upper) < 0
。
這可能非常痛苦,因為這種假設是一個充分條件,但不是必要條件。 在實踐中,如果f(lower) * f(upper) > 0
,仍然可能存在根,但由於這不是100%肯定,因此二分法不能冒風險。
考慮這個例子:
# a quadratic polynomial with root: -2 and 2
f <- function (x) x ^ 2 - 4
顯然, [-5, 5]
有根源。 但
uniroot(f, lower = -5, upper = 5)
#Error in uniroot(f, lower = -5, upper = 5) :
# f() values at end points not of opposite sign
實際上,二分法的使用需要對f
觀察/檢查,以便可以提出根所在的合理區間。 在R中,我們可以使用curve()
:
curve(f, from = -5, to = 5); abline(h = 0, lty = 3)
從圖中,我們觀察到根存在於[-5, 0]
或[0, 5]
。 所以這些工作正常:
uniroot(f, lower = -5, upper = 0)
uniroot(f, lower = 0, upper = 5)
你的問題
現在讓我們試試你的功能(為了便於閱讀,我將它分成了幾行;用這種方式檢查正確性也很容易):
f <- function(y) {
g <- function (u) 1 - exp(-0.002926543 * u^1.082618 * exp(0.04097536 * u))
a <- 1 - pbeta(g(107.2592+y), 0.2640229, 0.1595841)
b <- 1 - pbeta(g(x), 0.2640229, 0.1595841)
a - b^2
}
x <- 0.5
curve(f, from = 0, to = 1000)
這個函數怎么可能是一條水平線呢? 它不能有根!
f
,它真的做你想要的正確的事情嗎? 我懷疑g
什么問題; 你可能把括號放在錯誤的地方? f
正確,使用curve
檢查那里有一個根目錄中適當的時間間隔。 然后使用uniroot
。 嘗試使用一個小間隔,但允許uniroot()延長間隔:
uniroot(f, lower=0, upper=1, extendInt = "yes")$root
[1] -102.9519
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.