В конечном итоге я хочу ограничить одну из переменных между двумя числами. Естественно, я хотел бы использовать аргументы 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()
у меня возникло несколько вопросов:
- Использование аргументов LB и UB для охвата всего параметра пробел приводит к другому ответу, чем использование значений по умолчанию. Кто-нибудь знает, как обрабатываются значения по умолчанию
LB = NULL
и UB = NULL
? - Я не знаю, что означает предупреждение.
- Существует ли другой способ репликации ответа по умолчанию с использованием дополнительных параметров ограничения в
solnp()
: ineqLB
, ineqUB
или LB
или UB
?
Спасибо!
PS: Я знаю, что бесконечные аргументы LB и UB меняются на значения +/- .Machine $ double.xmax / 2 (например, ~ 9e + 307) в функции solnp()
.