MATLAB中CVX工具箱解决凸优化问题的基本知识——语法、变量声明、目标函数、约束条件、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 ) )

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_entrlog函数,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));

还有很多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

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
社会演员多的头像社会演员多普通用户
上一篇 2023年12月15日
下一篇 2023年12月15日

相关推荐