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++的过程中,线程的使用作为一个非常重要的部分,也是在复杂项目…...

基于JavaWeb开发的家政服务平台计算机毕业设计[附源码]
基于JavaWeb开发的家政服务平台计算机毕业设计[附源码] 🍅 作者主页 央顺技术团队 🍅 欢迎点赞 👍 收藏 ⭐留言 📝 🍅 文末获取源码联系方式 📝 🍅 查看下方微信号获取联系方式 承接各种定制系统…...

性能调优:容易忽视的JavaScript标签属性及其性能影响
在性能优化中,我们都知道,async属性可以让script标签变得不阻塞HTML解析,defer属性也有类似的功能,但实际defer是会阻塞script解析的(用defer的话,多个script会按顺序执行,而async执行是无序的&…...

【机器学习笔记】7 KNN算法
距离度量 欧氏距离(Euclidean distance) 欧几里得度量(Euclidean Metric)(也称欧氏距离)是一个通常采用的距离定义,指在𝑚维空间中两个点之间的真实距离,或者向量的自然长度(即该点…...

mysql 2-20
TEXT类型 枚举类型 SET类型 二进制字符串类型 BLOB类型 注意事项 JSON类型 提取数据 空间类型 选择建议 约束...

Unity3D Shader 素描风格渲染管线实现详解
前言 在游戏开发中,渲染效果是非常重要的一部分,它可以直接影响游戏的视觉效果和玩家的体验。而素描风格的渲染效果是一种非常独特和有趣的风格,可以为游戏增添一种艺术氛围。在Unity3D中,可以通过编写Shader来实现素描风格的渲染…...

WordPress站点如何实现发布文章即主动推送到百度快速收录和普通收录?
我们在WordPress后台成功发布文章之后,如果靠搜索引擎来抓取的话,可能会比较慢,所以十分有必要将我们成功发布的文章马上提交到百度、必应等搜索引擎中。下面boke112百科就跟大家说一说WordPress站点如何实现发布文章即主动推送到百度快速收录…...

C++11---(3)
目录 一、可变参数模板 1.1、可变参数模板的概念 1.2、可变参数模板的定义方式 1.3、如何获取可变参数 二、lambda表达式 2.1、Lamabda表达式定义 2.2、为什么有Lambda 2.3、Lambda表达式的用法 2.4、函数对象与lambda表达式 三、包装器 3.1、function 3.2、bind …...

【常识】大数据设计基础知识
底层存储:hadoop(hdfsmapreduce) Hadoop已经有十几年的历史,它是大数据领域的存储基石,HDFS目前仍然没有成熟替代品;MapR 文件系统在业内已经具有一定知名度了,不仅 MapR 宣布它自己的文件系统比 HDFS 快2-…...

Vue:Vuex模块化编码(非常实用)
一、情景说明 通过前面的学习,我们知道,Vuex的核心文件就是indexc.js 这个文件里面,主要是四个对象 actions、mutations、state、getters 那么,随着业务的复杂化,所有的逻辑都写在一个actions里面吗? 显然…...

springboot 异步执行方法详细介绍
在Spring Boot中,异步执行方法是一种提高应用程序性能和响应性的技术。通过异步执行,你可以在处理耗时的业务逻辑时,不需要阻塞当前线程,从而提高应用程序的吞吐量和并发处理能力。 基本概念 在Spring中ÿ…...