使用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(x1??1)2+(x2??2)2s.t.??0?x1??1.5,??1?x2??2.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?)=(x1??1)2+(x2??2)2=x12?+x22??2x1??4x2?+C

其中,常數項用 C C C表示;

令, X = [ x 1 x 2 ] X=\left[ \begin{matrix} x_1 \\ x_2 \end{matrix} \right] X=[x1?x2??],則
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=21?XT[20?02?]X+[?2?4?]TX=21?XTPX+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=[20?02?]?Q=[?2?4?]
?
關于為什么要寫成 1 2 X T P X \frac{1}{2} X^TPX 21?XTPX 形式,因為此時 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} {0?x1??1.51?x2??2.5??[01?]?[x1?x2??]?[1.52.5?]?[01?]?[10?01?]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=[10?01?],?UB?=[1.52.5?] ,整理得約束條件如下:
L B ? A X ? U B L_B \leqslant AX \leqslant U_B LB??AX?UB?

三、代碼編寫

??由步驟 二、數學推導 得到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 時目標函數取得最小。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/84159.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/84159.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/84159.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

pe文件結構(TLS)

TLS 什么是TLS? TLS是 Thread Local Storage 的縮寫&#xff0c;線程局部存儲。主要是為了解決多線程中變量同步的問題 如果需要要一個線程內部的各個函數調用都能訪問&#xff0c;但其它線程不能訪問的變量&#xff08;被稱為static memory local to a thread 線程局部靜態變…

Electron簡介(附電子書學習資料)

一、什么是Electron&#xff1f; Electron 是一個由 GitHub 開發的 開源框架&#xff0c;允許開發者使用 Web技術&#xff08;HTML、CSS、JavaScript&#xff09; 構建跨平臺的桌面應用程序&#xff08;Windows、macOS、Linux&#xff09;。它將 Chromium瀏覽器內核 和 Node.j…

如何使用DeepSeek幫助自己的工作?(Java開發)

如何使用DeepSeek幫助自己的工作&#xff1f; 作為Java開發者&#xff0c;你可以通過以下方式高效利用DeepSeek提升工作效率&#xff08;附具體操作示例&#xff09;&#xff1a; 一、日常編碼加速 1. 代碼生成與補全 // 輸入需求描述&#xff1a; "生成SpringBoot分頁…

Uniapp 二維碼生成與解析完整教程

前言 使用Uniapp開發多平臺應用&#xff0c;二維碼生成采用uQRCode插件&#xff0c;非常nice&#x1f601;&#xff01; Coding 原理 使用canvas繪制 生成二維碼數據 繪制到canvas上 使用 <uqrcoderef"uqrcodeRef"canvas-id"qrcode":value"qr…

Vue ⑤-自定義指令 || 插槽

自定義指令 自定義指令&#xff1a;自己定義的指令, 可以封裝一些 dom 操作&#xff0c; 擴展額外功能。 全局注冊 語法&#xff1a; Vue.directive(指令名, {"inserted" (el) {// 可以對 el 標簽&#xff0c;擴展額外功能el.focus()} })局部注冊 語法&#xff…

Java HttpClient實現簡單網絡爬蟲

今天我將使用Java的HttpClient&#xff08;在Java 11及以上版本中內置&#xff09;來編寫一個入門級的網絡爬蟲示例。 這個示例將演示如何發送HTTP GET請求&#xff0c;獲取響應內容&#xff0c;并處理可能出現的異常。 以下是一個基于Java HttpClient&#xff08;Java 11&…

圖表類系列各種樣式PPT模版分享

圖標圖表系列PPT模版&#xff0c;柱狀圖PPT模版&#xff0c;線狀圖PPT模版&#xff0c;折線圖PPT模版&#xff0c;餅狀圖PPT模版&#xff0c;雷達圖PPT模版&#xff0c;樹狀圖PPT模版 圖表類系列各種樣式PPT模版分享&#xff1a;圖表系列PPT模板https://pan.quark.cn/s/20d40aa…

Sonic EVM L1:沉睡的雄獅已蘇醒

Sonic 鏈 , 是 Fantom 基金會升級后的Layer-1區塊鏈&#xff0c;繼承了 Fantom Opera 的高性能特性&#xff0c;并通過全面技術優化成為EVM兼容的高吞吐量公鏈。 官方網站 : https://www.soniclabs.com 一、Sonic 鏈概述 1. 為什么從 Fantom 更名為 Sonic Sonic 鏈是 Fant…

籃球杯軟件賽國賽C/C++ 大學 B 組補題

3.gcd 模擬 map<pair<int,int>,int>m; void solve(){int n;cin>>n;forr(i,1,n){int ux,uy,vx,vy;cin>>ux>>uy>>vx>>vy;int dxvx-ux,dyvy-uy;if(dx!0&&dy!0){int gabs(__gcd(dx,dy));dx/g,dy/g;//dxdy中除去公共部分(gcd) 就…

技術棧RabbitMq的介紹和使用

目錄 1. 什么是消息隊列&#xff1f;2. 消息隊列的優點3. RabbitMQ 消息隊列概述4. RabbitMQ 安裝5. Exchange 四種類型5.1 direct 精準匹配5.2 fanout 廣播5.3 topic 正則匹配 6. RabbitMQ 隊列模式6.1 簡單隊列模式6.2 工作隊列模式6.3 發布/訂閱模式6.4 路由模式6.5 主題模式…

項目部署到Linux上時遇到的錯誤(Redis,MySQL,無法正確連接,地址占用問題)

Redis無法正確連接 在運行jar包時出現了這樣的錯誤 查詢得知問題核心在于Redis連接失敗&#xff0c;具體原因是客戶端發送了密碼認證請求&#xff0c;但Redis服務器未設置密碼 1.為Redis設置密碼&#xff08;匹配客戶端配置&#xff09; 步驟&#xff1a; 1&#xff09;.修…

Linux邊緣智能:物聯網的終極進化

Linux邊緣智能&#xff1a;物聯網的終極進化 從數據中心到萬物終端的智能革命 引言&#xff1a;邊緣計算的范式轉變 隨著物聯網設備的爆炸式增長&#xff0c;傳統的云計算架構已無法滿足實時性、隱私保護和帶寬效率的需求。邊緣智能應運而生&#xff0c;將計算能力從云端下沉到…

Linux Shell 中的 dash 符號 “-”

Shell中的-&#xff1a;小符號的大智慧 在Unix/Linux系統中&#xff0c;-符號是一個約定俗成的特殊標記&#xff0c;它表示命令應該使用標準輸入或標準輸出而非文件。這個看似簡單的短橫線&#xff0c;完美詮釋了Unix"一切皆文件"的設計哲學。 作為標準輸入/輸出的…

JMeter 實現 MQTT 協議壓力測試 !

想象一下&#xff0c;你的智能家居系統連接了上千個設備&#xff0c;傳感器數據通過 MQTT 協議飛速傳輸&#xff0c;但突然服務器崩潰&#xff0c;燈光、空調全失控&#xff01;如何確保你的 MQTT 經紀人能承受高負載&#xff1f;答案是 JMeter&#xff01;通過安裝 MQTT 插件&…

CKA考試知識點分享(6)---PriorityClass

CKA 版本&#xff1a;1.32 第六套題是涉及PriorityClass相關。 注意&#xff1a;本文不是題目&#xff0c;只是為了學習相關知識點做的實驗。僅供參考 實驗目的 創建一套PriorityClass &#xff0c;驗證PriorityClass的運作策略。 1 環境準備 創建2個pc&#xff0c;一個為高…

暴力破解篇補充-字典

在皮卡丘靶場的第二期&#xff0c;暴力破解模塊中&#xff0c;我相信大家短暫的接觸了字典這個概念&#xff0c;字典事實上就是包含了大量弱口令的txt文本文件 所以這篇文章用于分享一些字典&#xff1a;https://wwhc.lanzoue.com/ihdl12ybhbhi&#xff08;弱口令字典&#xff…

關于VS2022中C++導入第三方庫的方式

首先&#xff0c;新建一個Cpp項目(控制臺項目即可&#xff0c;其他項目也無所謂)&#xff0c;右鍵點擊項目名稱(Test1)選擇屬性或者在VS2022工具欄選擇調試標簽->屬性按鈕打開屬性頁。 注意點: 在開始其他操作前請注意先進行 配置和平臺選項框的選擇。配置選框選定了是配置…

C++中vector類型的介紹和使用

文章目錄 一、vector 類型的簡介1.1 基本介紹1.2 常見用法示例1.3 常見成員函數簡表 二、vector 數據的插入2.1 push_back() —— 在尾部插入一個元素2.2 emplace_back() —— 在尾部“就地”構造對象2.3 insert() —— 在任意位置插入一個或多個元素2.4 emplace() —— 在任意…

在Vue或React項目中使用Tailwind CSS實現暗黑模式切換:從系統適配到手動控制

在現代Web開發中&#xff0c;暗黑模式(Dark Mode)已成為提升用戶體驗的重要功能。本文將帶你使用Tailwind CSS在React項目(Vue項目類似)中實現兩種暗黑模式控制方式&#xff1a; 系統自動適配 - 根據用戶設備偏好自動切換手動切換 - 通過按鈕讓用戶自由選擇 一、項目準備 使…

Linux C語言網絡編程詳細入門教程:如何一步步實現TCP服務端與客戶端通信

文章目錄 Linux C語言網絡編程詳細入門教程&#xff1a;如何一步步實現TCP服務端與客戶端通信前言一、網絡通信基礎概念二、服務端與客戶端的完整流程圖解三、每一步的詳細講解和代碼示例1. 創建Socket&#xff08;服務端和客戶端都要&#xff09;2. 綁定本地地址和端口&#x…