julia - 如何定义以索引值为条件的 JuMP 表达式
问题描述
我正在尝试定义在不同索引处具有不同规格的@NLexpression
in JuMP
。在下面的示例中,我希望将表达式y[j,k]
定义为1/(x[j] - x[k])
whenj != k
并采用其他值 when 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)
解决方案
您没有义务使用 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
推荐阅读
- php - 如何使用带有 foreach 循环的 php 进行行跨度
- javascript - 我在导入此文件时遇到问题
- python - 如何在前端以百分比形式显示搜索结果分数?
- python - 如何让 matplotlib 处理自定义类“单位”
- google-cloud-functions - 如何优化从 HTTP 触发函数并行调用“子”云函数
- memory - C/C++ 中本地函数的内存填充和对齐
- c# - WinForms - 加载表单时如何使用 PaintEventArgs 运行函数?
- python-3.x - def 函数比较两个字符串
- python - Python 多个 onclick 事件
- assembly - 如何在特定列打印包含多行的整个字符串?