Solución Uniroot en R
(2)
Me gustaría encontrar la raíz de la siguiente función:
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
Error en uniroot (f, lower = 0, upper = 1000): valores f () en puntos finales que no tienen signo opuesto
¿Cómo puedo resolver el error?
Intente usar un intervalo pequeño pero permita que uniroot () extienda el intervalo:
uniroot(f, lower=0, upper=1, extendInt = "yes")$root
[1] -102.9519
uniroot()
y precaución de su uso
uniroot
está implementando el
método de bisección
cruda.
Tal método es mucho más simple que
el método (cuasi) de Newton
, pero necesita una suposición más fuerte para garantizar la existencia de una raíz:
f(lower) * f(upper) < 0
.
Esto puede ser bastante doloroso, ya que tal suposición es una condición suficiente, pero no necesaria.
En la práctica, si
f(lower) * f(upper) > 0
, todavía es posible que exista una raíz, pero como esto no es 100% seguro, el método de bisección no puede correr el riesgo.
Considere este ejemplo:
# a quadratic polynomial with root: -2 and 2
f <- function (x) x ^ 2 - 4
Obviamente, hay raíces en
[-5, 5]
.
Pero
uniroot(f, lower = -5, upper = 5)
#Error in uniroot(f, lower = -5, upper = 5) :
# f() values at end points not of opposite sign
En realidad, el uso del método de bisección requiere la observación / inspección de
f
, de modo que uno pueda proponer un intervalo razonable donde radica la raíz.
En R, podemos usar
curve()
:
curve(f, from = -5, to = 5); abline(h = 0, lty = 3)
Desde la gráfica, observamos que existe una raíz en
[-5, 0]
o
[0, 5]
.
Entonces estos funcionan bien:
uniroot(f, lower = -5, upper = 0)
uniroot(f, lower = 0, upper = 5)
Tu problema
Ahora intentemos su función (la he dividido en varias líneas para facilitar la lectura; también es fácil verificar la corrección de esta manera):
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)
¿Cómo podría esta función ser una línea horizontal? ¡No puede tener una raíz!
-
Comprueba la
f
anterior, ¿realmente está haciendo lo correcto que quieres? Dudo que algo esté mal cong
; ¿podrías poner los corchetes en el lugar equivocado? -
Una vez que obtenga
f
correcto, use lacurve
para inspeccionar un intervalo apropiado donde exista una raíz. Luego usauniroot
.