R中的Uniroot解决方案

时间:2016-08-15 18:56:08

标签: r

我想找到以下函数的根:

[Object, "parsererror", SyntaxError: Unexpected token < in JSON at position 0 at Object.parse (native) at parseJSON …]
0
:
Object
1
:
"parsererror"
2
:
SyntaxError: Unexpected token < in JSON at position 0 at Object.parse (native) at parseJSON (https://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js:16:11709) at b$ (https://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js:16:1382) at w (https://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js:18:8326) at XMLHttpRequest.d (https://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js:18:14247)
callee
:
(err)
length
:
3
Symbol(Symbol.iterator)
:
values()
__proto__
:
Object
  

uniroot错误(f,lower = 0,upper = 1000):结束时的f()值   不符号的点

如何解决错误?

2 个答案:

答案 0 :(得分:19)

uniroot()并谨慎使用

uniroot正在实施原始bisection method。这种方法比(quasi) Newton's method简单得多,但需要更强的假设来确保根的存在: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)

enter image description here

从图中,我们发现[-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)

enter image description here

这个功能怎么可能是一条水平线?它不能有根!

  1. 检查上面的f,它真的做得对吗?我怀疑g出了什么问题;你可能把括号放在错误的地方吗?
  2. 一旦f更正,请使用curve检查存在根的适当间隔。然后使用uniroot

答案 1 :(得分:2)

尝试使用较小的间隔但允许uniroot()延长间隔:

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