簡體   English   中英

R中的Uniroot解決方案

[英]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)

在此輸入圖像描述

這個函數怎么可能是一條水平線呢? 它不能有根!

  1. 檢查上面的f ,它真的做你想要的正確的事情嗎? 我懷疑g什么問題; 你可能把括號放在錯誤的地方?
  2. 一旦你f正確,使用curve檢查那里有一個根目錄中適當的時間間隔。 然后使用uniroot

嘗試使用一個小間隔,但允許uniroot()延長間隔:

uniroot(f, lower=0, upper=1, extendInt = "yes")$root
[1] -102.9519

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM