2021-08-31


前言

OOQP作为一款强大的开源凸优化库,支持C++,Matlab调用,现在这里记录下其简单的使用。


一、OOQP所包含参数的定义

OOQP统一的二次规划问题的公式如下:

在这里插入图片描述其中Q是正半定矩阵,c为线性部分矩阵,A为等式约束矩阵,C为不等式约束矩阵.
在这里OOQP采用了一些数据结构来存储稀疏矩阵以及对称矩阵.
稀疏矩阵由三个数据结构表示 – 两个整数向量和一个双精度向量,它们的长度都相同。对于矩阵C,这些数据结构为irowC,jcolC和dC。稀疏矩阵 中的非零元素综述总数为nnzC。C 的第k个非零元素出现在第irowC[k]行和第jcolC[k]列,其值为dC[k]。注意的是:行和列从零开始编号。
对称矩阵也用三个向量来表示,在irowQ,jcolQ和dQ中指定矩阵下三角的元素。
上下界向量采用两个向量来表示,例如,如果x的下届的第k个元素有下界,ixlow[k]设置为1,xlow[k]为其下界值;否则,都设置为0。

详细的参数介绍为
在这里插入图片描述

二、简单调用

1.头文件

要使用OOQP,一般需要包含库里的如下头文件:
代码如下(示例):

#include "ooqp/QpGenData.h"
#include "ooqp/QpGenVars.h"
#include "ooqp/QpGenResiduals.h"
#include "ooqp/GondzioSolver.h"
#include "ooqp/QpGenSparseMa27.h"

2.参数设置

代码如下(示例):部分参数只是给出了大小,并没在此处给出,实际应用时根据需要设置

  const int nx = 6;
  double c[6];

  double xupp[6];
  char ixupp[6] = {1,1,1,1,1,1};

  double xlow[6];
  char ixlow[6] = {1,1,1,1,1,1};

  const int nnzQ = 21;
  int irowQ[21];
  int jcolQ[21];
  double dQ[21];

  int my         = 0;
  double * b     = 0;
  int nnzA       = 0;
  int * irowA    = 0;
  int * jcolA    = 0;
  double * dA    = 0;

  const int mz = 10;
  double clow[10];
  char iclow[10] = {1,1,1,1,1,1,1,1,1,1};

  double cupp[10];
  char icupp[10] = {1,1,1,1,1,1,1,1,1,1};

  const int nnzC = 18;
  int irowC[18] = {0,0,1,1,2,2,3,3,4,5,5,6,6,7,7,8,8,9};
  int jcolC[18] = {0,1,1,2,0,1,1,2,1,3,4,4,5,3,4,4,5,4};
  double dC[18];

3.进行求解

代码如下(示例):以下步骤按照官方给的流程来即可

  QpGenSparseMa27 * qp
    = new QpGenSparseMa27( nx, my, mz, nnzQ, nnzA, nnzC );

  QpGenData * prob = (QpGenData * ) qp->copyDataFromSparseTriple(
        c,      irowQ,  nnzQ,   jcolQ,  dQ,
        xlow,   ixlow,  xupp,   ixupp,
        irowA,  nnzA,   jcolA,  dA,     b,
        irowC,  nnzC,   jcolC,  dC,
        clow,   iclow,  cupp,   icupp );

  QpGenVars  * vars
    = (QpGenVars *) qp->makeVariables( prob );
  QpGenResiduals * resid
    = (QpGenResiduals *) qp->makeResiduals( prob );

  GondzioSolver * s1  = new GondzioSolver( qp, prob );

  s1->monitorSelf();
  int ierr = s1->solve(prob,vars, resid);
  }

4.取出计算结果

代码如下(示例):完成求解后需要取出计算结果使用,计算结果存储在vals中,并且ierr用来标志求解是否成功,为0则成功.可以通过如下步骤取出结果存储在,向量force中

  Eigen::VectorXd force;
  force.resize(6);
  
  if(ierr==0){
    std::cout<<"Qp is Ok"<<std::endl;

    double val[6];
    vars->x->copyIntoArray(val);
    for(int i=0; i<6; i++){
      force[i] = val[i];
    }
  }

总结

至此,OOQP的简单使用结束,主要是说明了参数的含义,注意在使用时各个参数的维度一定要正确,其他的按照步骤流程来即可.

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值