2

我正在尝试使用 Python 包 CVXPY 来解决第一种形式的凸二次规划问题:https ://www.cvxpy.org/examples/basic/quadratic_program.html ,使用以下代码

x = np.variable(2 * N)
prob = cp.Problem(cp.Minimize((1/2) * cp.quad_form(x, P) + q @ x), [G @ x <= h, A @ x == b])
prob.solve(solver=cp.OSQP, verbose=True)

但是,对于某些数据,它给了我错误

ArpackNoConvergence: ARPACK error -1: No convergence (1001 iterations, 0/1 eigenvectors converged)

通过搜索互联网,似乎可以通过增加 ARPACK 中的迭代次数或增加容差来解决此问题。CVXPY 有 max_iters 和绝对精度的选项,但这些似乎不会影响 ARPACK 中的迭代次数,我假设它们适用于求解器的更高级别部分。

我在网上找不到任何关于这个特定问题的参考资料,或者确实找不到与 CVXPY 一起使用的 ARPACK。我对此感到很困惑,非常感谢任何帮助。

4

2 回答 2

2

这是因为 ARPACK 可能由于数值问题而无法在 PSD 矩阵上收敛,并且失败是随机发生的。见讨论

如果您知道 P 是 PSD 并且 PSD 检查失败,那么您可以将 P 替换为

P = cvxpy.atoms.affine.wraps.psd_wrap(P).

跳过 PSD 检查。

于 2021-11-07T06:25:03.510 回答
1

不运行这个(代码显然不完整),有两个候选:

  • :OSQP
  • B:cvxpy 中的内部 PSD 检查(在将数据提交给求解器之前!)

我猜它是B(你可能会切换到其他求解器来推理它)。

您设置的迭代参数与求解器有关,如果我猜对了,您甚至还没有达到这一点(规范化阶段错误)。

看来,您的矩阵在迭代特征值计算(ARPACK)方面引起了麻烦。也许这可以通过它的条件数看出。

不确定,如果您的用例有一个简单的转换/扰动来改善这里的条件。

如果不从源代码重建 cvxpy,很多内部组件都不容易访问,但在这种情况下,您可以通过更改cvxpy.settings.settings.EIGVAL_TOL来摆脱困境:

import cvxpy as cp
print(cp.settings.EIGVAL_TOL)
# 1e-10
cp.settings.EIGVAL_TOL = 1e-08

... do your work

(如果您的数据由于某些错误而不是机密而没有完全损坏,我会假设 cvxpy-people 会很乐意获取您的数据作为示例,也重新评估一些内部公差 - > github 问题与可重现的代码,包括数据

于 2020-07-27T17:31:38.697 回答