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 problem
        NB: 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.mfbz.cn/a/400178.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Flink精讲】Flink内核源码分析:命令执行入口

官方推荐per-job模式&#xff0c;一个job一个集群&#xff0c;提交时yarn才分配集群资源&#xff1b; 主要的进程&#xff1a;JobManager、TaskManager、Client 提交命令&#xff1a;bin/flink run -t yarn-per-job /opt/module/flink-1.12.0/examples/streaming/SocketWind…

什么是CODESYS开发系统

CODESYS是一种用于工业自动化领域的开发系统软件&#xff0c;提供了一个完整集成的开发环境。该软件由德国CODESYS GmbH&#xff08;原 3S-Smart Software Solutions GmbH&#xff09;公司开发&#xff0c;其最新版本为CODESYS V3。 CODESYS开发系统具有多种特性和优点。首先&a…

Linux内核解读

来自鹅厂架构师 作者&#xff1a;aurelianliu 工作过程中遇到的调度、内存、文件、网络等可以参考。 1.os运行态 X86架构&#xff0c;用户态运行在ring3&#xff0c;内核态运行在ring0&#xff0c;两个特权等级。 &#xff08;1&#xff09;内核、一些特权指令&#xff0c;例…

JS实现根据数组对象的某一属性排序

JS实现根据数组对象的某一属性排序 一、冒泡排序&#xff08;先了解冒泡排序机制&#xff09;二、根据数组对象的某一属性排序&#xff08;引用sort方法排序&#xff09; 一、冒泡排序&#xff08;先了解冒泡排序机制&#xff09; 以从小到大排序为例&#xff0c;冒泡排序的原…

typescript映射类型

ts映射类型简介 TypeScript中的映射类型&#xff08;Mapped Type&#xff09;是一种高级类型&#xff0c;它允许我们基于现有类型创建新的类型&#xff0c;同时对新类型的每个属性应用一个转换函数。通过使用映射类型&#xff0c;我们可以方便地对对象的属性进行批量操作&…

人工智能深度学习

目录 人工智能 深度学习 机器学习 神经网络 机器学习的范围 模式识别 数据挖掘 统计学习 计算机视觉 语音识别 自然语言处理 机器学习的方法 回归算法 神经网络 SVM&#xff08;支持向量机&#xff09; 聚类算法 降维算法 推荐算法 其他 机器学习的分类 机器…

文献速递:GAN医学影像合成--用生成对抗网络生成 3D TOF-MRA 体积和分割标签

文献速递&#xff1a;GAN医学影像合成–用生成对抗网络生成 3D TOF-MRA 体积和分割标签 01 文献速递介绍 深度学习算法在自然图像分析中的成功近年来已被应用于医学成像领域。深度学习方法已被用于自动化各种耗时的手动任务&#xff0c;如医学图像的分割和分类&#xff08;G…

软件测试面试,大厂上岸究竟有什么秘诀?

最后&#xff0c;总结一下个人认为比较重要的知识点&#xff1a;接口自动化测试 &#xff1a;测试框架&#xff0c;多个有关联的接口的用例编写&#xff0c;用例的组织及存储&#xff0c;接口测试的覆盖率&#xff0c;RESTAssured 的封装等。UI 自动化测试 &#xff1a;iOS 和 …

【2024美赛】C题 Momentum in Tennis网球运动中的势头 25页中英文论文及Python代码

【2024美赛】C题 Momentum in Tennis网球运动中的势头 25页中文论文 1 题目 A题&#xff1a;2024MCM问题C&#xff1a;网球运动中的势头 在2023年温布尔登网球公开赛男子组决赛中&#xff0c;20岁的西班牙新星卡洛斯-阿尔卡拉斯击败了36岁的诺瓦克-德约科维奇。这是德约科维奇…

Hypervisor是什么

Hypervisor 通常指的是虚拟机监视器&#xff08;VirtualMachine Monitor&#xff09;&#xff0c;它是一种软件或硬件&#xff0c;可以在物理服务器上创建和管理多个虚拟机&#xff08;VirtualMachine&#xff09;。 Hypervisor 提供了一个抽象层&#xff0c;将物理服务器的资源…

Nginx 配置详解

官网&#xff1a;http://www.nginx.org/ 序言 Nginx是lgor Sysoev为俄罗斯访问量第二的rambler.ru站点设计开发的。从2004年发布至今&#xff0c;凭借开源的力量&#xff0c;已经接近成熟与完善。 Nginx功能丰富&#xff0c;可作为HTTP服务器&#xff0c;也可作为反向代理服务…

Git基础(22):创建私人令牌和下拉代码

如何创建令牌和拉取项目代码 创建一个令牌&#xff0c;这里以gitee为例&#xff0c;注意将生成的令牌复制保存下拉 打开git bash 窗口&#xff0c;使用命令拉取项目 git clone https://oauth2:你的令牌项目地址(不要带https) #示例 git clone https://oauth2:845579xxxxxxxxx…

A Survey for Foundation Models in Autonomous Driving

摘要 **基础模型&#xff08;foundation models&#xff09;**的出现彻底改变了自然语言处理和计算机视觉领域&#xff0c;为它们在自动驾驶&#xff08;AD&#xff09;中的应用铺平了道路。本调查对40多篇研究论文进行了全面回顾&#xff0c;展示了基础模型在增强AD中的作用。…

error Error: certificate has expired

解决方案&#xff1a; yarn config set "strict-ssl" false -g 我开发的chatgpt网站&#xff1a; https://chat.xutongbao.top

数据结构与算法:队列

在上篇文章讲解了栈之后&#xff0c;本篇也对这一章进行收尾&#xff0c;来到队列&#xff01; 队列 队列的介绍队列的存储结构队列顺序存储的不足之处 循环队列的定义队列的链式存储结构链队列的构建链队列的初始化队尾入队队头出队获取队头队尾元素判断队列是否为空获取队列元…

【北京游戏业:出海竞争实力全面】

本文将深入分析北京的游戏行业发展。在上海、广州、北京、深圳、成都、杭州、福建七大游戏产业中心城市中&#xff0c;北京无疑是出海竞争力最强的游戏产业集群。本文将全面剖析北京游戏行业的发展现状。 北京是中国游戏产业的发源地。拥有从游戏引擎到美术设计等完整的产业链…

奇异递归模板模式应用5-静态多态

动态多态&#xff1a;C动态多态是利用虚函数特性实现的&#xff0c;即基类指针(引用&#xff09;指向派生类指针(引用)。由于虚函数的实现是在运行期进行的&#xff0c;因而会产生运行期开销&#xff08;虚表指针偏移&#xff0c;与分支预测器和CPU指令流水线相关&#xff09;。…

【C++】类和对象---const成员,取地址及const取地址操作符重载,static成员

目录 ⭐const成员 ⭐取地址及const取地址操作符重载 ⭐static成员 ⭐概念 ⭐特性 ⭐const成员 将const修饰的“成员函数”称之为const成员函数&#xff0c;const修饰类成员函数&#xff0c;实际修饰该成员函数隐含的this指针&#xff0c;表明在该成员函数中不能对类的任何…

怎样使用Pyglet库给推箱子游戏画关卡地图

目录 pyglet库 画图事件 按键事件 程序扩展 关卡地图 pyglet库 是一个跨平台的Python多媒体库&#xff0c;提供了一个简单易用的接口来创建窗口、加载图像和视频、播放音频、处理用户输入事件以及进行2D图形绘制。特别适合用于游戏开发、视听应用以及其它需要高效图形渲染…

笔记:torch.roll

最近在准备写 swin transformer 的文章&#xff0c;记录下 torch.roll 的用法&#xff1a; >>> x torch.tensor([1, 2, 3, 4, 5, 6, 7, 8]).view(4, 2) >>> x tensor([[1, 2],[3, 4],[5, 6],[7, 8]]) 第0维度向下移1位&#xff0c;多出的[7,8]补充到顶部 &g…
最新文章