当前位置: 首页 > news >正文

OSQP二次规划求解库使用说明

OSQP二次规划求解库使用说明

贺志国
2023.5.10

1. 凸二次规划的一般表达式

m i n 1 2 x T P x + q T x s . t . l ≤ A x ≤ u min \quad \frac{1}{2}x^T Px + q^Tx \qquad s.t. \quad l \leq Ax \leq u min21xTPx+qTxs.t.lAxu
其中, P P P称为内核矩阵,要求是半正定矩阵。正定矩阵在复数域上是共轭对称矩阵(Hermite矩阵),在实数域上是对称矩阵。因为我们在实数域内求解, P P P也是一个对称矩阵。 q q q称为偏移向量, A A A称为仿射矩阵。

凸二次规划的求解算法主要有如下几种:

  • 有效集法:Active Set Method
  • 内点法:Interior Point Method
  • 一阶方法:First Order Method
  • 交替方向乘子法:Alternating Direction Method of Multipliers(ADMM)

OSQP利用交替方向乘子法(ADMM)求解,qpOASES则利用有效集法,从网上给出的测评报告看,OSQP库的求解效率比qpOASES库要高很多。

2. 使用OSQP求解凸二次规划的简单示例

为了形象地说明使用OSQP求解凸二次规划的过程,下面给出一个简单的示例:
m i n 1 2 x T [ 4 1 1 2 ] x + [ 1 1 ] T x min \quad \frac{1}{2}x^T\left[\begin{matrix} 4 & 1\\ 1 & 2\end{matrix}\right]x + \left[\begin{matrix} 1 \\ 1\end{matrix}\right]^Tx min21xT[4112]x+[11]Tx
s.t. (subject to):
[ 1 0 0 ] ≤ [ 1 1 1 0 0 1 ] x ≤ [ 1 0.7 0.7 ] \left[\begin{matrix}1 \\ 0 \\ 0 \end{matrix}\right] \leq \left[\begin{matrix} 1 & 1 \\ 1 & 0 \\ 0 & 1 \end{matrix}\right]x \leq \left[\begin{matrix}1 \\ 0.7 \\ 0.7 \end{matrix}\right] 100 110101 x 10.70.7
本示例中,内核矩阵 P = [ 4 1 1 2 ] P=\left[\begin{matrix} 4 & 1\\1 & 2\end{matrix}\right] P=[4112]的元素全部为实数,因此它一定是对称矩阵。对于对称矩阵,只需要存储上三角矩阵即可,这也是OSQP存储稀疏矩阵的常见做法,当然也是该库提高计算效率的有效措施。

具体而言,OSQP库使用csc_matrix(indices, indptr, data, csc = Compressed Sparse Column)的方式来存储一个矩阵。csc_matrix存储格式定义如下:

  • indices is array of row indices
  • data is array of corresponding nonzero values
  • indptr points to column starts in indices and data

下面仍然以内核矩阵 P = [ 4 1 1 2 ] P=\left[\begin{matrix} 4 & 1\\1 & 2\end{matrix}\right] P=[4112]为例进行说明。首先,将内核矩阵简化为上三角矩阵:
P = [ 4 1 0 2 ] P=\left[\begin{matrix} 4 & 1\\0 & 2\end{matrix}\right] P=[4012]
P P P的非零元素个数为3,记为:P_nnz = 3 (nnz: number of non-zero elements)

P P P中非零元素为:4, 1, 2,记为:P_x = {4, 1, 2};

P P P中非零元素行索引为:0, 0, 1,这是按照先第一列,再第二列。。。,最后第N列的顺序标记。第一列的非零元素是4,行索引为0;第二列的非零元素为1, 2,行索引分别为:0, 1,于是记为:P_i = {0, 0, 1};

P P P中第一列非零元素是1个,第二列非零元素是2个,记为:P_p = {0, 1, 3}。这个记法有些反人类,也很难形象理解,容我再详细解释一番。P_p元素个数为矩阵列数加1P_p的第一个元素为0,P_p中前后两个元素的差值表示矩阵P相应列的非零元素个数。例如:P_p = {0, 1, 3}表示:1 - 0 = 1 代表矩阵P第一列元素非零个数为1个,3 - 1 = 2 代表矩阵P第二列元素非零个数为2个。助记方法:P_i (i代表indices), P_p(p代表indptr)。

根据上述介绍,下面给出该示例的求解代码:

#include "osqp.h"int main(int argc, char **argv) {// P矩阵是对称矩阵,只存储上三角部分,下三角部分视为零值c_float P_x[3] = {4.0, 1.0, 2.0, }; // P矩阵非零元素个数为3// nnz = number of non-zero elements.c_int P_nnz = 3; // P矩阵非零元素行索引,按照先第一列,再第二列。。。// 的顺序排列。下例表示非零元素的行序号为0、0、1c_int P_i[3] = {0, 0, 1, }; // 1-0=1表示第0列非零元素个数// 3-1=2表示第1列非零元素个数c_int P_p[3] = {0, 1, 3, }; c_float q[2] = {1.0, 1.0, };// A矩阵非零元素c_float A_x[4] = {1.0, 1.0, 1.0, 1.0, };// A矩阵非零元素个数为4c_int A_nnz = 4;// A矩阵非零元素的行序号为0、1、0、2(按列排序)c_int A_i[4] = {0, 1, 0, 2, };// 2-0=2表示第0列2个元素非零// 4-2=2表示第1列2个元素非零c_int A_p[3] = {0, 2, 4, };c_float l[3] = {1.0, 0.0, 0.0, };c_float u[3] = {1.0, 0.7, 0.7, };c_int n = 2;c_int m = 3;// Exitflagc_int exitflag = 0;// Workspace structuresOSQPWorkspace *work;OSQPSettings  *settings = (OSQPSettings *)c_malloc(sizeof(OSQPSettings));OSQPData      *data     = (OSQPData *)c_malloc(sizeof(OSQPData));// Populate dataif (data) {data->n = n;data->m = m;data->P = csc_matrix(data->n, data->n, P_nnz, P_x, P_i, P_p);data->q = q;data->A = csc_matrix(data->m, data->n, A_nnz, A_x, A_i, A_p);data->l = l;data->u = u;}// Define solver settings as defaultif (settings) {osqp_set_default_settings(settings);settings->alpha = 1.0; // Change alpha parameter}// Setup workspaceexitflag = osqp_setup(&work, data, settings);// Solve Problemosqp_solve(work);// Cleanupif (data) {if (data->A) c_free(data->A);if (data->P) c_free(data->P);c_free(data);}if (settings) c_free(settings);return exitflag;
}

相关文章:

OSQP二次规划求解库使用说明

OSQP二次规划求解库使用说明 贺志国 2023.5.10 1. 凸二次规划的一般表达式 m i n 1 2 x T P x q T x s . t . l ≤ A x ≤ u min \quad \frac{1}{2}x^T Px q^Tx \qquad s.t. \quad l \leq Ax \leq u min21​xTPxqTxs.t.l≤Ax≤u 其中, P P P称为内核矩阵&#x…...

Elasticsearch(一)

Elasticsearch(一) 初始elasticsearch 什么是elasticsearch elasticsearch是一款非常强大的开源搜索引擎,可以帮助我们从海量数据中快速查找到需要的内容 elasticsearch结合kibana、Logstash、Beats,也就是elastic stack&…...

深入探究Java中的枚举类型:定义、特性和应用

引言: 在Java编程中,枚举类型是一种强大而灵活的工具,用于定义一组具名的常量。它不仅提供了代码可读性和可维护性的优势,还为开发人员提供了一种更安全和结构化的方式来处理固定的常量集合。本文将深入探讨Java中的枚举类型&…...

linux密码忘了?一招解决

目录 一、前言 二、进入编辑界面 三、单用户模式 四、修改密码 五、更新信息 六、退出 七、验证 一、前言 版本:centos7.9、VMware15.5 在我们学习linux运行级别的时候,面试题可能会出如何找回root密码,下面来详细的介绍一波&#xff…...

苹果mac清理软件CleanMyMac X v4.13兼容13系统,堪称Mac最好的系统清理工具

CleanMyMac X for mac是MacOS上一款Mac清理优化工具,不仅包含各种清理功能,更是具有卸载器、维护、扩展、碎纸机这些实用功能,可以同时代替很多工具。它可以清理,优化,保养和监测您的电脑,确保您的Mac运行…...

FPGA实现Cordic算法求解arctan和sqr(x*2 + y* 2)

一. 简介 由于在项目中需要使用的MPU6050,进行姿态解算,计算中设计到**arctan 和 sqr(x2 y 2),**这两部分的计算,在了解了一番之后,发现Cordic算法可以很方便的一次性求出这两个这两部分的计算。另外也可以一次性求出sin和cos的…...

【最终截稿 | Springer 独立出版 | EI稳定检索】 2023年绿色建筑国际会议(ICoGB 2023)

会议简介 Brief Introduction 2023年绿色建筑国际会议(ICoGB 2023) 会议时间:2023年5月21日-23日 召开地点:瑞典斯德哥尔摩 大会官网:www.icogb.org ICoGB 2023将围绕“绿色建筑”的最新研究领域而展开,为研究人员、工程师、专家学…...

Flutter常用状态管理框架及优缺点

Flutter 中常见的状态管理框架有以下几种: Provider: Provider 是一个轻量级的状态管理框架,可用于单个 Widget 或整个 Widget 树中分发状态。它通过 InheritedWidget 和 ChangeNotifier 来实现状态管理,并支持依赖项注入。Redux…...

Ubuntu 20.04 系统配置 OpenVINO 2022.3 环境

由于 OpenVINO 2021 版本在调用 IECore 时会出现 Segmentation fault 的问题,因此需要将其升级为 2022 版本的。 1. 卸载原来版本的 OpenVINO 进入OpenVINO的卸载目录,通常在 /opt/intel 文件夹下, cd /opt/intel/openvino_2021/openvino_…...

浏览器存储技术:localStorage、sessionStorage和cookie的区别

随着互联网技术的不断发展,人们越来越依赖浏览器进行网页浏览和数据处理。浏览器存储技术是Web开发中非常重要的一部分,它可以帮助我们在浏览器端存储数据,而无需将数据传输到服务器。本文将介绍三种常见的浏览器存储技术:localSt…...

MySQL中的内连接和外连接

一、MySQL内连接(INNER JOIN) 内连接,又称为等值连接,是最常见的连接类型。它根据两个(或多个)表中具有相同列值的行来创建一个新的结果表。在内连接中,只有通过连接条件匹配的行才会被包含在结…...

node学习手册

Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行时,使 JavaScript 可以脱离浏览器环境运行在服务端。它提供了一组 API,可以让开发者轻松地进行服务器端编程。 以下是 Node.js 的学习手册: 安装 Node.js 首先,需要在官网…...

Java中的JSP是什么?如何实现JSP

JavaServer Pages(JSP)是一种Java技术,可以用于开发动态Web应用程序。它允许开发人员将Java代码嵌入到HTML页面中,以便生成动态内容。本文将介绍JSP的工作原理,以及如何在Java中实现JSP。 JSP的工作原理 JSP的工作原…...

c++之函数对象和谓词

目录 函数对象: 谓词: 一元谓词函数举例如下 二元谓词举例如下 函数对象和函数的区别 一元谓词的案例 二元函数对象案例 二元谓词案例 函数对象: 重载函数调用操作符的类,其对象常称为函数对象(function obj…...

《Andorid开源》greenDao 数据库orm框架

一 前言:以前没用框架写Andorid的Sqlite的时候就是用SQLiteDatabase ,SQLiteOpenHelper ,SQL语句等一些东西,特别在写SQL语句来进行 数据库操作的时候是一件很繁琐的事情,有时候没有错误提示的,很难找到错误的地方&a…...

Android类似微信聊天页面教程(Kotlin)五——选择发送图片

前提条件 安装并配置好Android Studio Android Studio Electric Eel | 2022.1.1 Patch 2 Build #AI-221.6008.13.2211.9619390, built on February 17, 2023 Runtime version: 11.0.150-b2043.56-9505619 amd64 VM: OpenJDK 64-Bit Server VM by JetBrains s.r.o. Windows 11 …...

MongoDB:Win/Linux环境安装及一键部署脚本

1. Win安装 1.1 下载 MongoDB 安装程序 访问 MongoDB 官网,进入下载页面:Download MongoDB Community Server | MongoDB 选择 Windows 平台并下载最新版的 MongoDB 安装程序。 1.2 安装 MongoDB 双击安装程序,按照提示完成 MongoDB 的安装…...

KingbaseES V8R3 集群运维系列 -- failover切换后集群自动恢复

​ 案例说明: KingbaseES V8R3集群默认在触发failover切换后,为保证数据安全,原主库需要通过人工介入后,恢复为新的备库加入到集群。在无人值守的现场环境,需要在触发failover切换后,主库可以自动恢复为新备…...

【Selenium中】——全栈开发——如桃花来

目录索引 查找元素:查找方法:单个元素查找:多个元素查找:*代码演示:* 元素交互操作:清空文字: 推荐的变量名定义名称:执行JavaScript :滚动页面方法:*滚动到底…...

Sarsa增强版之Sarsa-λ依然走迷宫

Sarsa-λ(Sarsa Lambda)是Sarsa算法的一种变体,其中“λ”表示一个介于0和1之间的参数,用于平衡当前状态和之前所有状态的重要性。 Sarsa算法是一种基于Q-learning算法的增量式学习方法,通过在实际环境中不断探索和学…...

MPNet:旋转机械轻量化故障诊断模型详解python代码复现

目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...

云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?

大家好,欢迎来到《云原生核心技术》系列的第七篇! 在上一篇,我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在,我们就像一个拥有了一块崭新数字土地的农场主,是时…...

零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?

一、核心优势:专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发,是一款收费低廉但功能全面的Windows NAS工具,主打“无学习成本部署” 。与其他NAS软件相比,其优势在于: 无需硬件改造:将任意W…...

应用升级/灾备测试时使用guarantee 闪回点迅速回退

1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间, 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点,不需要开启数据库闪回。…...

Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式

点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...

图表类系列各种样式PPT模版分享

图标图表系列PPT模版,柱状图PPT模版,线状图PPT模版,折线图PPT模版,饼状图PPT模版,雷达图PPT模版,树状图PPT模版 图表类系列各种样式PPT模版分享:图表系列PPT模板https://pan.quark.cn/s/20d40aa…...

python报错No module named ‘tensorflow.keras‘

是由于不同版本的tensorflow下的keras所在的路径不同,结合所安装的tensorflow的目录结构修改from语句即可。 原语句: from tensorflow.keras.layers import Conv1D, MaxPooling1D, LSTM, Dense 修改后: from tensorflow.python.keras.lay…...

【VLNs篇】07:NavRL—在动态环境中学习安全飞行

项目内容论文标题NavRL: 在动态环境中学习安全飞行 (NavRL: Learning Safe Flight in Dynamic Environments)核心问题解决无人机在包含静态和动态障碍物的复杂环境中进行安全、高效自主导航的挑战,克服传统方法和现有强化学习方法的局限性。核心算法基于近端策略优化…...

AirSim/Cosys-AirSim 游戏开发(四)外部固定位置监控相机

这个博客介绍了如何通过 settings.json 文件添加一个无人机外的 固定位置监控相机,因为在使用过程中发现 Airsim 对外部监控相机的描述模糊,而 Cosys-Airsim 在官方文档中没有提供外部监控相机设置,最后在源码示例中找到了,所以感…...

HubSpot推出与ChatGPT的深度集成引发兴奋与担忧

上周三,HubSpot宣布已构建与ChatGPT的深度集成,这一消息在HubSpot用户和营销技术观察者中引发了极大的兴奋,但同时也存在一些关于数据安全的担忧。 许多网络声音声称,这对SaaS应用程序和人工智能而言是一场范式转变。 但向任何技…...