Настройка функции тривиальная:
fr <- function(x) { x1 <- x[1]
x2 <- x[2]
-(log(x1) + x1^2/x2^2) # need negative since constrOptim is a minimization routine
}
Настройка матрицы ограничение было проблематично из-за отсутствия большого количества документации, и я прибегла к экспериментам. На странице справки «Возможная область определяется ui% *% theta-ci> = 0». Таким образом, я проверил, и это, казалось, «работать»:
> 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
Так я ставлю в один ряд для каждого ограничения/границы:
constrOptim(c(0.99,0.001), fr, NULL, ui=rbind(c(-1,-1), # the -x-y > -1
c(1,0), # the x > 0
c(0,1)), # the y > 0
ci=c(-1,0, 0)) # the thresholds
Для этой проблемы существует потенциальная трудность в том, что для всех значений от x функция переходит в Inf при y -> 0. Я получаю max вокруг x = .95 и y = 0, даже когда я выталкиваю стартовые значения в «угол», но я несколько подозрительно, что это не тот истинный максимум, который я бы предположил, был в «углу». EDIT: Занимаясь этим, я рассудил, что градиент может обеспечить дополнительное «направление» и добавил функцию градиента:
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)
}
Это было «рулить» оптимизации немного ближе к с (.999 ... 0) вместо того, чтобы отойти от него, как это было сделано для некоторых начальных значений. Я по-прежнему немного разочарован тем, что процесс, кажется, «голова на скале», когда исходные значения близки к центру допустимой области:
constrOptim(c(0.99,0.001), fr, grr, ui=rbind(c(-1,-1), # the -x-y > -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
Примечание: Ханс Вернер Borchers опубликовал лучший пример на R-Help, что удалось получить угловые значения, установив ограничение немного в сторону от края:
> 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
@G и другие - может кто-нибудь объяснить, почему перекрестная реклама нахмурилась? Было бы приемлемо упомянуть, что вы перекрестно размещаете ссылку? У меня нет сильных чувств так или иначе, но определенная ясность в этом вопросе, вероятно, оправдана. Если это то, с чем ранее сталкивалось R-сообщество в целом, я думаю, что связывание с этими дискуссиями было бы хорошим началом. – Chase
Если вы выполните поиск на вкладке «Мета» для «перекрестной публикации», вы найдете множество мнений, большинство из которых относительно соглашается на перекрестную рассылку. (Одновременная перекрестная регистрация, однако, кажется, раздражает большинство людей.) В группах r-help и кузена существует сильная антипроцентная этика, которая изложена в Руководстве по проводке R-Help. Мне тяжело видеть, что руководство по проводке является доказательством в SO. –
@Chase Когда люди пересекают почту и не позволяют никому знать, что тогда для кого-то очень возможно написать решение проблемы, которая уже решена, что может быть пустой тратой времени. Мне лично все равно, если люди перейдут посты до тех пор, пока они узнают об этом (и это не слишком). – Dason