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_beginvariable x(6,2);variable y(6,2);minimize(f(x,y));subject tox == 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_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_beginvariable a; %优化变量,不可以赋值修改,可以用双等号==来写约束条件expression b; %临时变量,可以用等号=来赋值修改minimize(f(x));subject toa == 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
MATLAB中CVX工具箱解决凸优化问题的基本知识——语法、变量声明、目标函数、约束条件、cvx编程错误及解决方法相关推荐
- Matlab中EMD工具箱的下载安装和使用
Matlab中EMD工具箱的下载安装和使用 Matlab中EMD工具箱的下载安装和使用 电脑环境 下载指南 安装步骤 使用示例 Matlab中EMD工具箱的下载安装和使用 电脑环境 笔者的电脑环境为( ...
- 机器学习中的数学(七)--凸优化的基础知识
写在前面 <机器学习中的数学>系列主要列举了在机器学习中用到的较多的数学知识,包括微积分,线性代数,概率统计,信息论以及凸优化等等.本系列重在描述基本概念,并不在应用的方面的做深入的探讨, ...
- matlab画图模糊,[转载]matlab中模糊工具箱的使用
用 Matlab 中的 Fuzzy 工具箱做一个简单的模糊控制,流程如下: 1.创建一个 FIS (Fuzzy Inference System ) 对象, a = newfis(fisName,fi ...
- matlab中m_map工具箱绘制大圆航线
m_map工具箱需要从外部下载导入进matlab.m-map工具箱中常用的函数有:m_proj('proj name','property',value,-) 投影方式,投影区域大小····· m_c ...
- matlab中模糊工具箱的使用
关于模糊控制查了一些资料,觉得下面的例子简单又易于理解,甚好,现转载如下,以备日后查阅及与大家分享 用 Matlab 的 Fuzzy 工具箱实现模糊控制 转自http://blog.daviesliu ...
- 在matlab中添加工具箱
1.如工具包spasm,解压够里面有好多个.m文件,把spasm文件夹放到matlab的安装目录下的toolbox中,如D:\Mathlab2009a\toolbox 2.在matlab中写命令 ad ...
- matlab中值滤波法算法,基于MATLAB中值滤波算法的优化与实现
总第238期2014年第4期 舰 船 电 子 工 程 Ship Electronic Engineering Vol.34No.437 基于 MATLAB中值滤波算法的优化与实现* 赵建春 刘力源 ( ...
- MATLAB中FIR滤波器的时延溢出问题详解:线性相位对信号造成的时延溢出及其消除方法,以及fir1等函数的使用
1.问题由来: 前段时间在对用MATLAB处理试验数据时,需要对多路信号进行滤波后做同步,在这个过程中使用MATLAB中自带的 fir1 函数以及Filter Designer工具箱(FDATool) ...
- matlab中float类型的_【Python基础学习】2. 变量、基本数据类型及其转换
知行校园汇 记录学习.分享干货.吐槽人生! 关注 相关说明 文章内容:变量.基本数据类型及其转换 作者博客:csdn.cxhit.com www.cxhit.com 1. 变量 1.1 变量规则 在P ...
最新文章
- OAuth2.0在项目中认证流程介绍
- 电脑鼠标自己乱跳乱点_无线鼠标VS有线鼠标,二者区别何在?你可知晓?不妨来了解一下...
- mysql跨服务器查询插入_Oracle跨服务器查询插入数据
- jsp怎么调用servlet_Servlet简述
- 【jQuery笔记Part1】08-jQuery操作css-获取设置样式
- Red5开发第一步-Hello World
- 十六. 面向对象上下文管理协议
- DWR怎么调用java的方法_在DWR中实现直接获取一个JAVA类的返回值的两种方法
- Java知识总结,不止为了秋招(上)!!!
- BPF类型格式BTF
- 51单片机C语言us级延时函数
- 机器学习笔记(四)——正则化
- java2048分析_Java版2048
- python基础学习_02数据类型+占位符+运算符+IF分支基础
- 树莓派3B+无显示屏安装教程(一)
- 感应开关垃圾桶小项目的完成及问题解决——基于STC89C52RC单片机
- Linux 运维必备的 13 款实用工具,拿好了
- 源码免杀教程 源码免杀思路详解
- 华为云对象存储服务OBS,海量存储安全可靠,让云存储更加简单
- 详解麦克风阵列的原理、分类及作用
热门文章
- PLC控制系统的接地设计
- Go string类型及其使用
- linux nmon的安装及使用
- x264-几种码控模式
- jdbc连接mysql的serverTimeZone参数配置
- python判断密码是否正确_python密码判断是否符合要求的方法
- jquery 常用选择器和方法以及遍历(超详细)
- 开源者的自我修养|为 ShardingSphere 贡献了千万行代码的程序员,后来当了 CEO...
- 决战奶酪之巅,剑指Big Cheeze
- linux对 pow 未定义的引用,未定义引用`pow’和`floor’