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

使用osqp求解简单二次规划问题

文章目录

  • 一、问题描述
  • 二、数学推导
    • 1. 目标函数处理
    • 2. 约束条件处理
  • 三、代码编写

一、问题描述

已知:
m i n ( x 1 − 1 ) 2 + ( x 2 − 2 ) 2 s . t . 0 ⩽ x 1 ⩽ 1.5 , 1 ⩽ x 2 ⩽ 2.5 min(x_1-1)^2+(x_2-2)^2 \qquad s.t. \ \ 0 \leqslant x_1 \leqslant 1.5,\ \ 1 \leqslant x_2 \leqslant 2.5 min(x11)2+(x22)2s.t.  0x11.5,  1x22.5
目标函数为二元二次函数,可行域为线性、凸集,此为二次规划问题,可将其转换成二次规划表达式再进行求解。相关数学概念参考另一篇: 最优化问题基础理论概述。

二、数学推导

1. 目标函数处理

f ( x 1 , x 2 ) = ( x 1 − 1 ) 2 + ( x 2 − 2 ) 2 = x 1 2 + x 2 2 − 2 x 1 − 4 x 2 + C f(x_1, x_2)=(x_1-1)^2+(x_2-2)^2 =x_1^2+x_2^2-2x_1-4x_2+C f(x1,x2)=(x11)2+(x22)2=x12+x222x14x2+C

其中,常数项用 C C C表示;

令, X = [ x 1 x 2 ] X=\left[ \begin{matrix} x_1 \\ x_2 \end{matrix} \right] X=[x1x2],则
f ( x 1 , x 2 ) = [ x 1 , x 2 ] [ x 1 , x 2 ] T + [ − 2 , − 4 ] [ x 1 , x 2 ] T = X T X + [ − 2 , − 4 ] X = 1 2 X T [ 2 0 0 2 ] X + [ − 2 − 4 ] T X = 1 2 X T P X + Q T X \begin{aligned} f(x_1, x_2) &= [x_1, x_2][x_1, x_2]^T+[-2, -4][x_1, x_2]^T \\[2ex] &= X^TX+[-2, -4]X \\[2ex] &=\frac{1}{2} X^T \left[\begin{matrix} 2 &0 \\ 0&2 \end{matrix} \right] X+\left[\begin{matrix} -2 \\ -4 \end{matrix} \right]^TX \\[2ex] &= \frac{1}{2} X^TPX+Q^TX \end{aligned} f(x1,x2)=[x1,x2][x1,x2]T+[2,4][x1,x2]T=XTX+[2,4]X=21XT[2002]X+[24]TX=21XTPX+QTX

其中, P = [ 2 0 0 2 ] ,  Q = [ − 2 − 4 ] P=\left[\begin{matrix} 2 &0 \\ 0&2 \end{matrix} \right],\ Q=\left[\begin{matrix} -2 \\ -4 \end{matrix} \right] P=[2002] Q=[24]

关于为什么要写成 1 2 X T P X \frac{1}{2} X^TPX 21XTPX 形式,因为此时 P P P 为目标函数的海塞矩阵,具体参看 此链接。

2. 约束条件处理

{ 0 ⩽ x 1 ⩽ 1.5 1 ⩽ x 2 ⩽ 2.5 ⟺ [ 0 1 ] ⩽ [ x 1 x 2 ] ⩽ [ 1.5 2.5 ] ⟺ [ 0 1 ] ⩽ [ 1 0 0 1 ] X ⩽ [ 1.5 2.5 ] \begin{aligned} \left\{ \begin{array}{} 0 \leqslant x_1 \leqslant 1.5 \\ 1 \leqslant x_2 \leqslant 2.5 \\ \end{array} \right . \quad \Longleftrightarrow \quad \left[\begin{matrix}0 \\1\end{matrix} \right] \leqslant \left[\begin{matrix}x_1 \\x_2\end{matrix} \right] \leqslant \left[\begin{matrix}1.5 \\2.5\end{matrix} \right] \quad \Longleftrightarrow \quad \left[\begin{matrix}0 \\1\end{matrix} \right] \leqslant \left[\begin{matrix}1&0 \\0&1\end{matrix} \right]X \leqslant \left[\begin{matrix}1.5 \\2.5\end{matrix} \right] \end{aligned} {0x11.51x22.5[01][x1x2][1.52.5][01][1001]X[1.52.5]
L B = [ 0 1 ] , A = [ 1 0 0 1 ] , U B = [ 1.5 2.5 ] L_B=\left[\begin{matrix}0 \\1\end{matrix} \right],\ A=\left[\begin{matrix}1&0 \\0&1\end{matrix} \right],\ U_B=\left[\begin{matrix}1.5 \\2.5\end{matrix} \right] LB=[01], A=[1001], UB=[1.52.5] ,整理得约束条件如下:
L B ⩽ A X ⩽ U B L_B \leqslant AX \leqslant U_B LBAXUB

三、代码编写

  由步骤 二、数学推导 得到5个矩阵:

  • P P P : 二次型矩阵(实对称矩阵);
  • Q Q Q : 一次项矩阵;
  • U B U_B UB : 上边界矩阵;
  • L B L_B LB : 下边界矩阵;
  • A A A : 边界系数矩阵;

  现在根据这5个矩阵进行代码编写,是使用osqp进行二次型规划问题构建及求解。

代码如下:

Eigen::SparseMatrix<double> P(2, 2); // P, 二次型矩阵
Eigen::VectorXd Q(2);                // Q, 一次项向量
Eigen::SparseMatrix<double> A(2, 2); // 单位阵
Eigen::VectorXd lowerBound(2);       // 下边界向量
Eigen::VectorXd upperBound(2);       // 上边界向量P.insert(0, 0) = 2.0;
P.insert(1, 1) = 2.0;
std::cout << "\033[34m" << "P:" << std::endl<< P << "\033[0m" << std::endl;A.insert(0, 0) = 1.0;
A.insert(1, 1) = 1.0;
std::cout << "\033[34m" << "A:" << std::endl<< A << "\033[0m" << std::endl;Q << -2, -4;
std::cout << "\033[34m" << "Q:" << std::endl<< Q << "\033[0m" << std::endl;lowerBound << 0.0, 1.0;
upperBound << 1.5, 2.5;// Step 1: 创建求解器
OsqpEigen::Solver solver;
// Step 2: 设置(提升求解速度)
solver.settings()->setVerbosity(false);
solver.settings()->setWarmStart(true);// Step 3: 初始化(7部分)
solver.data()->setNumberOfVariables(2);   // 变量数
solver.data()->setNumberOfConstraints(2); // 约束数
if (!solver.data()->setHessianMatrix(P))  // 海塞矩阵
{return;
}
if (!solver.data()->setGradient(Q)) // Q矩阵
{return;
}
if (!solver.data()->setLinearConstraintsMatrix(A)) // 线性约束矩阵A
{return;
}
if (!solver.data()->setLowerBound(lowerBound)) // 下边界矩阵
{return;
}
if (!solver.data()->setUpperBound(upperBound)) // 上边界矩阵
{return;
}if (!solver.initSolver())
{return;
}// Step 4:求解
Eigen::VectorXd QPSolution;
if (solver.solveProblem() != OsqpEigen::ErrorExitFlag::NoError)
{return;
}
QPSolution = solver.getSolution();
std::cout << "\033[1;32m" << "QPSolution:" << std::endl<< QPSolution << "\033[0m" << std::endl;

运行结果如下:
在这里插入图片描述
可见,当 x 1 = 1 , x 2 = 2 x_1=1,\ x_2=2 x1=1, x2=2 时目标函数取得最小。

相关文章:

使用osqp求解简单二次规划问题

文章目录 一、问题描述二、数学推导1. 目标函数处理2. 约束条件处理 三、代码编写 一、问题描述 已知&#xff1a; m i n ( x 1 − 1 ) 2 ( x 2 − 2 ) 2 s . t . 0 ⩽ x 1 ⩽ 1.5 , 1 ⩽ x 2 ⩽ 2.5 min(x_1-1)^2(x_2-2)^2 \qquad s.t. \ \ 0 \leqslant x_1 \leqslant 1.5,…...

Ubuntu创建修改 Swap 文件分区的步骤——解决嵌入式开发板编译ROS2程序卡死问题

Ubuntu创建修改 Swap 文件分区的步骤——解决嵌入式开发板编译ROS2程序卡死问题 1. 问题描述2. 创建 / 修改 Swap 分区2.1 创建 Swap 文件 (推荐)2.2 使用 Swap 分区 (如果已经存在) 3. 注意事项 同步发布在个人笔记Ubuntu创建修改 Swap 文件分区的步骤——解决嵌入式开发板编译…...

【C语言】通用统计数据结构及其更新函数(最值、变化量、总和、平均数、方差等)

【C语言】通用统计数据结构及其更新函数&#xff08;最值、变化量、总和、平均数、方差等&#xff09; 更新以gitee为准&#xff1a; gitee 文章目录 通用统计数据结构更新函数附录&#xff1a;压缩字符串、大小端格式转换压缩字符串浮点数压缩Packed-ASCII字符串 大小端转换什…...

Spring AI(10)——STUDIO传输的MCP服务端

Spring AI MCP&#xff08;模型上下文协议&#xff09;服务器Starters提供了在 Spring Boot 应用程序中设置 MCP 服务器的自动配置。它支持将 MCP 服务器功能与 Spring Boot 的自动配置系统无缝集成。 本文主要演示支持STDIO传输的MCP服务器 仅支持STDIO传输的MCP服务器 导入j…...

Sklearn 机器学习 缺失值处理 填充数据列的缺失值

💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 💡使用 Scikit-learn 处理数据缺失值的完整指南 在机器学习项目中,数据缺失是不可避…...

猜字符位置游戏-position gasses

import java.util.*;public class Main {/*字符猜位置游戏;每次提交只能被告知答对几个位置;根据提示答对的位置数推测出每个字符对应的正确位置;*/public static void main(String[] args) {char startChar A;int gameLength 8;List<String> ballList new ArrayList&…...

宝塔安装配置FRP

FRP&#xff08;Fast Reverse Proxy&#xff09;作为一款高性能的反向代理应用&#xff0c;能够帮助我们轻松实现内网穿透&#xff0c;将内网服务暴露到公网&#xff0c;满足远程访问、开发调试等多种需求。宝塔面板以其简洁易用的界面和强大的功能&#xff0c;成为众多站长和开…...

元器件基础学习笔记——结型场效应晶体管 (JFET)

场效应晶体管&#xff08;Field Effect Transistor&#xff0c;FET&#xff09;简称场效应管&#xff0c;是一种三端子半导体器件&#xff0c;它根据施加到其其中一个端子的电场来控制电流的流动。与双极结型晶体管 &#xff08;BJT&#xff09; 不同&#xff0c;场效应晶体管 …...

tableau 实战工作场景常用函数与LOD表达式的应用详解

这是tableau实战工作场景图表制作第七期--常用函数与LOD表达式的应用 数据资源已经与这篇博客捆绑&#xff0c;有需要者可以下载通过网盘分享的文件&#xff1a;3.2-8月成交数据.xlsx等3个文件 链接: https://pan.baidu.com/s/17WtUoZTqzoNo5kTFjua4hw?pwd0623 提取码: 06…...

智能终端与边缘计算按章复习

第1章&#xff1a;智能终端与边缘计算概述 简述计算机网络和Web技术发展过程中&#xff0c;信息和运算从用户本地向Web服务器迁移的趋势&#xff0c;并解释这一过程如何逐步形成了如今的云计算形态。 随着计算机网络和Web技术的不断发展&#xff0c;信息和运算的重心发生了显著…...

C#面试问题61-80

66. What is reflection? 反射是一种机制&#xff0c;它使我们能够编写可以检查应用程序中所 用类型的代码。例如&#xff0c;调用名称与给定字符串相等的方法&#xff0c;或者列出属于给定 对象的所有字段及其值。 在 Convert 方法中&#xff0c;我们根本不知道处理的是什么…...

分布式Session处理的五大主流方案解析

在分布式环境下&#xff0c;Session 处理的核心挑战是确保用户请求在不同服务器间流转时能保持会话状态一致。以下是主流解决方案及优缺点分析&#xff1a; &#x1f510; 一、集中存储方案&#xff08;主流推荐&#xff09; Redis/Memcached 存储 原理&#xff1a;将 Session…...

C++ 中的 const 知识点详解,c++和c语言区别

目录 一。C 中的 const 知识点详解1. 基本用法1.1&#xff09; 定义常量1.2&#xff09; 指针与 const 2. 函数中的 const2.1&#xff09;const 参数2.2&#xff09;const 成员函数 3. 类中的 const3.1&#xff09;const 成员变量3.2&#xff09;const 对象 4. const 返回值5. …...

《PyTorch:开启深度学习新世界的魔法之门》

一、遇见 PyTorch:深度学习框架新星登场 在当今的技术领域中,深度学习已然成为推动人工智能发展的核心动力,而深度学习框架则是这场技术革命中的关键工具。在众多深度学习框架里,PyTorch 以其独特的魅力和强大的功能,迅速崛起并占据了重要的地位,吸引着无数开发者和研究者…...

分布式光纤传感(DAS)技术应用解析:从原理到落地场景

近年来&#xff0c;分布式光纤传感&#xff08;Distributed Acoustic Sensing&#xff0c;DAS&#xff09;技术正悄然改变着众多传统行业的感知方式。它将普通的通信光缆转化为一个长距离、连续分布的“听觉传感器”&#xff0c;对振动、声音等信号实现高精度、高灵敏度的监测。…...

Spring事务回滚在系统中的应用

以文章发布为例&#xff0c;介绍Spring事务回滚在系统中的应用 事务回滚的核心概念 事务回滚是数据库管理系统中的关键机制&#xff0c;它确保数据库操作要么全部成功&#xff0c;要么全部失败。在Spring框架中&#xff0c;我们可以通过Transactional注解轻松实现事务管理。 …...

.Net Framework 4/C# 属性和方法

一、属性的概述 属性是对实体特征的抽象&#xff0c;用于提供对类或对象的访问&#xff0c;C# 中的属性具有访问器&#xff0c;这些访问器指定在它们的值被读取或写入时需要执行的语句&#xff0c;因此属性提供了一种机制&#xff0c;用于把读取和写入对象的某些特征与一些操作…...

ASP.NET Core使用Quartz部署到IIS资源自动被回收解决方案

iis自动回收的原因 回收机制默认配置&#xff0c;间隔时间是1740分钟&#xff0c;意思是&#xff1a;默认情况下每1740分钟(29小时)回收一次&#xff0c;定期检查应用程序池中的工作进程&#xff0c;并终止那些已经存在很长时间或已经使用了太多资源的工作进程 进程模型默认配…...

Fullstack 面试复习笔记:Spring / Spring Boot / Spring Data / Security 整理

Fullstack 面试复习笔记&#xff1a;Spring / Spring Boot / Spring Data / Security 整理 之前的笔记&#xff1a; Fullstack 面试复习笔记&#xff1a;操作系统 / 网络 / HTTP / 设计模式梳理Fullstack 面试复习笔记&#xff1a;Java 基础语法 / 核心特性体系化总结Fullsta…...

调用.net DLL让CANoe自动识别串口号

1.前言 CANoe9.0用CAPL控制数控电源_canoe读取程控电源电流值-CSDN博客 之前做CAPL通过串口控制数控电源&#xff0c;存在一个缺点&#xff1a;更换电脑需要改串口号 CSDN上有类似的博客&#xff0c;不过要收费&#xff0c;本文根据VID和PID来自动获取串口号&#xff0c;代码…...

第5章:Cypher查询语言进阶

在掌握了Cypher的基础知识后&#xff0c;本章将深入探讨更高级的查询技术。这些进阶技能将帮助您构建更复杂、更高效的查询&#xff0c;解决实际业务中的复杂问题&#xff0c;并充分发挥Neo4j的图数据处理能力。 5.1 复杂查询构建 随着业务需求的复杂性增加&#xff0c;查询也…...

【Python进阶】元类编程

目录 &#x1f31f; 前言&#x1f3d7;️ 技术背景与价值&#x1fa79; 当前技术痛点&#x1f6e0;️ 解决方案概述&#x1f465; 目标读者说明 &#x1f9e0; 一、技术原理剖析&#x1f4ca; 核心概念图解&#x1f4a1; 核心作用讲解&#x1f527; 关键技术模块说明⚖️ 技术选…...

算法(蓝桥杯学习C/C++版)

up: 溶金落梧桐 溶金落梧桐的个人空间-溶金落梧桐个人主页-哔哩哔哩视频 蓝桥杯三十天冲刺系列 BV18eQkY3EtP 网站&#xff1a; OI Wiki OI Wiki - OI Wiki 注意 比赛时&#xff0c;devc勾选c11&#xff08;必看&#xff09; 必须勾选c11一共有两个方法&#xff0c;任用…...

Docker镜像无法拉取问题解决办法

最近再学习RabbitMQ&#xff0c;需要从Docker镜像中拉取rabbitMQ&#xff0c;但是下拉失败 总的来说就是无法和docker镜像远程仓库建立连接 我又去尝试ping docker.io发现根本没有反应&#xff0c;还是无法连接找了许多办法还是没有办法解决&#xff0c;最后才发现是镜像问题&a…...

ZephyrOS 嵌入式开发Black Pill V1.2之Debug调试器

版本和环境信息如下&#xff1a; PC平台&#xff1a; Windows 11 专业版 Zephyr开发环境&#xff1a;v4.1.0 Windows 下搭建 Zephyr 开发环境 WeAct BlackPill V1.2开发板&#xff1a; WeAct STM32F411CEU6 BlackPill 核心板 Debug调试器&#xff1a; ST-LINK V2: ST-LINK V2 S…...

# 主流大语言模型安全性测试(二):英文越狱提示词下的表现与分析

主流大语言模型安全性测试&#xff08;二&#xff09;&#xff1a;英文越狱提示词下的表现与分析 在上一篇文章中&#xff0c;我们对多个主流大语言模型&#xff08;LLM&#xff09;进行了中文诱导性提示词的越狱测试&#xff0c;评估其是否能够在面对非法、有害或危险内容请求…...

SAP 在 AI 与数据统一平台上的战略转向

在 2025 年 SAP Sapphire 大会上&#xff0c;SAP 展示了其最新的产品战略和技术整合方向&#xff0c;与以往不同的是&#xff0c;今年的讨论更加务实、聚焦客户实际需求。SAP 强调&#xff0c;ERP 的转型不再是“一刀切”或破坏性的&#xff0c;而是可以根据客户现状&#xff0…...

服务器磁盘空间被Docker容器日志占满处理方法

事发场景&#xff1a; 原本正常的服务停止运行了&#xff0c;查看时MQTT服务链接失败&#xff0c;查看对应的容器服务发现是EMQX镜像停止运行了&#xff0c;重启也是也报错无法正常运行&#xff0c;报错如下图&#xff1a; 报错日志中连续出现两个"no space left on devi…...

c++学习-this指针

1.基本概念 非静态成员函数都会默认传递this指针&#xff08;静态成员函数属于类本身&#xff0c;不属于某个实例对象&#xff09;&#xff0c;方便访问对象对类成员变量和 成员函数。 2.基本使用 编译器实际处理类成员函数&#xff0c;this是第一个隐藏的参数&#xff0c;类…...

交易所系统攻坚:高并发撮合引擎与合规化金融架构设计

交易所系统攻坚&#xff1a;高并发撮合引擎与合规化金融架构设计 ——2025年数字资产交易平台的性能与合规双轮驱动 一、高并发撮合引擎&#xff1a;从微秒级延迟到百万TPS 核心架构设计 订单簿优化&#xff1a;数据结构创新&#xff1a;基于红黑树与链表混合存储&#xff0c…...