MOSEK中如何将Expression转换为Variable并求解范数幂次约束
范数幂次建模实现方案
你不需要将Expr::sub(x_0, start_)转换为Variable类型,通过引入辅助变量+锥约束的方式即可直接完成范数幂次的建模,具体实现逻辑如下:
- 你现有代码已经通过二阶锥约束实现了
t0 ≥ ||x_0 - start_||_2的约束定义,若要实现范数的幂次约束,只需要额外增加一层对应幂次的锥约束即可。 - 以最常用的2范数平方场景为例,完整实现代码如下:
Model::t M = new Model(); auto start_ = new_array_ptr<double, 1>({-4, 0, 2}); auto x_0 = M->variable(new_array_ptr<int,1>({3, 1}), Domain::unbounded()); // 辅助变量s表示2范数值,约束s ≥ ||x_0 - start_||_2 auto s = M->variable(Domain::greaterThan(0.0)); M->constraint(Expr::vstack(s, Expr::sub(x_0, start_)), Domain::inQCone()); // 辅助变量t表示范数的平方,约束t ≥ s²,通过旋转二阶锥实现 auto t = M->variable(Domain::greaterThan(0.0)); M->constraint(Expr::vstack(0.5, t, s), Domain::inRotatedQCone());
- 如果是通用p次幂(p>1)的场景,调用
Domain::inPPowerCone(p)幂锥接口即可实现t ≥ s^p的约束,不需要对已有表达式做类型转换。
内容的提问来源于stack exchange,提问作者GPrathap
相关产品推荐
相关产品推荐

