我正在将一些MATLAB代码转换为Python。有一行让我有些麻烦:
[q,f_dummy,exitflag, output] = quadprog(H,f,-A,zeros(p*N,1),E,qm,[],[],q0,options);
我在MATLAB中查阅了文档,发现quadprog函数用于优化(尤其是最小化)。
我试图在Python中找到类似的功能(使用numpy),但似乎没有任何功能。
是否有更好的方法将这一行代码转换为Python?还是有其他可以使用的软件包?我需要做一个完成相同任务的新功能吗?
感谢您的时间和帮助!
答案 0 :(得分:3)
有一个名为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]
答案 1 :(得分:1)
OSQP是基于ADMM的专用免费QP解决程序。我为您的问题改编了OSQP documentation demo中的qpsolvers repository和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)
答案 2 :(得分:0)
我首先要提到二次编程问题是凸优化问题的子集,而 optimization 问题是子集。 >
有多个python软件包可以解决二次编程问题,特别是
cvxopt -解决了各种凸优化问题(包括二次规划问题)。这是先前cvx MATLAB package的python版本。
quadprog-仅用于二次编程问题,但似乎没有太多的文档。
scipy.optimize.minimize-这是一个非常通用的最小化器,可以解决二次编程问题以及其他优化问题(凸和非凸)。
您可能还会从this stackoverflow post的答案中受益,该答案包含更多详细信息和参考。
注意:user1911226'答案中的代码片段似乎来自此博客文章: https://scaron.info/blog/quadratic-programming-in-python.html 比较了其中一些二次编程程序包。我无法评论他们的答案,但是他们声称提到了cvxopt解决方案,但是代码实际上是针对Quadprog解决方案的。