我正在将一些MATLAB代码翻译成Python。有一行代码给我带来了一些麻烦:
[q,f_dummy,exitflag, output] = quadprog(H,f,-A,zeros(p*N,1),E,qm,[],[],q0,options);
我查阅了MATLAB中的文档,发现使用了quadprog函数进行优化(特别是最小化)。
我试图在Python中找到类似的函数(使用numpy),但似乎没有。
有没有更好的方法把这行代码翻译成Python?或者有其他可以使用的包吗?我需要创建一个完成相同任务的新函数吗?
感谢您的时间和帮助!
发布于 2018-07-04 07:34:58
有一个名为CVXOPT的库,其中包含二次编程。
def quadprog_solve_qp(P, q, G=None, h=None, A=None, b=None):
qp_G = .5 * (P + P.T) # make sure P is symmetric
qp_a = -q
if A is not None:
qp_C = -numpy.vstack([A, G]).T
qp_b = -numpy.hstack([b, h])
meq = A.shape[0]
else: # no equality constraint
qp_C = -G.T
qp_b = -h
meq = 0
return quadprog.solve_qp(qp_G, qp_a, qp_C, qp_b, meq)[0]
发布于 2018-07-06 06:21:11
OSQP是一个基于ADMM的专门的免费QP求解器。我已经针对您的问题调整了qpsolvers repository中的OSQP documentation demo和OSQP调用。
请注意,在CSC format中,矩阵H
和G
应该是稀疏的。这是脚本
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: # no equality constraint
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
# Generate problem data
n = 2 # Variables
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.])
# Initial point
q0 = np.ones(n)
x, status = quadprog(H, f, G, h, A, b, initvals=q0, verbose=True)
https://stackoverflow.com/questions/51161348
复制相似问题