提示:文章寫完后,目錄可以自動生成,如何生成可參考右邊的幫助文檔
前言
本文是在最近學(xué)習(xí)MATLAB CVX工具箱解決凸優(yōu)化問題時學(xué)到的一些知識點,分享出來供大家參考。
進行CVX編程時,會遇到各種各樣意想不到又難以解決的報錯問題,如果編程過程中遇到了很多cvx bug和錯誤,可以閱讀下面這篇文章,這篇文章總結(jié)了很多cvx編程錯誤,并給出了解決方法和代碼實現(xiàn):
MATLAB cvx錯誤匯總,cvx錯誤解決,cvx知識點總結(jié),cvx編程技巧
CVX工具箱中有很多特定的,專有的函數(shù),這些函數(shù)不僅能夠簡化表達式,還能夠通過函數(shù)替換來解決很多報錯問題,例如除法、取倒數(shù)、對數(shù)㏒函數(shù)等都有專門函數(shù)替代,下面這篇文章總結(jié)了cvx中常用的函數(shù),閱讀這篇文章一定會對你產(chǎn)生幫助!
MATLAB cvx工具箱中常用的替換函數(shù)匯總,解決表達式報錯問題
一、語法
1.cvx編程框架:
必須以cvx_begin開始,cvx_end結(jié)束。變量聲明,目標(biāo)函數(shù)和約束條件必須位于cvx_begin和cvx_end之間。
代碼如下(示例):
cvx_begin
variable x(6,2);
variable y(6,2);
minimize(f(x,y));
subject to
x == a; %必須等于某一個值
x >= 0; %保證大于等于零
b <= 0; %保證小于等于零
sum(x) <= x_max; %保證之和小于上限
cvx_end
基本語句及其含義
注:修飾語句可以組合使用
語句 | 含義 |
---|---|
cvx_begin quiet | 不顯示求解過程,只輸出結(jié)果 |
cvx_begin sdp | 采取半正定規(guī)劃 |
cvx_begin gp | 采取幾何規(guī)劃 |
二、變量聲明
所有的變量必須在使用前以:variable 變量 (維度)
進行申明,variable命令包含變量名,可選的緯度列表
具體語句如下表:
語句 | 含義 |
---|---|
variable X | 標(biāo)量 |
variable Y(n,m) | n*m維矩陣 |
variable Z(n,m,k) | 多維矩陣 |
variable w(50) complex | 復(fù)數(shù)向量 |
variable x(10) nonnegative | 非負 |
variable Z(5,5) semidefinite | 半正定(對稱正定矩陣) |
variable Q(5,5) complexsemidefinite | 厄密共軛矩陣 |
variable p(10) integer | 整數(shù)變量 |
variable q binary | 二進制變量 |
variable Y(50,50) symmetric | 對稱矩陣 |
variable Z(100,100) hermitiantoeplitz | 厄密共軛常對角矩陣 |
三、目標(biāo)函數(shù)
1.申明目標(biāo)函數(shù)要求使用minimize或maximize函數(shù)
2.調(diào)用minimize的目標(biāo)函數(shù)必須是凸的
3.調(diào)用maximize的目標(biāo)函數(shù)必須是凹的
例如:
minimize( norm( x, 1 ) )
maximize( geo_mean( x ) )
如果不指定目標(biāo)函數(shù),問題將被解釋成可行性問題,如果可行性點找到,cvx_optval將設(shè)定為0,否則將為+Inf。
四、約束條件
CVX支持下列約束類型
1.相等 ==,等式左右兩邊是仿射表達式
2.小于 <= 不等式約束,左邊表達式是凸的,右邊表達式是凹的。
3.大于 >= 約束,左邊表達式是凹的,右邊表達式是凸的。
注:可以使用鏈?zhǔn)讲坏仁剑喝鏻 <= x <= u.
五、函數(shù)
cvx工具包支持的基本函數(shù):
sum:求和
trace:跡
diag:對角
sqrt:根號
max和min:最大最小
其他復(fù)雜函數(shù)參考Reference guide
注:可以使用自己定義的函數(shù),直接調(diào)用即可。
六、cvx特有的數(shù)學(xué)運算表達式
在進行cvx求解優(yōu)化問題時,會出現(xiàn)各種匪夷所思的錯誤(如下圖),搞人心態(tài),尤其是一些MATLAB常用的基本數(shù)學(xué)表達式在cvx中經(jīng)常報錯,比如除法運算。
常見錯誤: Cannot perform the operation: {real affine} ./ {positive constant}
其實cvx工具箱中有很多專屬的數(shù)學(xué)運算表達式,例如關(guān)于變量的次方符號(^)是不允許的,需要替換為pow_pos(x,n)。下面列出一些常見的替換表達式:
1.平方/次方表達式
語句 | 含義 |
---|---|
square_pos | 平方,square_pos(X)=MAX(X,0).^2 |
square ( x ) (real x) | x.*x |
sum_square_abs ( y ) | y’* y |
2.矩陣范數(shù)、log函數(shù)
語句 | 含義 |
---|---|
rel_entr | log函數(shù),rel_entr(x,y) = xlog(x/y) |
norms() | 取范數(shù) |
square_abs ( x ) | conj( x ) .*x |
quad_form ( A*x - b,o ) | (A*x-b)'Q(Ax-b) |
3.cvx除法(cvx最麻煩、最容易出錯的表達式)
語句 | 含義 |
---|---|
inv_pos | 分式或倒數(shù),inv_pos(X) = 1./X |
prod_inv(x) | 對X中每個元素取到數(shù)再求和,Πi?(xi?)?1 |
quad_over_lin(x,y) | X轉(zhuǎn)置乘x再除以y, x^Tx/y |
quad_pos_over_lin(x,y) | sum_square_pos( x ) / y |
4.其他小技巧
七、常見錯誤
錯誤1:
無法從 cvx 轉(zhuǎn)換為 double
錯誤1解決辦法:
如果變量聲明是在cvx表達式之外,那么cvx運行過程中會產(chǎn)生數(shù)據(jù)從cvx類型存到double(外面是double的)的過程。必須要將中間變量在cvx表達式里面進行定義。
在cvx_begin和cvx_end之間用variable聲明變量。
錯誤2:
This is often an indication that an equality constraint was written with one equals ‘=’ instead of two ‘==’. The model must be rewritten before cvx can proceed.
錯誤2原因:
cvx中的variable變量不是允許人為賦值的,只有在最后得出結(jié)果才會被結(jié)果覆蓋,使用等號對某一個變量進行賦值是不允許的,cvx會動態(tài)優(yōu)化變量,不允許人為賦值。
錯誤2解決辦法:
使用expression聲明臨時變量,臨時變量可以在cvx求解過程中進行人為賦值,整個求解結(jié)束時該變量被自動清除。
expression變量是可以使用“=”的臨時變量
// 聲明臨時變量
cvx_begin
variable a; %優(yōu)化變量,不可以賦值修改,可以用雙等號==來寫約束條件
expression b; %臨時變量,可以用等號=來賦值修改
minimize(f(x));
subject to
a == 0; %約束條件,a必須等于零
b = 10; %給b賦值為10,優(yōu)化結(jié)束后自動清除
cvx_end
錯誤3:
點除運算出現(xiàn)錯誤,出錯 ./ (line 29)
錯誤3解決辦法:
用錯誤提示給出的語法去糾正錯誤
例如:1./x報錯,修改為:times(1, x, ‘./’)
再比如:z = x ./ y 報錯,修改為:z = times(x, y, ‘./’)
錯誤4:
點除運算出現(xiàn)錯誤,出錯 ./ (line 29)
錯誤4解決辦法:
例如: x ./ y報錯
用inv_pos(y)來代替y,上式修改為x .* inv_pos(y)
// 錯誤4
minimize(x ./ y);
//修改為
minimize(x .* inv_pos(y));
還有很多cvx錯誤這里不再一一列舉,詳細錯誤總結(jié)在我另一篇博客:
MATLAB cvx錯誤匯總,cvx錯誤解決,cvx知識點總結(jié),cvx編程技巧
八、進階閱讀
1.CVX工具箱中有很多特定的,專有的函數(shù),這些函數(shù)不僅能夠簡化表達式,還能夠通過函數(shù)替換來解決很多報錯問題,例如除法、取倒數(shù)、對數(shù)㏒函數(shù)等都有專門函數(shù)替代,下面這篇文章總結(jié)了cvx中常用的函數(shù),閱讀這篇文章一定會對你產(chǎn)生幫助!
MATLAB cvx工具箱中常用的替換函數(shù)匯總,解決表達式報錯問題
2.如果是對MATLAB基礎(chǔ)操作,尤其是涉及到矩陣操作、邏輯運算、數(shù)組生成等方面不是很熟悉的,可以參考下面這篇文章:
MATLAB基礎(chǔ)操作,矩陣乘法、數(shù)組矩陣索引、最大最小運算符、零矩陣/隨機矩陣/單位矩陣的生成、log函數(shù)、Inf和NaN的含義,語句過長用連接符換行、邏輯運算符以及區(qū)別
3.如果程序調(diào)試成功需要畫結(jié)果圖,但是對MATLAB畫圖的基本知識和語法搞不清楚的,可以參考下面這篇文章:
MATLAB繪圖必看,畫圖大全!MATLAB繪圖基礎(chǔ)操作大全—折線圖、散點圖、顏色樣式、線條粗細匯總
參考資料
參考視頻:
https://www.bilibili.com/video/BV1UQ4y1K7Vf/?spm_id_from=333.337.search-card.all.click&vd_source=aaf9c92065709eaa104228d5528a5d21
參考文章:
1.https://blog.csdn.net/gongshouxiayin/article/details/122477776?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522168301606916800222832721%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=168301606916800222832721&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2alltop_positive~default-1-122477776-null-null.142v86insert_down38v5,239v2insert_chatgpt&utm_term=cvx&spm=1018.2226.3001.4187文章來源:http://www.zghlxwxcb.cn/news/detail-479270.html
2.https://www.jianshu.com/p/69bf890e1b1d文章來源地址http://www.zghlxwxcb.cn/news/detail-479270.html
到了這里,關(guān)于MATLAB中CVX工具箱解決凸優(yōu)化問題的基本知識——語法、變量聲明、目標(biāo)函數(shù)、約束條件、cvx編程錯誤及解決方法的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!