On 10-02-2013, at 21:16, Axel Urbiz <axel.ur...@gmail.com> wrote: > Dear List, > > I'm trying to solve this simple optimization problem in R. The parameters > are the exponents to the matrix mm. The constraints specify that each row > of the parameter matrix should sum to 1 and their product to 0. I don't > understand why the constraints are not satisfied at the solution. I must be > misinterpreting how to specify the constrains somehow. > > > library(alabama) > > ff <- function (x) { > mm <- matrix(c(10, 25, 5, 10), 2, 2) > matx <- matrix(x, 2, 2) > -sum(apply(mm ^ matx, 1, prod)) > } > > > ### constraints > > heq <- function(x) { > h <- rep(NA, 1) > h[1] <- x[1] + x[3] -1 > h[2] <- x[2] + x[4] -1 > h[3] <- x[1] * x[3] > h[4] <- x[2] * x[4] > h > } > > res <- constrOptim.nl(par = c(1, 1, 1, 1), fn = ff, > heq = heq) > res$convergence #why NULL? > matrix(round(res$par, 2), 2, 2) #why constraints are not satisfied?
There is no need to use an optimization function in this case. You can easily find the optimum by hand. >From the constraints : x[3] equals (1-x[1]) x[4] equals (1-x[2]) Therefore x[1] * (1-x[1]) equals 0 x[2] * (1-x[2]) equals 0 So you only need to calculate the function value for 4 vectors: x1 <- c(1,1,0,0) x2 <- c(0,0,1,1) x3 <- c(1,0,0,1) x4 <- c(0,1,1,0) Modifying your ff function in the way Ravi suggested: ff <- function (x) { mm <- matrix(c(10, 25, 5, 10), 2, 2) matx <- matrix(x, 2, 2) sum(apply(mm ^ matx, 1, prod)) } and running ff with x{1,2,3,4} as argument, one gets > ff(x1) [1] 35 > ff(x2) [1] 15 > ff(x3) [1] 20 > ff(x4) [1] 30 So ff(x2) achieves the minimum, which corresponds to Ravi's result with auglag. Berend ______________________________________________ R-help@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide http://www.R-project.org/posting-guide.html and provide commented, minimal, self-contained, reproducible code.