【问题标题】:Problem implementing a nonlinear constraint in Julia-JuMP在 Julia-JuMP 中实现非线性约束的问题
【发布时间】:2020-11-26 19:45:40
【问题描述】:

我正在尝试解决一个优化问题,该问题涉及在其中一个约束条件下矩阵的逆。简化版如下:

a = [1 1e-3;1e-3 1]
n = 2
f(Q...) = inv(reshape(collect(Q), (n, n)))
g(x...) = reshape(collect(x), (n,n))
NSD = Model(with_optimizer(Ipopt.Optimizer))
@variable(NSD, Q[1:n, 1:n])
@variable(NSD, aux[1:n, 1:n])
register(NSD, :f, n*n, f, autodiff=true)
register(NSD, :g, n*n, g, autodiff=true)
@constraint(NSD, aux .== a)
@NLconstraint(NSD, invconst[i=1:n, j=1:n], f(Q...)[i,j] >= g(aux...)[i,j])
@objective(NSD, Max, 0)
optimize!(NSD)

但是,此代码不断向我显示以下我无法解决的错误消息: LoadError: Cannot divide a quadratic expression by an aff. expression

有人可以帮我解决这里的问题吗?

【问题讨论】:

    标签: julia julia-jump


    【解决方案1】:

    用户定义的函数必须返回单个标量。他们不能返回一个矩阵。

    您的应用程序中的n 是什么?如果n > 2,这几乎肯定不是你想做的。

    如果n = 2,只需明确写出逆。

    我正在添加一个对 JuMP 有帮助的示例:https://github.com/jump-dev/JuMP.jl/pull/2379

    【讨论】:

    • 感谢您的回复。在我的问题中,n 实际上可以取非常大的值(>100)。有什么方法可以在 JuMP 中实现“invconst”约束?从您的链接看来,一种可能的方法是为 Q^{-1} 矩阵的每个元素生成 n^2 个不同的函数,但我不确定一旦变得非常大,效率会有多高。谢谢。
    • 目前,唯一的方法是使用 n^2 个不同的函数,这可能效率不高。不过你还是可以试试的。更好的问题是:您确定要显式构造逆吗?为什么限制逆矩阵很重要?我建议您考虑替代配方。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多