qpoases
这个库函数本来被设计来作为MPC的应用,但是也是一个可靠的QP算法求解方案。作为求解参数二次规划的有效集算法。
使用说明书
QP问题
二次规划问题
带有二次型目标函数和约束条件的最优化问题。
基础概念
二次型:函数中最高次为2次的函数。用矩阵可以记为;
正定矩阵 Positive Definite Matrix:,设在二次型中,对于任何,都有,称为正定二次型,称对称矩阵A为正定的;如果对于任何,都有,称为负定二次型,称对称矩阵A为负定的。
Hesse矩阵(海塞矩阵):常用于牛顿法解决最优化问题。是一个类似与雅可比矩阵的概念,不过其是二阶导数的矩阵,但是雅可比矩阵是一阶导数的矩阵。如果函数f是连续的,则它的Hesse矩阵一定是对称阵。 得到函数f的Hesse矩阵有什么用呢?Hesse可以用于多元函数极值的判定。
在清华的课程中也讲到了二次规划的问题:
使用qpOASES求解步骤
以下文档都是从3.2版本的用户说明书中提取的简要部分,如果需要详细的还请阅读说明书:
- 首先实例化一个QProblrm类的对象
QProblem( int_t nV, int_t nC );
nv表示变量的个数,nc表示二次约束的的个数。
ex:QProblem example( nV,nC );
- 初始化对象求求解。
H:hessian矩阵
g:梯度向量?
A:约束矩阵
lb ub:上下限边界向量
lbA ubA:上下限约束向量 。 这个向量中不仅包含了不等式,也包括了等式的约束,将上限和下限设置为相同数值即可表示为等式约束!
nWSR: 最大迭代次数
cputime:如果输入不为空,就会输出整个初始化和求解所花的时间。
如果那一项是没有的,就看可以传入一个空指针。解完后所有的向量需要自己释放内存。但是矩阵H A不需要。
使用qpOASES求解方式
QP问题分为许多种,有一些没有等式约束项,一些没有不等式约束项。因此在qpOASES中也有好几个方法来解决不同的问题,相比之下针对不同问题选择不同方法的效率会更高:
针对不同的种类的详细用法可以参考/examples/example**.cpp
同时这个库可以解决线性规划,但是效率极低!
qpOASES其余设置
- 可以返回各项参数的数值
- 可以定义
Options myOptions; qp.setOptions( myOptions );
设定需要设置的各参数- ex:
Options myOptions;
myOptions.setToMPC( );
myOptions.printLevel = PL_LOW;
qp.setOptions( myOptions );
可以通过指定用于评估约束的函数来提升速度,但是可能这是naive的
能够设置最大时间限制。因此由于时间测量的不准确,实际的总CPU时间可能比允许的CPU时间稍高一些。
来源:CSDN
作者:一只Hope
链接:https://blog.csdn.net/Q_upup/article/details/104731187