我想找到以下函数的根:
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
单根(f,下端= 0,上= 1000)中的错误: f()值在非相反符号的端点处
我如何解决这个错误?
发布于 2016-08-16 00:26:48
uniroot()
及其使用的注意事项
uniroot
正在实施粗糙的二分法。这种方法比(准)牛顿法简单得多,但需要更强的假设来确保根:f(lower) * f(upper) < 0
的存在。
这可能是相当痛苦的,因为这样的假设是一个充分的条件,但不是必要的条件。在实践中,如果f(lower) * f(upper) > 0
,仍然有可能存在一个根,但由于这不是百分之百肯定,二分法不能承担风险。
考虑一下这个例子:
# 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
。发布于 2017-10-26 18:18:35
尝试使用一个小间隔,但允许uniroot()扩展该间隔:
uniroot(f, lower=0, upper=1, extendInt = "yes")$root
[1] -102.9519
https://stackoverflow.com/questions/38961221
复制相似问题