提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
本文是在最近学习MATLAB CVX工具箱解决凸优化问题时学到的一些知识点,分享出来供大家参考。
进行CVX编程时,会遇到各种各样意想不到又难以解决的报错问题,如果编程过程中遇到了很多cvx bug和错误,可以阅读下面这篇文章,这篇文章总结了很多cvx编程错误,并给出了解决方法和代码实现:
MATLAB cvx错误汇总,cvx错误解决,cvx知识点总结,cvx编程技巧
CVX工具箱中有很多特定的,专有的函数,这些函数不仅能够简化表达式,还能够通过函数替换来解决很多报错问题,例如除法、取倒数、对数㏒函数等都有专门函数替代,下面这篇文章总结了cvx中常用的函数,阅读这篇文章一定会对你产生帮助!
MATLAB cvx工具箱中常用的替换函数汇总,解决表达式报错问题
1.cvx编程框架:
必须以cvx_begin开始,cvx_end结束。变量声明,目标函数和约束条件必须位于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 | 不显示求解过程,只输出结果 |
cvx_begin sdp | 采取半正定规划 |
cvx_begin gp | 采取几何规划 |
所有的变量必须在使用前以:variable 变量 (维度)
进行申明,variable命令包含变量名,可选的纬度列表
具体语句如下表:
语句 | 含义 |
---|---|
variable X | 标量 |
variable Y(n,m) | n*m维矩阵 |
variable Z(n,m,k) | 多维矩阵 |
variable w(50) complex | 复数向量 |
variable x(10) nonnegative | 非负 |
variable Z(5,5) semidefinite | 半正定(对称正定矩阵) |
variable Q(5,5) complexsemidefinite | 厄密共轭矩阵 |
variable p(10) integer | 整数变量 |
variable q binary | 二进制变量 |
variable Y(50,50) symmetric | 对称矩阵 |
variable Z(100,100) hermitiantoeplitz | 厄密共轭常对角矩阵 |
1.申明目标函数要求使用minimize或maximize函数
2.调用minimize的目标函数必须是凸的
3.调用maximize的目标函数必须是凹的
例如:
minimize( norm( x, 1 ) )
maximize( geo_mean( x ) )
如果不指定目标函数,问题将被解释成可行性问题,如果可行性点找到,cvx_optval将设定为0,否则将为+Inf。
CVX支持下列约束类型
1.相等 ==,等式左右两边是仿射表达式
2.小于 <= 不等式约束,左边表达式是凸的,右边表达式是凹的。
3.大于 >= 约束,左边表达式是凹的,右边表达式是凸的。
注:可以使用链式不等式:如l <= x <= u.
cvx工具包支持的基本函数:
sum:求和
trace:迹
diag:对角
sqrt:根号
max和min:最大最小
其他复杂函数参考Reference guide
注:可以使用自己定义的函数,直接调用即可。
在进行cvx求解优化问题时,会出现各种匪夷所思的错误(如下图),搞人心态,尤其是一些MATLAB常用的基本数学表达式在cvx中经常报错,比如除法运算。
常见错误: Cannot perform the operation: {real affine} ./ {positive constant}
其实cvx工具箱中有很多专属的数学运算表达式,例如关于变量的次方符号(^)是不允许的,需要替换为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.矩阵范数、log函数
语句 | 含义 |
---|---|
rel_entr | log函数,rel_entr(x,y) = xlog(x/y) |
norms() | 取范数 |
square_abs ( x ) | conj( x ) .*x |
quad_form ( A*x - b,o ) | (A*x-b)'Q(Ax-b) |
3.cvx除法(cvx最麻烦、最容易出错的表达式)
语句 | 含义 |
---|---|
inv_pos | 分式或倒数,inv_pos(X) = 1./X |
prod_inv(x) | 对X中每个元素取到数再求和,Πi(xi)−1 |
quad_over_lin(x,y) | X转置乘x再除以y, x^Tx/y |
quad_pos_over_lin(x,y) | sum_square_pos( x ) / y |
错误1:
无法从 cvx 转换为 double
错误1解决办法:
如果变量声明是在cvx表达式之外,那么cvx运行过程中会产生数据从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变量不是允许人为赋值的,只有在最后得出结果才会被结果覆盖,使用等号对某一个变量进行赋值是不允许的,cvx会动态优化变量,不允许人为赋值。
错误2解决办法:
使用expression声明临时变量,临时变量可以在cvx求解过程中进行人为赋值,整个求解结束时该变量被自动清除。
expression变量是可以使用“=”的临时变量
// 声明临时变量
cvx_begin
variable a; %优化变量,不可以赋值修改,可以用双等号==来写约束条件
expression b; %临时变量,可以用等号=来赋值修改
minimize(f(x));
subject to
a == 0; %约束条件,a必须等于零
b = 10; %给b赋值为10,优化结束后自动清除
cvx_end
错误3:
点除运算出现错误,出错 ./ (line 29)
错误3解决办法:
用错误提示给出的语法去纠正错误
例如:1./x报错,修改为:times(1, x, ‘./’)
再比如:z = x ./ y 报错,修改为:z = times(x, y, ‘./’)
错误4:
点除运算出现错误,出错 ./ (line 29)
错误4解决办法:
例如: x ./ y报错
用inv_pos(y)来代替y,上式修改为x .* inv_pos(y)
// 错误4
minimize(x ./ y);
//修改为
minimize(x .* inv_pos(y));
还有很多cvx错误这里不再一一列举,详细错误总结在我另一篇博客:
MATLAB cvx错误汇总,cvx错误解决,cvx知识点总结,cvx编程技巧
1.CVX工具箱中有很多特定的,专有的函数,这些函数不仅能够简化表达式,还能够通过函数替换来解决很多报错问题,例如除法、取倒数、对数㏒函数等都有专门函数替代,下面这篇文章总结了cvx中常用的函数,阅读这篇文章一定会对你产生帮助!
MATLAB cvx工具箱中常用的替换函数汇总,解决表达式报错问题
2.如果是对MATLAB基础操作,尤其是涉及到矩阵操作、逻辑运算、数组生成等方面不是很熟悉的,可以参考下面这篇文章:
MATLAB基础操作,矩阵乘法、数组矩阵索引、最大最小运算符、零矩阵/随机矩阵/单位矩阵的生成、log函数、Inf和NaN的含义,语句过长用连接符换行、逻辑运算符以及区别
3.如果程序调试成功需要画结果图,但是对MATLAB画图的基本知识和语法搞不清楚的,可以参考下面这篇文章:
MATLAB绘图必看,画图大全!MATLAB绘图基础操作大全—折线图、散点图、颜色样式、线条粗细汇总
参考视频:
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
2.https://www.jianshu.com/p/69bf890e1b1d