Как `solnp ()` в пакете Rsolnp обрабатывает параметры LB и UB по умолчанию? - PullRequest
2 голосов
/ 16 марта 2020

В конечном итоге я хочу ограничить одну из переменных между двумя числами. Естественно, я хотел бы использовать аргументы LB или UB в solnp(). Перед тем, как настроить ограничения в соответствии с моими потребностями, я был бы уверен, если смогу воспроизвести поведение по умолчанию, используя ограничения LB и UB в solnp(). Оптимальный ответ должен быть одинаковым независимо от того, буду ли я использовать эти аргументы по умолчанию (NULL) или LB = -Inf и UB = Inf для всех переменных, поскольку пространство параметров будет одинаковым. Указав +-Inf, я получаю ошибку, которая не имеет никакого смысла для меня.

Например, при использовании примера solnp() в пакете Rsolnp исходная проблема:

   min   exp(x[1]*x[2]*x[3]*x[4]*x[5]) 
   subject to: sum(x[i]^2) = 10  
               x[2]*x[3]-5*x[4]*x[5] = 0
               x[1]^3  + x[2] ^ 3 = -1 

Решение заключается в следующем.

library(Rsolnp)
# POWELL Problem
fn1=function(x){
  exp(x[1]*x[2]*x[3]*x[4]*x[5])
}

eqn1=function(x){
  z1=x[1]*x[1]+x[2]*x[2]+x[3]*x[3]+x[4]*x[4]+x[5]*x[5]
  z2=x[2]*x[3]-5*x[4]*x[5]
  z3=x[1]*x[1]*x[1]+x[2]*x[2]*x[2]
  return(c(z1,z2,z3))
}
x0 = c(-2, 2, 2, -1, -1)

#Orginal Example
powell=solnp(x0, fun = fn1, eqfun = eqn1, eqB = c(10, 0, -1))

выход

> powell$pars
[1] -1.7171436  1.5957097  1.8272457 -0.7636431 -0.7636430
> powell$convergence
[1] 0

Я хочу повторить результат, добавив ограничения нижней и верхней границ, чтобы они были широкими, скажем + - бесконечность. Вместо первоначальной задачи оптимизации я хочу оптимизировать

   min   exp(x[1]*x[2]*x[3]*x[4]*x[5]) 
   subject to: sum(x[i]^2) = 10  
               x[2]*x[3]-5*x[4]*x[5] = 0
               x[1]^3  + x[2] ^ 3 = -1 
               -Inf < x[i] < Inf for i = 1, ..., 5

, где в этой задаче я добавил последнее ограничение. Поскольку я позволяю оптимизатору минимизировать функцию во всем пространстве параметров, я ожидаю получить тот же ответ. Но ...

#Add lower bounds
A2=solnp(x0, fun = fn1,
         eqfun = eqn1, eqB = c(10, 0, -1),
         LB = rep(-Inf, 5), UB = rep(Inf, 5)
)
Iter: 1 fn: 0.0003355    Pars:  -2.00000  2.00000  2.00000 -1.00000 -1.00000
solnp--> Solution not reliable....Problem Inverting Hessian.
Warning message:
In p0 * vscale[(neq + 2):(nc + np + 1)] :
  longer object length is not a multiple of shorter object length

После просмотра исходного кода solnp() у меня возникло несколько вопросов:

  1. Использование аргументов LB и UB для охвата всего параметра пробел приводит к другому ответу, чем использование значений по умолчанию. Кто-нибудь знает, как обрабатываются значения по умолчанию LB = NULL и UB = NULL?
  2. Я не знаю, что означает предупреждение.
  3. Существует ли другой способ репликации ответа по умолчанию с использованием дополнительных параметров ограничения в solnp(): ineqLB, ineqUB или LB или UB?

Спасибо!

PS: Я знаю, что бесконечные аргументы LB и UB меняются на значения +/- .Machine $ double.xmax / 2 (например, ~ 9e + 307) в функции solnp().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...