es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo evitar el error de uniroot que detiene el bucle.

Estoy ejecutando la función uniroot en el bucle, pero me encontré con un error y el código se detuvo. El código es el siguiente:

func <- function(f) -a*b/c*0.5*d*e^2 + (d/f-1)*g*sin(h*(pi/180))-i
dat <- data.frame(a = c(0.99,0.99,0.99),
                  b = c(0.1986572,0.1986572,0.1986572),
                  c = c(237.5,237.5,237.5),
                  d = c(1028.372, 1028.711, 1028.372),
                  e = c(2.46261, 2.986461, 2.46261),
                  f = c(-1,-1,-1),
                  g = c(9.8,9.8,9.8),
                  h = c(-54.97964, -51.65978, -54.97964),
                  i = c(0.03699588, -0.0375189, 0.03699588))

for(j in 1:length(dat$a)){
   a <- dat$a[j]
   b <- dat$b[j]
   c <- dat$c[j]
   d <- dat$d[j]
   e <- dat$e[j]
   #f: esto debería resolverse con uniroot
   g <- dat$g[j]
   h <- dat$h[j]
   i <- dat$i[j]
   sol <- uniroot(func,c(0, 2000),extendInt = "yes") 
   dat$f[j] <- sol$root
   print(j)
}

Al ejecutar el código anterior, obtuve el siguiente error:

[1] 1
Error in uniroot(func, c(0, 2000), extendInt = "yes") : 
      no se encontró ningún cambio de signo en 1000 iteraciones

El código se detuvo en j=1 y no continuó en j=2 y j=3. Por lo tanto, dat$f muestra lo siguiente:

> dat$f
[1] 1526.566   -1.000   -1.000

Mi objetivo es que cuando uniroot encuentre un error para un determinado j, se coloque NA en dat$f[j] y se continúe el bucle hasta el final.

Si esto funciona, dat$f[1] y dat$f[3] deberían tener el mismo valor (=1526,566) utilizando el data frame anterior.

Por favor, dame consejos sobre cómo lidiar con el error de uniroot.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para lidiar con el error de uniroot, podemos usar la función tryCatch para capturar el error y manejarlo de acuerdo a ello. Aquí hay una versión actualizada del código que utiliza tryCatch:

    func <- function(f) -a*b/c*0.5*d*e^2 + (d/f-1)*g*sin(h*(pi/180))-i
    dat <- data.frame(a = c(0.99,0.99,0.99),
                      b = c(0.1986572,0.1986572,0.1986572),
                      c = c(237.5,237.5,237.5),
                      d = c(1028.372, 1028.711, 1028.372),
                      e = c(2.46261, 2.986461, 2.46261),
                      f = c(-1,-1,-1),
                      g = c(9.8,9.8,9.8),
                      h = c(-54.97964, -51.65978, -54.97964),
                      i = c(0.03699588, -0.0375189, 0.03699588))
    
    for(j in 1:length(dat$a)){
      a <- dat$a[j]
      b <- dat$b[j]
      c <- dat$c[j]
      d <- dat$d[j]
      e <- dat$e[j]
      g <- dat$g[j]
      h <- dat$h[j]
      i <- dat$i[j]
      tryCatch({
        sol <- uniroot(func,c(0, 2000),extendInt = "yes")
        dat$f[j] <- sol$root
      }, error = function(e){
        dat$f[j] <- NA
      })
      print(j)
    }
    

    En el código anterior, envolvemos la llamada a la función uniroot con tryCatch y proporcionamos una función de manejo de errores que establece dat$f[j] en NA en caso de un error. Esto asegura que el bucle continúe incluso si ocurre un error en una de las llamadas a la función uniroot.

    Ahora, cuando ejecutamos el código, obtenemos la siguiente salida:

    [1] 1
    [1] 2
    [1] 3
    

    Y dat$f muestra:

    [1] 1526.566      NA 1526.566
    

    Como se esperaba, dat$f[1] y dat$f[3] tienen el mismo valor, y dat$f[2] es NA debido al error en la correspondiente llamada a uniroot.

Comments are closed.