julia - 涉及矩阵求逆的 JuMP 约束
问题描述
我正在尝试求解一个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.
关于如何解决这个问题的任何建议?
解决方案
您不能inv
在宏之外使用(或更一般地说,构建任何非线性表达式)。把它像这样放在里面:
using JuMP
model = Model()
@variable(model, x >= 0.5)
@NLconstraint(model, inv(x) <= 0.5)
ps,我无法运行您的示例,因为我不知道是什么unmixed_iv2
。
推荐阅读
- java - 使用继承和多态来实例化 Thread 子类的对象的主要区别是什么?
- python - 按 nan 值过滤 numpy 数组的 pandas 数据框列
- delphi - 具有 TStrings 属性的组件在字符串列表编辑器中禁用了“代码编辑器”
- amazon-web-services - 如何在部署期间使用非 AWS 资源扩展 AWS CDK
- java - Spring-Data 项目没有收到我的 Get/Post “404 not found”
- python - 循环遍历数据框列表并按索引合并它们
- python - 如何修复用户输入并重新启动功能/程序
- javascript - discordjs 错误:TypeError:无法读取未定义的属性“状态”
- hash - 两个哈希表大小与素数大小的幂
- typescript - 打字稿:可以用与“导入”无关的任意类型实例化