r

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!

  1. Comprueba la f anterior, ¿realmente está haciendo lo correcto que quieres? Dudo que algo esté mal con g ; ¿podrías poner los corchetes en el lugar equivocado?
  2. Una vez que obtenga f correcto, use la curve para inspeccionar un intervalo apropiado donde exista una raíz. Luego usa uniroot .