मैं एक @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)
2
hilberts_drinking_problem 15 अप्रैल 2020, 09:10

1 उत्तर

सबसे बढ़िया उत्तर

आप अभिव्यक्ति के लिए कंटेनर बनाने के लिए JuMP के मैक्रोज़ का उपयोग करने के लिए बाध्य नहीं हैं। आपको सशर्त रूप से निम्नानुसार भाव बनाने में सक्षम होना चाहिए:

model = JuMP.Model()

@variable(model, 0 <= x[1:2])
y = Dict()  # Or Array, if you prefer.
for j=1:2, k=1:2
    if j == k
        y[j,k] = 1
    else
        y[j,k] = @NLexpression(model, 1/(p[j] - p[k]))
    end
end
3
mlubin 17 अप्रैल 2020, 19:36