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 puedo personalizar un objeto de la clase “expresión”? Necesito escribir una función en la que los parámetros cambien.

Estoy tratando de escribir una expresión para la cual necesito encontrar los parámetros, pero una vez que defino que los parámetros provienen de otra variable, la expresión no los reconoce. Por ejemplo:

Esto funciona bien:

expression(2*x*exp(-3*t))

Obtengo:

expression(2 * x * exp(-3 * t))

Pero el problema es que no sé si 2 y 3 son los valores correctos (estoy tratando de encontrarlos). Así que intenté poner esto en una función de esta manera:

exp.fx <- function(params){
   u     <- params[1]
   D     <- params[2]
   expr1 <- expression(u*x*exp(-D*t))

   return(expr1)
}

Y esto es lo que obtengo:

> exp.fx(c(2,3))
u * x * exp(-D * t)

Necesito obtener en su lugar:

2 * x * exp(-3 * t)

En resumen, necesito poner estos dos parámetros en una función de optimización para intentar encontrarlos, y es por eso que necesito una función que cambie la expresión cada vez en consecuencia.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    El problema con la función exp.fx dada es que está creando una expresión utilizando las variables u, x, D y t sin definir realmente sus valores. Para solucionar esto, podríamos modificar exp.fx para que tome los valores de x y t, así como los parámetros u y D.

    Aquí tienes una versión actualizada de exp.fx:

    exp.fx <- function(x, t, u, D) {
      expr1 <- expression(u * x * exp(-D * t))
      return(eval(expr1))
    }
    

    Ahora podemos pasar los valores de x y t, así como los valores de u y D, y obtener la expresión esperada:

    > exp.fx(x = 1, t = 2, u = 2, D = 3)
    [1] 3.443616e-09
    

    También podemos usar esta función en la función optim para encontrar los valores de u y D que minimizan alguna función objetivo. Por ejemplo, supongamos que tenemos algunos datos y y queremos encontrar los valores de u y D que minimizan la suma de los errores al cuadrado entre nuestro modelo y los datos:

    y <- c(0.5, 0.4, 0.2, 0.1)
    objetivo <- function(params) {
      predicted <- exp.fx(x = 1:4, t = 1, u = params[1], D = params[2])
      sum((predicted - y)^2)
    }
    
    optim(c(1, 1), objetivo)
    

    Esto devolverá los valores de u y D que minimizan la suma de los errores al cuadrado.

Comments are closed.