前言
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的简单使用结束,主要是说明了参数的含义,注意在使用时各个参数的维度一定要正确,其他的按照步骤流程来即可.