Julia JuMP 数组变量约束
Julia JuMP array variable constraint
我正在尝试在 Julia 中使用 JuMP 对涉及矢量旋转的非线性问题进行建模。我需要一个约束,它看起来像 v[1:3] == rotate(v)
如果我这样写,它不起作用,因为“非线性表达式可能只包含标量表达式”。我该如何解决这个问题?
我可以说类似 v[1] == rotate(v)[1]
的东西,对 v[2]
和 v[3]
也一样,但是我必须经常计算 rotate(v)
三倍。我也可以尝试将旋转函数拆分为三个函数,每个函数计算一个元素,但实际约束比简单旋转要复杂一点,所以这可能会很棘手。
还有其他方法吗?也许有一个辅助变量之类的东西,它可以作为一个向量来计算,然后在约束中只比较两个向量的元素(本质上是第一种方法,但没有计算函数三次)?
请在此处查看建议的解决方法:
using JuMP
using Ipopt
function myfun(x)
return sum(xi for xi in x), sum(xi^2 for xi in x)
end
function memoized()
cache = Dict{UInt, Any}()
fi = (i, x) -> begin
h = hash((x, typeof(x)))
if !haskey(cache, h)
cache[h] = myfun(x)
end
return cache[h][i]::Real
end
return (x...) -> fi(1, x), (x...) -> fi(2, x)
end
model = Model(Ipopt.Optimizer)
f1, f2 = memoized()
register(model, :f1, 3, f1; autodiff = true)
register(model, :f2, 3, f2; autodiff = true)
@variable(model, x[1:3] >= 0, start = 0.1)
@NLconstraint(model, f1(x...) <= 2)
@NLconstraint(model, f2(x...) <= 1)
@objective(model, Max, sum(x))
optimize!(model)
我正在尝试在 Julia 中使用 JuMP 对涉及矢量旋转的非线性问题进行建模。我需要一个约束,它看起来像 v[1:3] == rotate(v)
如果我这样写,它不起作用,因为“非线性表达式可能只包含标量表达式”。我该如何解决这个问题?
我可以说类似 v[1] == rotate(v)[1]
的东西,对 v[2]
和 v[3]
也一样,但是我必须经常计算 rotate(v)
三倍。我也可以尝试将旋转函数拆分为三个函数,每个函数计算一个元素,但实际约束比简单旋转要复杂一点,所以这可能会很棘手。
还有其他方法吗?也许有一个辅助变量之类的东西,它可以作为一个向量来计算,然后在约束中只比较两个向量的元素(本质上是第一种方法,但没有计算函数三次)?
请在此处查看建议的解决方法:
using JuMP
using Ipopt
function myfun(x)
return sum(xi for xi in x), sum(xi^2 for xi in x)
end
function memoized()
cache = Dict{UInt, Any}()
fi = (i, x) -> begin
h = hash((x, typeof(x)))
if !haskey(cache, h)
cache[h] = myfun(x)
end
return cache[h][i]::Real
end
return (x...) -> fi(1, x), (x...) -> fi(2, x)
end
model = Model(Ipopt.Optimizer)
f1, f2 = memoized()
register(model, :f1, 3, f1; autodiff = true)
register(model, :f2, 3, f2; autodiff = true)
@variable(model, x[1:3] >= 0, start = 0.1)
@NLconstraint(model, f1(x...) <= 2)
@NLconstraint(model, f2(x...) <= 1)
@objective(model, Max, sum(x))
optimize!(model)