Drake 和 Mosek 的 SOS 多项式产生错误代码 1501
SOS polynomial with Drake and Mosek yields error code 1501
我正在尝试用 SOSPolynomial 求解 MathematicalProgram。我是使用 Mosek 从源代码编译的 C++ 中的 运行 Drake。
MathematicalProgram 包含二次成本函数和一些等式约束,在不添加 SOS 多项式的情况下调用 Solve()
时工作正常。当查看 result.get_solver_id()
时,我发现:"Equality constrained QP",正如预期的那样。
然而,在调用 Solve()
后,通过 prog.NewSosPolynomial({t}, degree)
添加 SOS 多项式(t
是一个决策变量)程序 returns 无法解决被发现。查看 result_.get_solution_result()
中的值时,我发现 solution_status = false
和 rescode = 1501
.
寻找here,rescode = 1501
表示:"The problem contains nonlinear terms conic constraints. The requested operation cannot be applied to this type of problem."。但是,通过在添加 SOS 多项式之前检查 result.get_solver_id()
的值,很明显问题中没有其他非线性约束。
我是不是遗漏了什么,或者这是一个错误?
有意思。半定规划的标准形式(由我们的 SOS 约束产生)只接受线性目标,而不接受二次目标。这不会导致任何一般性损失,因为您可以使用松弛变量。您可以尝试以下操作吗:
现在你有类似的东西
min x'Qx
s.t. Ax=b, p(t) is SOS.
你能把它写成
min a
s.t. Ax=b, p(t) is SOS, x'Qx <= a
但使用 AddLorenzConeConstraint
添加 x'Qx <= a
? (注意:看起来您实际上可能会使用 x'Qx <= a^2
和 a >= 0
)。
我正在尝试用 SOSPolynomial 求解 MathematicalProgram。我是使用 Mosek 从源代码编译的 C++ 中的 运行 Drake。
MathematicalProgram 包含二次成本函数和一些等式约束,在不添加 SOS 多项式的情况下调用 Solve()
时工作正常。当查看 result.get_solver_id()
时,我发现:"Equality constrained QP",正如预期的那样。
然而,在调用 Solve()
后,通过 prog.NewSosPolynomial({t}, degree)
添加 SOS 多项式(t
是一个决策变量)程序 returns 无法解决被发现。查看 result_.get_solution_result()
中的值时,我发现 solution_status = false
和 rescode = 1501
.
寻找here,rescode = 1501
表示:"The problem contains nonlinear terms conic constraints. The requested operation cannot be applied to this type of problem."。但是,通过在添加 SOS 多项式之前检查 result.get_solver_id()
的值,很明显问题中没有其他非线性约束。
我是不是遗漏了什么,或者这是一个错误?
有意思。半定规划的标准形式(由我们的 SOS 约束产生)只接受线性目标,而不接受二次目标。这不会导致任何一般性损失,因为您可以使用松弛变量。您可以尝试以下操作吗:
现在你有类似的东西
min x'Qx
s.t. Ax=b, p(t) is SOS.
你能把它写成
min a
s.t. Ax=b, p(t) is SOS, x'Qx <= a
但使用 AddLorenzConeConstraint
添加 x'Qx <= a
? (注意:看起来您实际上可能会使用 x'Qx <= a^2
和 a >= 0
)。