Я пытаюсь определить @NLexpression
в JuMP
, который имеет разные спецификации для разных индексов. В приведенном ниже примере я хочу, чтобы выражение y[j,k]
было определено как 1/(x[j] - x[k])
, когда j != k
, и приняло какое-то другое значение, когда j == k
. Я могу смоделировать это поведение, определив вспомогательную переменную z
и добавив ограничения, зависящие от значений индекса. Есть ли аналогичный способ определения выражения, зависящего от значений индекса?
using JuMP, Ipopt
model = JuMP.Model(with_optimizer(Ipopt.Optimizer))
@variable(model, 0 <= x[1:2])
@NLexpression(model, y[j=1:2,k=1:2], 1/(x[j] - x[k])) # <- problematic line
@variable(model, z[1:2,1:2])
for j=1:2, k=1:2
if j == k
@constraint(model, z[j,k] == 1)
else
@NLconstraint(model, z[j,k] == 1/(p[j] - p[k]))
end
end
display(model)