MATLAB中CVX工具箱解决凸优化问题的基本知识——语法、变量声明、目标函数、约束条件、cvx编程错误及解决方法

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


前言

本文是在最近学习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 ) )

扫描二维码关注公众号,回复: 15258607 查看本文章

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特有的数学运算表达式

在进行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

4.其他小技巧
在这里插入图片描述

七、常见错误

错误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));

八、进阶阅读

1.进行CVX编程时,会遇到各种各样意想不到又难以解决的报错问题,如果编程过程中遇到了很多cvx bug和错误,可以阅读下面这篇文章,这篇文章总结了很多cvx编程错误,并给出了解决方法和代码实现:
MATLAB cvx错误汇总,cvx错误解决,cvx知识点总结,cvx编程技巧

2.CVX工具箱中有很多特定的,专有的函数,这些函数不仅能够简化表达式,还能够通过函数替换来解决很多报错问题,例如除法、取倒数、对数㏒函数等都有专门函数替代,下面这篇文章总结了cvx中常用的函数,阅读这篇文章一定会对你产生帮助!
MATLAB cvx工具箱中常用的替换函数汇总,解决表达式报错问题

3.如果是对MATLAB基础操作,尤其是涉及到矩阵操作、逻辑运算、数组生成等方面不是很熟悉的,可以参考下面这篇文章:
MATLAB基础操作,矩阵乘法、数组矩阵索引、最大最小运算符、零矩阵/随机矩阵/单位矩阵的生成、log函数、Inf和NaN的含义,语句过长用连接符换行、逻辑运算符以及区别

4.如果程序调试成功需要画结果图,但是对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

猜你喜欢

转载自blog.csdn.net/qq_45296693/article/details/130464580