我想找到以下函数的根:
[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()值 不符号的点
如何解决错误?
答案 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)
从图中,我们发现[-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
。答案 1 :(得分:2)
尝试使用较小的间隔但允许uniroot()延长间隔:
uniroot(f, lower=0, upper=1, extendInt = "yes")$root
[1] -102.9519