【问题标题】:JuMP constraints involving matrix inverse涉及矩阵求逆的 JuMP 约束
【发布时间】:2020-10-18 17:14:55
【问题描述】:

我正在尝试求解n*n 矩阵U,它满足各种约束,包括一些涉及其子矩阵的逆的约束。但是,JuMP 似乎无法处理逆运算,至少在没有一些额外的可逆性规范的情况下是这样。这是n=2 的问题示例。

using JuMP, Ipopt

m = Model(with_optimizer(Ipopt.Optimizer))
A = [5 7; 7 10]
B = [9 13; 13 19]
C = [3 4; 4 6]
nnodes = 2
@variable(m, U[1:nnodes, 1:nnodes])

A1 = U * A * U'
B1 = U * B * U'
C1 = U * C * U'

c1 = A1[1, 1] - 1
c2 = A1[2, 2] - 1
c3 = C1[1, 1] - 1
c4 = unmixed_iv2[1, 2]
a = A1[2, 2] - A1[2, 1] * inv(A1[1, 1]) * A1[2,1]  # Schur complement
b = B1[2, 2] - B1[2, 1] * inv(B1[1, 1]) * B1[2,1]  # Schur complement
c5 = a - b

@NLconstraint(m, c1 == 0)
@NLconstraint(m, c2 == 0)
@NLconstraint(m, c3 == 0)
@NLconstraint(m, c4 == 0)
@NLconstraint(m, c5 == 0)

solve(m)

这会引发以下错误:

ERROR: inv is not defined for type GenericQuadExpr. Are you trying to build a nonlinear problem? Make sure you use @NLconstraint/@NLobjective.

关于如何解决这个问题有什么建议吗?

【问题讨论】:

  • 我没有深入研究您的代码,但乍一看我没有看到任何目标,也许是 @NLobjective 宏,是有意的吗?
  • 我的问题没有目标,我只是在寻找一个解决方案。 JuMP 需要目标吗?

标签: julia julia-jump


【解决方案1】:

您不能在宏之外使用inv(或者更一般地说,构建任何非线性表达式)。就这样放在里面:

using JuMP
model = Model()
@variable(model, x >= 0.5)
@NLconstraint(model, inv(x) <= 0.5)

ps,我无法运行您的示例,因为我不知道 unmixed_iv2 是什么。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-22
    • 2012-05-08
    • 2017-08-31
    • 1970-01-01
    • 1970-01-01
    • 2013-05-05
    • 2011-08-30
    • 1970-01-01
    相关资源
    最近更新 更多