optimización restringida en R

Estoy intentando usar http://rss.acs.unt.edu/Rdoc/library/stats/html/constrOptim.html en R para hacer la optimización en R con algunas restricciones lineales dadas, pero no puedo descubrir cómo configurar el problema.

Por ejemplo, necesito maximizar $ f (x, y) = log (x) + \ frac {x ^ 2} {y ^ 2} $ sujeto a restricciones $ g_1 (x, y) = x + y 0 $ y $ g_3 (x, y) = y> 0 $. ¿Cómo hago esto en R? Este es solo un ejemplo hipotético. No se preocupe por su estructura, en su lugar, estoy interesado en saber cómo configurar esto en R.

¡Gracias!

Configurar la función era trivial:

fr <- function(x) { x1 <- x[1] x2 <- x[2] -(log(x1) + x1^2/x2^2) # need negative since constrOptim is a minimization routine } 

Configurar la matriz de restricciones fue problemático debido a la falta de mucha documentación, y recurrí a la experimentación. La página de ayuda dice "La región factible está definida por ui% *% theta - ci> = 0". Así que probé y esto pareció "funcionar":

 > rbind(c(-1,-1),c(1,0), c(0,1) ) %*% c(0.99,0.001) -c(-1,0, 0) [,1] [1,] 0.009 [2,] 0.990 [3,] 0.001 

Así que puse una fila para cada restricción / límite:

 constrOptim(c(0.99,0.001), fr, NULL, ui=rbind(c(-1,-1), # the -xy > -1 c(1,0), # the x > 0 c(0,1) ), # the y > 0 ci=c(-1,0, 0)) # the thresholds 

Para este problema hay una dificultad potencial en que para todos los valores de x la función vaya a Inf como y -> 0. Obtengo un máximo alrededor de x = .95 ey = 0 incluso cuando empujo los valores iniciales hacia la "esquina", pero sospecho que este no es el verdadero máximo que hubiera supuesto que estaba en la "esquina". EDITAR: Siguiendo esto razoné que el degradado podría proporcionar una "dirección" adicional y agregué una función de degradado:

 grr <- function(x) { ## Gradient of 'fr' x1 <- x[1] x2 <- x[2] c(-(1/x[1] + 2 * x[1]/x[2]^2), 2 * x[1]^2 /x[2]^3 ) } 

Esto "dirigió" la optimización un poco más cerca de la esquina c (.999 ..., 0), en lugar de alejarse de ella, como lo hizo con algunos valores iniciales. Sigo algo decepcionado de que el proceso parezca "encaminarse hacia el precipicio" cuando los valores iniciales están cerca del centro de la región factible:

  constrOptim(c(0.99,0.001), fr, grr, ui=rbind(c(-1,-1), # the -xy > -1 c(1,0), # the x > 0 c(0,1) ), # the y > 0 ci=c(-1,0, 0) ) $par [1] 9.900007e-01 -3.542673e-16 $value [1] -7.80924e+30 $counts function gradient 2001 37 $convergence [1] 11 $message [1] "Objective function increased at outer iteration 2" $outer.iterations [1] 2 $barrier.value [1] NaN 

Nota: Hans Werner Borchers publicó un mejor ejemplo en R-Help que logró obtener los valores de las esquinas al establecer la restricción ligeramente alejada del borde:

 > constrOptim(c(0.25,0.25), fr, NULL, ui=rbind( c(-1,-1), c(1,0), c(0,1) ), ci=c(-1, 0.0001, 0.0001)) $par [1] 0.9999 0.0001