OSQP是一款基于ADMM的专业免费QP求解器。我已经针对您的问题调整了OSQP文档演示和qpsolvers存储库中的OSQP调用。
请注意,矩阵H
和G
应该以CSC格式稀疏表示。以下是脚本:
import numpy as np
import scipy.sparse as spa
import osqp
def quadprog(P, q, G=None, h=None, A=None, b=None,
initvals=None, verbose=True):
l = -np.inf * np.ones(len(h))
if A is not None:
qp_A = spa.vstack([G, A]).tocsc()
qp_l = np.hstack([l, b])
qp_u = np.hstack([h, b])
else:
qp_A = G
qp_l = l
qp_u = h
model = osqp.OSQP()
model.setup(P=P, q=q,
A=qp_A, l=qp_l, u=qp_u, verbose=verbose)
if initvals is not None:
model.warm_start(x=initvals)
results = model.solve()
return results.x, results.info.status
n = 2
H = spa.csc_matrix([[4, 1], [1, 2]])
f = np.array([1, 1])
G = spa.csc_matrix([[1, 0], [0, 1]])
h = np.array([0.7, 0.7])
A = spa.csc_matrix([[1, 1]])
b = np.array([1.])
q0 = np.ones(n)
x, status = quadprog(H, f, G, h, A, b, initvals=q0, verbose=True)
scipy.optimize
的内部结构?NumPy只提供了基本的处理数字数组的功能;而SciPy在此基础上构建了许多其他数学和科学相关的功能,包括各种优化算法。 - abarnertquadprog
的库,还有一些Python绑定的QuadProg++,当然也可能有其他的库。(但其中一些可能不是基于NumPy构建的。)但到了这个地步,这就变成了一个关于推荐库的问题,而Stack Overflow不幸地不是寻找这些库的地方。 - abarnert