OSQP文档学习

OSQP官方文档

1 QSQP简介

OSQP求解形式为的凸二次规划:
在这里插入图片描述
x ∈ R n x∈R^n xRn:优化变量
P ∈ S + n P∈S^n_+ PS+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 xkRn,zkykRm
( x k , z k , y k ) (x^k,z^k,y^k) (xk,zk,yk)相关的原始残差和对偶残差:
在这里插入图片描述
在这里插入图片描述
#pic
不可行问题
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} xrRnx
在这里插入图片描述

⑤ Portfolio optimization
⑥ Support vector machine (SVM):支持向量机

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/689990.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java当日时间段获取

需求&#xff1a;获取当天日期到当前访问的时间段&#xff0c;如当日是2024-02-19&#xff0c;那么此刻访问&#xff0c;日期期间就是2024-02-19 00:00:00到2024-02-19 16:58:00 代码如下&#xff1a; Date datenew Date();String currentDatedate2Str(date,"yyyy-MM-dd&q…

关于Sora的一些紧迫问题...

OpenAI Sora 概述 OpenAI最新的创新&#xff0c;Sora&#xff0c;在人工智能领域开辟了新的天地。Sora是一个文本到视频的扩散模型&#xff0c;可以将文本描述转化为逼真的视频内容。它解决了一个重大的技术挑战&#xff0c;即在视频中保持主体的一致性&#xff0c;即使它们暂…

Java 线程池的基本操作

Java 线程池的基本操作 package com.zhong.thread.threadpool;import java.util.concurrent.*;/*** ClassName : ThreadPool* Description : 线程池的基本操作* Author : zhx* Date: 2024-02-19 18:03*/ public class ThreadPool {public static void main(String[] args) {// …

C语言每日一题(59)左叶子之和

题目链接 力扣网404 左叶子之和 题目描述 给定二叉树的根节点 root &#xff0c;返回所有左叶子之和。 示例 1&#xff1a; 输入: root [3,9,20,null,null,15,7] 输出: 24 解释: 在这个二叉树中&#xff0c;有两个左叶子&#xff0c;分别是 9 和 15&#xff0c;所以返回 2…

基于SpringBoot的高校竞赛管理系统

基于SpringBoot的高校竞赛管理系统的设计与实现~ 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringBootMyBatis工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 主页 个人中心 管理员界面 老师界面 摘要 高校竞赛管理系统是为了有效管理学校…

低代码开发与网络信息安全:构建高效防护体系

随着数字化转型的加速&#xff0c;越来越多的企业开始关注低代码开发平台&#xff0c;以提高软件开发效率&#xff0c;缩短上市时间。然而&#xff0c;随之而来的网络信息安全问题也日益严峻。如何在享受低代码开发带来的便捷与高效的同时&#xff0c;确保网络信息安全成为企业…

K8s进阶之路-命名空间级-服务发现 :

服务发现&#xff1a; Service&#xff08;东西流量&#xff09;&#xff1a;集群内网络通信、负载均衡&#xff08;四层负载&#xff09;内部跨节点&#xff0c;节点与节点之间的通信&#xff0c;以及pod与pod之间的通信&#xff0c;用Service暴露端口即可实现 Ingress&#…

Vscode python pyside6 制作视频播放器

一、界面如下 包含控件 qcombox、qtablewidget、qpushbotton、qverticalslider 二、运行代码 media_player.py import sysfrom PySide6 import QtWidgets from PySide6.QtWidgets import * from PySide6.QtMultimedia import * from PySide6.QtMultimediaWidgets import QVi…

林浩然与杨凌芸的Java List大冒险

林浩然与杨凌芸的Java List大冒险 Lin Haoran and Yang Lingyun’s Java List Adventure 在一个阳光明媚的日子&#xff0c;程序员界的“侠客”林浩然和他那聪明伶俐的同事兼好友杨凌芸正在Java王国里进行一场别开生面的大冒险。这次他们的目标是征服两个强大的List家族成员——…

c++面试

c基础 面试题 1&#xff1a;变量的声明和定义有什么区别 1.定义:为变量分配地址和存储空间&#xff0c;声明:不分配地址。 2.一个变量可以在多个地方声明&#xff0c;但是只在一个地方定义。 3.加入 extern 修饰的是变量的声明&#xff0c;说明此变量将在文件以外或在文件后…

备战蓝桥杯 Day4

目录 注意&#xff1a;递推开long long 1140&#xff1a;验证子串 1131&#xff1a;基因相关性 1176&#xff1a;谁考了第k名 1177&#xff1a;奇数单增序列 1180&#xff1a;分数线划定 1184&#xff1a;明明的随机数 1185&#xff1a;单词排序 1186&#xff1a;出现…

图论之dfs与bfs的练习

dfs--深度优选搜索 bfs--广度优先搜索 迷宫问题--dfs 问题&#xff1a; 给定一个n*m的二维迷宫数组其中S是起点&#xff0c;T是终点&#xff0c;*是墙壁&#xff08;无法通过&#xff09;&#xff0c; .是道路 问从起点S出发沿着上下左右四个方向走&#xff0c;能否走到T点&a…

视频监控需求八问:视频智能分析/视频汇聚平台EasyCVR有何特性?

最近TSINGSEE青犀视频在与业内伙伴进行项目合作的过程中&#xff0c;针对安防监控可视化视频管理系统EasyCVR视频融合平台在电信运营商项目中的应用&#xff0c;进行了多方面的项目需求沟通。今天我们就该项目沟通为案例&#xff0c;来具体了解一下用户关心度较高的关于视频智能…

4.函数模板的局限性

函数模板的通用性并不是万能的&#xff0c;我们自己人为定义的新的数据类型&#xff0c;模板不一定总能进行正确的识别与操作。 为了解决这个问题&#xff0c;我们可以利用具体化的模板&#xff0c;解决自定义类型的通用化。 #include<iostream> using namespace std;…

MySql报错:Statement violates GTID consistency: CREATE TABLE ... SELECT.解决

一 解决Statement violates GTID consistency: CREATE TABLE ... SELECT 问题&#xff1a; mysql在备份表时报错Statement violates GTID consistency: CREATE TABLE ... SELECT. CREATE TABLE tmp_fix0219 AS SELECT trade_no,ctime FROM charge_data_log 执行后&#xf…

【Linux】单机可建立的最大TCP连接数

【Linux】单机可建立的最大TCP连接数 背景介绍环境客户端服务端总结 背景 本文内容大多基于网上其他参考文章及资料整理后所得&#xff0c;并非原创&#xff0c;目的是为了需要时方便查看。 介绍 本文介绍Linux单机作为客户端或服务端时可建立的最大TCP连接数。 环境 分类…

LeetCode2560. House Robber IV——二分答案+动态规划

文章目录 一、题目二、题解 一、题目 There are several consecutive houses along a street, each of which has some money inside. There is also a robber, who wants to steal money from the homes, but he refuses to steal from adjacent homes. The capability of t…

CSS background-size

background-size 菜鸟教程 CSS3 background-size 属性 MDN Web 开发技术>CSS&#xff1a;层叠样式表>background-size CSS的background 背景图片自动适应元素大小,实现img的默认效果 background-size:100% 100%&#xff1b; 在CSS中&#xff0c;background-size属性用…

C++ 基础算法 快速排序

之前写过这道题的分享&#xff0c;但是比较粗糙&#xff0c;因此这里想系统记录一遍。 给定你一个长度为 n 的整数数列。 请你使用快速排序对这个数列按照从小到大进行排序。 并将排好序的数列按顺序输出。 输入格式 输入共两行&#xff0c;第一行包含整数 n 。 第二行包含…

SNMP——简单网络管理协议

Q 什么SNMP? A:SNMP是广泛应用于TCP/IP网络的网络管理标准协议&#xff0c;该协议能够支持网络管理系统&#xff0c;用以监测连接到网络上的设备是否有任何引起管理上关注的情况。SNMP采用轮询机制&#xff0c;提供最基本的功能集&#xff0c;适合小型、快速、低价格的环境使…