代码之家  ›  专栏  ›  技术社区  ›  A.Torres

使用numpy在python中进行二次编程?

  •  2
  • A.Torres  · 技术社区  · 6 年前

    我正在把一些matlab代码翻译成python。有一句话让我有点麻烦:

    [q,f_dummy,exitflag, output] = quadprog(H,f,-A,zeros(p*N,1),E,qm,[],[],q0,options);
    

    我在Matlab中查阅了文档,发现Quadprog函数用于优化(特别是最小化)。

    我试图在Python中找到类似的函数(使用numpy),但似乎没有。

    是否有更好的方法将这一行代码转换为python?或者有其他可以使用的包吗?我需要做一个完成相同任务的新功能吗?

    谢谢你的时间和帮助!

    2 回复  |  直到 6 年前
        1
  •  3
  •   user1911226    6 年前

    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] 
    
        2
  •  1
  •   bstellato    6 年前

    OSQP OSQP documentation demo qpsolvers repository

    H G CSC format

    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)