如何在MOSEK中实现含未知变量x线性组合的指数锥约束
Mosek中构造含x线性组合的指数锥约束最优方案
- 优先用Fusion层的
Expr表达式工具构造线性组合,不要手动引入额外辅助变量存储线性组合结果。Mosek的Fusion接口支持直接将线性表达式作为指数锥的输入分量,内部会自动完成系数映射,既减少冗余变量,也能避免手动传参出错。 - 针对标准三维指数锥定义
K_exp = {(u, v, w) | v ≥ w * exp(u/w), w > 0},若你需要放入锥的线性组合为a_i^T x + b_i(a_i为系数向量、b_i为常数项),可直接将该线性组合作为指数锥的u分量传入,无需拆分为单个变量处理。 - 多指数锥批量构造时优先用矢量化操作:如果你的15个线性组合可以统一表示为矩阵
A乘向量x加常数向量b,可以调用Expr.mv(A, x)一次性生成所有线性组合结果,再和其余锥分量拼接后批量添加约束,比循环逐个添加约束的运行效率和代码可读性都更高。
参考实现代码示例:
import mosek.fusion as mf # 假设A是15*n的系数矩阵,b是长度15的常数向量,c为约束右端常数,x是长度n的决策变量 n = 10 # 替换为你的x变量维度 with mf.Model() as m: x = m.variable("x", n, mf.Domain.unbounded()) # 15个指数锥对应的v分量辅助变量 t = m.variable("t", 15, mf.Domain.greaterThan(0.0)) # 你提到的半空间约束:sum(t) <= 1 m.constraint(mf.Expr.sum(t), mf.Domain.lessThan(1.0)) # 批量构造15个指数锥约束 # 每个锥对应(u_i, t_i, 1) ∈ K_exp,其中u_i = a_i^T x + b_i - c u = mf.Expr.sub(mf.Expr.add(mf.Expr.mv(A, x), b), c) w = mf.Expr.constTerm(15, 1.0) m.constraint(mf.Expr.hstack(u, t, w), mf.Domain.inPexpCone()) # 后续添加目标、求解等逻辑 m.solve()
内容的提问来源于stack exchange,提问作者Star
相关产品推荐
相关产品推荐

