OSQP文档学习
OSQP官方文档
1 QSQP简介
OSQP求解形式为的凸二次规划:

x ∈ R n x∈R^n x∈Rn:优化变量
P ∈ S + n P∈S^n_+ P∈S+n:半正定矩阵
特征
(1)高效:使用了一种自定义的基于ADMM的一阶方法,只需要在设置阶段进行单个矩阵分解。
(2)鲁棒:该算法设置之后不需要对问题数据进行假设(问题只需要是凸的)。
(3)原始/对偶不可行问题:当问题是原始或对偶不可行时,OSQP会检测到它。这是第一个基于一阶方法的QP求解器。
(4)可嵌入:有一个简单的接口来生成定制的可嵌入C代码,而不需要内存管理器。
(5)不需要外部库即可运行
(6)可以很容易地进行热启动,并且可以缓存矩阵分解,以非常有效地解决参数化问题
(7)接口:提供了到C、C++、Fortran、Julia、Matlab、Python、R、Ruby和Rust的接口
2 OSQP求解器

求解器运行以下ADMM算法:

Π \Pi Π:投影到超盒上 [ l , u ] [l,u] [l,u], ρ \rho ρ是ADMM步长
Linear system solution
线性系统解是算法的核心部分。它可以使用直接或间接的方法来完成。
使用直接线性系统求解器,我们求解以下具有拟定矩阵的线性系统:

使用间接线性系统求解器,我们求解以下具有正定矩阵的线性系统:

OSQP核心旨在支持不同的线性系统求解器。
Convergence
在每k次迭代时,OSQP生成一个元组 ( x k , z k , y k ) (x^k,z^k,y^k) (xk,zk,yk),
x k ∈ R n , z k 、 y k ∈ R m x^k∈R^n,z^k、y^k∈R^m xk∈Rn,zk、yk∈Rm
与 ( x k , z k , y k ) (x^k,z^k,y^k) (xk,zk,yk)相关的原始残差和对偶残差:



不可行问题
OSQP能够检测问题是原始不可行还是对偶不可行。

3 Get started
安装:
Linux操作系统,默认gcc,cmake已经安装好
① 克隆存储库
git clone https://github.com/osqp/osqp
② 创建目录和更改目录build
cd osqp
mkdir build
cd build
③ 创建 Makefile
cmake -G "Unix Makefiles" ..
④ 编译 OSQP
cmake --build .
C语言:
在 CMake 项目中包括 OSQP,具体取决于您需要共享库还是静态库:
# Find OSQP library and headers
find_package(osqp REQUIRED)# Link the OSQP shared library
target_link_libraries(yourTarget PRIVATE osqp::osqp)# or...# Link the OSQP static library
target_link_libraries(yourTarget PRIVATE osqp::osqpstatic)
4 接口
OSQP有几个接口。以下链接中显示了有关设置、状态值以及如何指定不同线性系统解算器的信息
Solver settings
Linear Systems Solvers
Status values


C:github.com/osqp/osqp
C++:github.com/robotology/osqp-eigen
5 Examples
Demo:
① Setup and solve :设置和求解

C:
#include <stdlib.h>
#include "osqp.h"int main(int argc, char **argv) {/* Load problem data */OSQPFloat P_x[3] = {4.0, 1.0, 2.0, };OSQPInt P_nnz = 3;OSQPInt P_i[3] = {0, 0, 1, };OSQPInt P_p[3] = {0, 1, 3, };OSQPFloat q[2] = {1.0, 1.0, };OSQPFloat A_x[4] = {1.0, 1.0, 1.0, 1.0, };OSQPInt A_nnz = 4;OSQPInt A_i[4] = {0, 1, 0, 2, };OSQPInt A_p[3] = {0, 2, 4, };OSQPFloat l[3] = {1.0, 0.0, 0.0, };OSQPFloat u[3] = {1.0, 0.7, 0.7, };OSQPInt n = 2;OSQPInt m = 3;/* Exitflag */OSQPInt exitflag = 0;/* Solver, settings, matrices */OSQPSolver *solver;OSQPSettings *settings;OSQPCscMatrix* P = malloc(sizeof(OSQPCscMatrix));OSQPCscMatrix* A = malloc(sizeof(OSQPCscMatrix));/* Populate matrices */csc_set_data(A, m, n, A_nnz, A_x, A_i, A_p);csc_set_data(P, n, n, P_nnz, P_x, P_i, P_p);/* Set default settings */settings = (OSQPSettings *)malloc(sizeof(OSQPSettings));if (settings) {osqp_set_default_settings(settings);settings->alpha = 1.0; /* Change alpha parameter */}/* Setup solver */exitflag = osqp_setup(&solver, P, q, A, l, u, m, n, settings);/* Solve problem */if (!exitflag) exitflag = osqp_solve(solver);/* Cleanup */osqp_cleanup(solver);if (A) free(A);if (P) free(P);if (settings) free(settings);return (int)exitflag;
};
② Update vectors:更新向量

#include <stdlib.h>
#include "osqp.h"int main(int argc, char **argv) {/* Load problem data */OSQPFloat P_x[3] = {4.0, 1.0, 2.0, };OSQPInt P_nnz = 3;OSQPInt P_i[3] = {0, 0, 1, };OSQPInt P_p[3] = {0, 1, 3, };OSQPFloat q[2] = {1.0, 1.0, };OSQPFloat q_new[2] = {2.0, 3.0, };OSQPFloat A_x[4] = {1.0, 1.0, 1.0, 1.0, };OSQPInt A_nnz = 4;OSQPInt A_i[4] = {0, 1, 0, 2, };OSQPInt A_p[3] = {0, 2, 4, };OSQPFloat l[3] = {1.0, 0.0, 0.0, };OSQPFloat l_new[3] = {2.0, -1.0, -1.0, };OSQPFloat u[3] = {1.0, 0.7, 0.7, };OSQPFloat u_new[3] = {2.0, 2.5, 2.5, };OSQPInt n = 2;OSQPInt m = 3;/* Exitflag */OSQPInt exitflag = 0;/* Solver, settings, matrices */OSQPSolver *solver;OSQPSettings *settings;OSQPCscMatrix* P = malloc(sizeof(OSQPCscMatrix));OSQPCscMatrix* A = malloc(sizeof(OSQPCscMatrix));/* Populate matrices */csc_set_data(A, m, n, A_nnz, A_x, A_i, A_p);csc_set_data(P, n, n, P_nnz, P_x, P_i, P_p);/* Set default settings */settings = (OSQPSettings *)malloc(sizeof(OSQPSettings));if (settings) osqp_set_default_settings(settings);/* Setup solver */exitflag = osqp_setup(&solver, P, q, A, l, u, m, n, settings);/* Solve problem */if (!exitflag) exitflag = osqp_solve(solver);/* Update problem */if (!exitflag) exitflag = osqp_update_data_vec(solver, q_new, l_new, u_new);/* Solve updated problem */if (!exitflag) exitflag = osqp_solve(work);/* Cleanup */osqp_cleanup(solver);if (A) free(A);if (P) free(P);if (settings) free(settings);return (int)exitflag;
};
③ Update matrices:更新矩阵P和A

#include <stdlib.h>
#include "osqp.h"int main(int argc, char **argv) {/* Load problem data */OSQPFloat P_x[3] = {4.0, 1.0, 2.0, };OSQPFloat P_x_new[3] = {5.0, 1.5, 1.0, };OSQPInt P_nnz = 3;OSQPInt P_i[3] = {0, 0, 1, };OSQPInt P_p[3] = {0, 1, 3, };OSQPFloat q[2] = {1.0, 1.0, };OSQPFloat q_new[2] = {2.0, 3.0, };OSQPFloat A_x[4] = {1.0, 1.0, 1.0, 1.0, };OSQPFloat A_x_new[4] = {1.2, 1.5, 1.1, 0.8, };OSQPInt A_nnz = 4;OSQPInt A_i[4] = {0, 1, 0, 2, };OSQPInt A_p[3] = {0, 2, 4, };OSQPFloat l[3] = {1.0, 0.0, 0.0, };OSQPFloat l_new[3] = {2.0, -1.0, -1.0, };OSQPFloat u[3] = {1.0, 0.7, 0.7, };OSQPFloat u_new[3] = {2.0, 2.5, 2.5, };OSQPInt n = 2;OSQPInt m = 3;/* Exitflag */OSQPInt exitflag = 0;/* Solver, settings, matrices */OSQPSolver *solver;OSQPSettings *settings;OSQPCscMatrix* P = malloc(sizeof(OSQPCscMatrix));OSQPCscMatrix* A = malloc(sizeof(OSQPCscMatrix));/* Populate matrices */csc_set_data(A, m, n, A_nnz, A_x, A_i, A_p);csc_set_data(P, n, n, P_nnz, P_x, P_i, P_p);/* Set default settings */settings = (OSQPSettings *)malloc(sizeof(OSQPSettings));if (settings) osqp_set_default_settings(settings);/* Setup solver */exitflag = osqp_setup(&solver, P, q, A, l, u, m, n, settings);/* Solve problem */if (!exitflag) exitflag = osqp_solve(solver);/* Update problemNB: Update only upper triangular part of P*/if (!exitflag) exitflag = osqp_update_data_mat(solver,P_x_new, OSQP_NULL, 3,A_x_new, OSQP_NULL, 4);/* Solve updated problem */if (!exitflag) exitflag = osqp_solve(work);/* Cleanup */osqp_cleanup(solver);if (A) free(A);if (P) free(P);if (settings) free(settings);return (int)exitflag;
};
应用:
① Huber fitting
② Lasso
③ Least-squares:最小二乘法
④ Model predictive control (MPC)
我们考虑将线性时不变动力系统控制到某个参考状态的问题。 为了实现这一点,我们使用约束线性二次 MPC,它在每个时间步长求解以下有限视界最优控制问题 x r ∈ R n x x_r∈R^{n_x} xr∈Rnx

⑤ Portfolio optimization
⑥ Support vector machine (SVM):支持向量机
相关文章:
OSQP文档学习
OSQP官方文档 1 QSQP简介 OSQP求解形式为的凸二次规划: x ∈ R n x∈R^n x∈Rn:优化变量 P ∈ S n P∈S^n_ P∈Sn:半正定矩阵 特征 (1)高效:使用了一种自定义的基于ADMM的一阶方法,只需…...
ONLYOFFICE 8.0:引领数字化办公新纪元
目录 前言 软件安装 软件启动 软件新版本特性 个人评价 总结 前言 在当今快节奏的数字化世界中,高效的办公软件已成为企业竞争力的关键因素。ONLYOFFICE,作为全球领先的办公解决方案提供商,始终致力于通过技术创新来优化用户体验。如今…...
「Linux」基础命令
目录结构 Linux只有1个顶级目录,称为“根目录”路径之间的层级关系,使用/来表示,例如:/usr/local/hello.txt 开头的/表示根目录后面的/表示层级关系 命令入门 命令的通用格式:command [ -options ] [ parameter] c…...
三防平板丨平板终端丨加固平板丨户外勘测应用
随着科技的不断发展,现代勘测业也在不断升级。相较于传统的勘测设备,三防平板在户外勘测中有着广泛的应用。那么,三防平板在户外勘测中究竟有哪些优势呢? 首先,三防平板具备极强的防水、防尘、防摔能力。在野外勘测中&…...
npm ERR! code CERT_HAS_EXPIRED:解决证书过期问题
转载:npm ERR! code CERT_HAS_EXPIRED:解决证书过期问题_npm err! code cert_has_expired npm err! errno cert-CSDN博客 npm config set registry http://registry.cnpmjs.org npm config set registry http://registry.npm.taobao.org...
npm报错之package-lock.json found. 问题和淘宝镜像源过期问题
1、package-lock.json found. 问题的解决 在执行yarn add react-transition-group -S 安装react-transition-group时出现package-lock.json found. Your project contains lock files generated by tools other than Yarn. It is advised not to mix package managers in orde…...
大模型提示学习、Prompting微调知识
为什么需要提示学习? 提示学习是一种在自然语言处理任务中引入人类编写的提示或示例来辅助模型生成更准确和有意义的输出的技术。以下是一些使用提示学习的原因: 解决模糊性:在某些任务中,输入可能存在歧义或模糊性,通…...
vue 导出,下载错误提示、blob与json数据转换
一、成功/失败 - 页面展示 失败 成功 二、成功/失败 - 接口请求/响应展示成功 2. 失败 三、解决 // 导出列表exportReceivedExcel() {if (this.tableCheckedValue) {this.form.ids this.tableCheckedValue.map(v > {return v.id || null})}this.loadingReceivedExcel …...
代码随想录算法训练营|二叉树总结
二叉树的定义: struct TreeNode {int val;TreeNode* left;TreeNode* right;TreeNode():val(0),left(nullptr),right(nullptr){}TreeNode(int val):val(val),left(nullptr),right(nullptr){}TreeNode(int val,TreeNode* left,TreeNode* right):val(val),left(left),…...
rtt的io设备框架面向对象学习-uart设备
目录 1.uart设备基类2.uart设备基类的子类3.初始化/构造流程3.1设备驱动层3.2 设备驱动框架层3.3 设备io管理层 4.总结5.使用 1.uart设备基类 此层处于设备驱动框架层。也是抽象类。 在/ components / drivers / include / drivers 下的serial.h定义了如下uart设备基类 struc…...
PyCharm - Script parameters (脚本参数)
PyCharm - Script parameters [脚本参数] References Run -> Edit Configurations… -> Run/Debug Configurations -> Configuration -> Script parameters 命令行: python display_yolo_log.py ./person_training_log/person_train_log_DIMM40_stdout…...
Security6.2 中的SpEL 表达式应用(权限注解使用)
最近学习若依框架,里面的权限注解涉及到了SpEL表达式 PreAuthorize("ss.hasPermi(system:user:list)"),若依项目中用的是自己写的方法进行权限处理, 也可以只用security 来实现权限逻辑代码,下面写如何用security 实现。…...
软考笔记--信息系统开发方法(下)
信息系统是一个极其复杂的人机交互系统,它不仅包含计算机技术,通信技术和网络规划以及其他的工程技术,而且,它还是一个复杂的管理系统,需要管理理论和方法的支持,因此,与其他工程项目相比&#…...
从 AGP 4.1.2 到 7.5.1——XmlParser、GPathResult、QName 过时
新年首发, 去年的问题,今年解决~ 问题 & 排查 1: Task failed with an exception. ----------- * What went wrong: Execution failed for task :app:processCommonReleaseManifest. > org.xml.sax.SAXParseException; lineNumber: 1; columnNu…...
spring boot 使用AOP实现是否已登录检测
前后端分离的开发中,用户http请求应用服务的接口时, 如果要求检测该用户是否已登录。可以实现的方法有多种, 本示例是通过aop 的方式实现,简单有效。 约定:前端http的post 请求 export async function request(url,data) {const …...
为什么从没有负值的数据中绘制的小提琴图(Violin Plot)会出现负值部分?
🍉 CSDN 叶庭云:https://yetingyun.blog.csdn.net/ 小提琴图(Violin Plot) 是一种用于展示和比较数据分布的可视化工具。它结合了箱形图(Box Plot)和密度图(Kernel Density Plot)的特…...
有哪几种行为会导致服务器被入侵
导致服务器被入侵的行为有很多种,以下是一些常见的行为: 系统漏洞:服务器操作系统或软件存在漏洞,攻击者可以通过利用这些漏洞获取系统权限,从而入侵服务器。 弱口令:服务器的账号密码过于简单或者未及时更…...
Redis RabbitMQ
Redis:轻量级,NoSQL数据库 redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这…...
http 和 https 的区别?
目录 1.http 和 https 的基本概念 2.http 和 https 的区别 3.https 协议的工作原理 4.https 协议的优点 5.https 协议的缺点 1.http 和 https 的基本概念 http: 超文本传输协议,是互联网上应用最为广泛的一种网络协议,是一个客户端和服务器端请求和…...
C++中线程的创建
线程创建 引言为什么要使用线程线程的创建使用函数指针示例运行结果使用类对象示例运行结果使用lambda表达式示例运行结果使用带参数的函数作为线程处理函数示例运行结果使用类成员函数示例运行结果引言 在学习C++的过程中,线程的使用作为一个非常重要的部分,也是在复杂项目…...
微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】
微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来,Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...
R语言AI模型部署方案:精准离线运行详解
R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...
如何在看板中体现优先级变化
在看板中有效体现优先级变化的关键措施包括:采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中,设置任务排序规则尤其重要,因为它让看板视觉上直观地体…...
2.Vue编写一个app
1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...
[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...
三体问题详解
从物理学角度,三体问题之所以不稳定,是因为三个天体在万有引力作用下相互作用,形成一个非线性耦合系统。我们可以从牛顿经典力学出发,列出具体的运动方程,并说明为何这个系统本质上是混沌的,无法得到一般解…...
Java 二维码
Java 二维码 **技术:**谷歌 ZXing 实现 首先添加依赖 <!-- 二维码依赖 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.5.1</version></dependency><de…...
MySQL 部分重点知识篇
一、数据库对象 1. 主键 定义 :主键是用于唯一标识表中每一行记录的字段或字段组合。它具有唯一性和非空性特点。 作用 :确保数据的完整性,便于数据的查询和管理。 示例 :在学生信息表中,学号可以作为主键ÿ…...
消防一体化安全管控平台:构建消防“一张图”和APP统一管理
在城市的某个角落,一场突如其来的火灾打破了平静。熊熊烈火迅速蔓延,滚滚浓烟弥漫开来,周围群众的生命财产安全受到严重威胁。就在这千钧一发之际,消防救援队伍迅速行动,而豪越科技消防一体化安全管控平台构建的消防“…...
2.3 物理层设备
在这个视频中,我们要学习工作在物理层的两种网络设备,分别是中继器和集线器。首先来看中继器。在计算机网络中两个节点之间,需要通过物理传输媒体或者说物理传输介质进行连接。像同轴电缆、双绞线就是典型的传输介质,假设A节点要给…...
