CVX用户指南之基础
cvx_begin和cvx_end
所有 CVX 模型前面必须有命令cvx_begin,并以命令cvx_end终止。所有变量声明、目标函数和约束都应介于两者之间。cvx_begin命令可能还包括一个以上的修饰符:
cvx_begin quiet
防止模型在求解时生成任何屏幕输出。
cvx_begin sdp
调用半定编程模式。
cvx_begin gp
调用几何编程模式。
这些修饰符可以在适当的时候组合使用;例如,cvx_begin sdp quiet 会调用 SDP 模式并静音求解器输出。
变量
所有变量都必须使用variable命令(或variables命令;见下文)声明,然后才能在约束或目标函数中使用。variable命令包括变量的名称、可选的维度列表以及一个或多个关键字,这些关键字提供有关变量内容或结构的其他信息。
变量可以是实或复标量、向量、矩阵或n-维度数组。例如
variable X
variable Y(20,10)
variable Z(5,5,5)
总共声明 326 个(标量)变量:一个标量 X、一个 20x10 矩阵 Y(包含 200 个标量变量)和一个 5x5x5 数组 Z(包含 125 个标量变量)。
变量声明还可以包含一个或多个关键字,以表示变量的各种结构或条件。例如,要声明复变量,请使用 complex 关键字:
variable w(50) complex
非负变量和对称/埃尔米特正半定 (PSD) 矩阵可以分别使用 nonnegative 和 semidefinite关键字指定:
variable x(10) nonnegative
variable Z(5,5) semidefinite
variable Q(5,5) complex semidefinite
在这个例子中,x 是一个非负向量,Z 是一个实对称的 PSD 矩阵,Q是一个复埃尔米特 PSD 矩阵。正如我们将在下面看到的,hermitian semidefinite 将是第三种情况的一种等效选择。
对于 MIDCP,integer 和 binary关键字分别用于声明整数和二进制变量:
variable p(10) integer
variable q binary
可以使用各种关键字来帮助构造具有矩阵结构的变量,例如对称性或带状。例如,代码段
variable Y(50,50) symmetric
variable Z(100,100) hermitian toeplitz
声明 Y 为50×50实对称矩阵变量,和 Z 为100×100 埃尔米特托普利茨矩阵变量。(请注意,hermitian关键字还指定矩阵是复的。)当前支持的结构关键字包括:
banded(lb,ub) diagonal hankel hermitian
skew_symmetric symmetric toeplitz tridiagonal
lower_bidiagonal lower_hessenberg lower_triangular
upper_bidiagonal upper_hankel upper_hessenberg upper_triangular
下划线实际上可以省略;因此,例如,lower triangular也是可以接受的。这些关键字不言自明,但有以下几个例外:
banded(lb,ub)
矩阵具有较低的带宽 lb 和较高的带宽 ub。如果 lb 和 ub 均为零,则生成对角矩阵。可以省略 ub,在这种情况下,它被设置为等于 lb。例如, banded(1,1) (或 banded(1)) 是一个三对角矩阵。
upper_hankel
矩阵是 Hankel(即沿反对角线不变),在中心反对角线下方为零,即i+j>n+1.
当提供多个关键字时,生成的矩阵结构由交集确定。例如,symmetric tridiagonal是有效组合。也就是说,CVX确实拒绝诸如symmetric lower_triangular的组合,当存在更合理的替代方案时 - 在这种情况下是diagonal。此外,如果关键字完全冲突,使得没有非零矩阵满足所有关键字,则会导致错误。
特定于矩阵的关键字可应用于n-维度数组:数组的每个二维"切片"都被赋予了规定的结构。例如,声明
variable R(10,10,8) hermitian semidefinite
构造 8个10×10复埃尔米特PSD矩阵,存储在R的2-D切片中。
尽管 variable语句可能很灵活,但它只能用于声明单个变量,如果要声明大量变量,可能会不方便。因此,提供了variables语句,允许您声明多个变量;即,
variables x1 x2 x3 y1(10) y2(10,10,10);
variables 命令的一个限制是它不能声明复数、整数或结构化变量。必须使用单个 variable命令一次声明一个。
目标函数
声明目标函数需要根据需要使用 minimize 或 maximize 函数。(为了英语用户的利益,还提供了同义词 minimise 和 maximise。) 调用中最小化的目标函数必须是凸的;调用中最大化的目标函数必须是凹的;例如:
minimize( norm( x, 1 ) )
maximize( geo_mean( x ) )
最多可以在 CVX 规范中声明一个目标函数,并且它必须具有标量值。
如果未指定目标函数,则问题被解释为可行性问题,这与在目标函数设置为零的情况下执行最小化相同。在这种情况下,cvx_optval为 0(如果找到可行点)或 +Inf(如果约束不可行)。
约束
CVX 支持以下约束类型:
- 等式 == 约束,其中左右两侧都是仿射表达式。
- 小于 < = 不等式约束,其中左侧表达式为凸,右侧表达式为凹。
- 大于 >= 约束,其中左侧表达式为凹,右侧表达式为凸。
不相等运算符 ~= 可能永远不会在约束中使用;无论如何,这种约束很少是凸的。最新版本的CVX现在允许您将不等式链接在一起;例如,l <= x <= u。(以前的版本不允许连锁不等式。)
请注意单等于 =(这是赋值)和双等于 ==(表示等式)之间的重要区别;有关此区别的更多信息,请参阅下面的赋值和表达式持有者。
严格不等式<和>也被接受,但它们的解释与非严格形式相同。我们强烈建议不要使用它们,CVX 的未来版本可能会完全删除它们。有关这背后的原因,请参阅严格不等式中的更全面讨论。
不等式和等式约束以元素的方式应用,这与 MATLAB 本身的行为相匹配。例如,如果 A 和 B 是m×n数组,则 A<=B 被解释为mn(标量)不等式 A(i,j)<=B(i,j)。当一侧或另一侧是标量时,该值被复制;例如,A>0 被解释为 A(i,j)>=0。当一侧或另一侧是标量时,该值被复制;例如,A>0 被解释为 A(i,j)>=0。
在半定编程模式下,对不等式的逐元素对待被改变;有关更多详细信息,请参阅该部分。
CVX还支持集合成员约束;请参阅下面的集合成员。
函数
基础 CVX 函数库包括各种凸、凹和仿射函数,这些函数接受 CVX 变量或表达式作为参数。许多是常见的Matlab函数,如sum,trace,diag,sqrt,max和min,根据需要重新实现以支持CVX;其他的则是 Matlab 中找不到的新函数。基础库中函数的完整列表可在参考指南中找到。也可以添加自己的新函数;请参阅向原子库添加新函数。
基础库中的一个函数示例是二次超线性函数quad_over_lin:
(该函数还接受复x,但我们会考虑实x以保持简单。)二次超线性函数在x和y上是凸的,因此可以用作目标函数,在适当的约束或更复杂的表达式下。例如,我们可以最小化二次超线性函数使用
minimize( quad_over_lin( A * x - b, c' * x + d ) );
在 CVX 规范中,假设 x 是向量优化变量,A 是矩阵,b 和 c 是向量,d 是标量。CVX 将此目标表达式识别为凸函数,因为它是凸函数(二次超线性函数)和仿射函数的组合。
您还可以在 CVX 规范之外使用函数quad_over_lin。在这种情况下,它只计算其数值,给定(数值)参数。如果 c'*x+d 为正数,则结果在数值上等于
( ( A * x - b )' * ( A * x - b ) ) / ( c' * x + d )
但是,quad_over_lin函数还会执行域检查,因此,如果 c'*x+d 为零或负数,它将返回 Inf。
集合成员
CVX 支持凸集的定义和使用。基础库包括正半不定n×n矩阵锥,二阶或洛伦兹锥,以及各种范数球。基本库中提供的集合的完整列表在集合中给出。
不幸的是,Matlab语言没有一个集合成员运算符,例如x in S表示x∈S.因此,在 CVX 中,我们使用稍微不同的语法来要求表达式位于集合中。为了表示集合,我们使用一个函数,该函数返回一个未命名的变量,该变量需要在集合中。例如,考虑,对称正半定n×n矩阵锥。在 CVX 中,我们用函数 semidefinnite(n) 来表示这,它返回一个未命名的新变量,该变量被限制为正半定。为了要求矩阵表达式 X 是对称正半定的,我们使用以下语法
\mathbf{S}^n_+
这的字面意思是X被约束为等于某个未命名的变量,该变量必须是一个n×n对称正半定矩阵。当然,这相当于说X本身必须是对称正半定。
例如,考虑约束(矩阵)变量 X 是相关矩阵,即它是对称的,具有单位对角线元素,并且是正半定的。在 CVX 中,我们可以声明这样一个变量并施加这些约束使用:
variable X(n,n) symmetric;
X == semidefinite(n);
diag(X) == 1;
这里的第二行施加了 X 为正半定的约束。(你可以把这里的"=="读作"is"或"is in",所以第二行可以读作X是正半定的。第三行的左侧是一个包含 X 的对角线元素的向量,我们要求其元素等于 1。
如果这种使用等式约束表示集合成员仍然令人困惑或只是在美学上令人不快,我们已经创建了一个"伪运算符"<In>您可以在其位置上使用它。因此,例如,上面的半定约束可以替换为
X <In> semidefinite(n);
这完全等同于使用等式约束运算符,但如果您发现它更令人愉悦,请随时使用它。实现此运算符需要一些 Matlab 技巧,因此不要指望能够在 CVX 模型之外使用它。
集合可以在仿射表达式中组合,我们可以将仿射表达式约束在凸集中。例如,我们可以施加如下形式的约束
A*X*A'-X <In> B*semidefinite(n)*B';
其中 X 是n×n对称变量矩阵,A 和 B 为n×n常量矩阵。此约束要求对于某些。
CVX 还支持其元素为有序数量列表的集合。例如,考虑二阶或洛伦兹锥,
其中epi表示函数的铭文。元素是一个有序列表,包含两个元素:第一个是m-向量,第二个是标量。我们可以使用此圆锥来表示最小二乘部分中的简单最小二乘问题(以相当复杂的方式),如下所示:
CVX使用Matlab的单元数组工具来模仿这种符号:
cvx_beginvariables x(n) y;minimize( y );subject to{ A*x-b, y } <In> lorentz(m);
cvx_end
调用 lorentz(m) 的函数返回一个未命名的变量(即,由向量和标量变量组成的一对),该变量被约束为位于长度为 m 的洛伦兹锥中。因此,此规范中的约束要求对 { A*x-b, y } 位于适当大小的洛伦兹锥中。
双变量
当一个规范凸程序被求解时,相关的双问题也得到了解决。(在这种情况下,原始问题称为原问题。)最优双变量,每个变量都与原问题中的一个约束相关联,提供了有关原问题的有价值信息,例如关于扰动约束的敏感性(c.f.凸优化,第5章)。要得到 CVX 中的最佳双变量,只需声明它们,并将它们与约束相关联。例如,考虑LP
带有变量和m个不等式约束。关联双变量y与不等式约束Ax⪯b在此 LP 中,我们使用以下语法:
n = size(A,2);
cvx_beginvariable x(n);dual variable y;minimize( c' * x );subject toy : A * x <= b;
cvx_end
行
dual variable y
告诉 CVX y 将表示双变量,并且行
y : A * x <= b;
将其与不等式约束相关联。请注意冒号: 运算符的使用方式与标准 Matlab 中的使用方式不同,在标准 Matlab 中,它用于构造数值序列(如 1:10)。这种新行为仅在存在双变量时才有效,因此不应出现混淆或冲突。没有给出y的维度;它们是根据与之关联的约束自动确定的。例如,如果m=20,在cvx_end之前在 Matlab 命令提示符下键入 y,产生
y =cvx dual variable (20x1 vector)
没有必要将双变量放在约束的左侧;例如,上面的行也可以这样写:
A * x <= b : y;
此外,不等式约束的双变量将始终是非负的,这意味着不等式可以在不改变双变量的值的情况下被逆转;即,
b >= A * x : y;
产生相同的结果。另一方面,对于等式约束,交换等式约束的左右两侧将否定双变量的最优值。
处理cvx_end语句后,假设优化成功,CVX 会将数值分配给 x 和 y,分别是最佳的原变量值和双变量值。此 LP 的最优原变量和双变量必须满足互补松弛条件
您可以在 Matlab 中通过以下行检查此内容
y .* (b-A*x)
它打印出y和b-A * x条目的乘积,这应该接近于零。此行必须在cvx_end命令(该命令将数值分配给 x 和 y)之后执行;如果在 CVX 规范内执行,它将生成错误,其中 y 和 b-A*x 仍然只是抽象表达式。
如果优化不成功,因为问题不可行或无界,则 x 和 y 将具有不同的值。在无界的情况下,x将包含一个无界方向;即,一个点x满足
和 y 将填充 NaN 值,反映双问题是不可行的事实。在不可行的情况下,x用NaN值填充,而y包含无界的双方向;即,一个点y满足
当然,对原和双点和/或方向的精确解释取决于问题的结构。请参阅凸优化等参考资料,了解有关双信息解释的更多信息。
CVX 还支持索引双变量的声明。当模型中的约束数(双变量数)取决于参数本身时,这被证明是有用的。有关索引双变量的详细信息,请参阅索引双变量。
赋值和表达式持有者
任何具有 C 或 Matlab 经验的人都了解单等赋值运算符 = 和双等等式运算符 == 之间的区别。这种区别在 CVX 中也至关重要,CVX 采取措施确保分配不会使用不当。例如,请考虑以下代码段:
variable X(n,n) symmetric;
X = semidefinite(n);
乍一看,语句 X = semidefinnite(n);可能看起来像是将 X 约束为正半定。但是由于使用了赋值运算符,因此 X 实际上被匿名半定变量覆盖。幸运的是,CVX禁止以这种方式覆盖声明的变量;当达到cvx_end时,此模型将发出以下错误:
??? Error using ==> cvx_end
The following cvx variable(s) have been overwritten:X
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.
我们希望此检查至少可以防止一些印刷错误在您的模型中产生令人沮丧的后果。
尽管有此警告,但赋值可能确实有用,因此我们鼓励谨慎使用它们。例如,请考虑以下摘录:
variables x y
z = 2 * x - y;
square( z ) <= 3;
quad_over_lin( x, z ) <= 1;
z = 2 * x - y 不是等式约束;这是赋值。它存储一个中间计算 2 * x - y,这是一个仿射表达式,稍后在两个不同的约束中使用。我们将 z 称为表达式持有者,以将其与正式声明的 CVX 变量区分开来。
通常,将表达式数组累加到单个 Matlab 变量中会很有用。不幸的是,在这种情况下,Matlab 对象模型的一些技术细节可能会导致问题。请考虑以下构造:
variable u(9);
x(1) = 1;
for k = 1 : 9,x(k+1) = sqrt( x(k) + u(k) );
end
这似乎很合理:x 应该是一个向量,其第一个值为 1,其后续值是凹 CVX 表达式。但是,如果您在CVX模型中尝试这样做,Matlab会给您一个相当隐晦的错误:
??? The following error occurred converting from cvx to double:
Error using ==> double
Conversion to double from cvx is not possible.
发生这种情况的原因是,当赋值 x(1)=1 时,Matlab 变量 x 被初始化为数值数组;Matlab 将不允许随后将 CVX 对象插入到数值数组中。
解决方案是在为 x 赋值之前显式声明 x 为表达式持有者。我们为此目的提供了关键字expression 和 expressions,用于声明单个或多个表达式持有者以供将来分配。声明表达式持有者后,可以自由地在其中插入数值和 CVX 表达式。例如,可以按如下方式更正前面的示例:
variable u(9);
expression x(10);
x(1) = 1;
for k = 1 : 9,x(k+1) = sqrt( x(k) + u(k) );
end
CVX将接受此构造而不会出现错误。然后,您可以以任何适当的方式使用凹表达式 x(1), ..., x(10);例如,您可以最大化 x(10)。
变量对象和表达式对象之间的差异非常显著。变量对象包含优化变量,并且不能在 CVX 规范中被覆盖或赋值。(但是,在求解问题后,CVX 将用最优值覆盖优化变量。)另一方面,表达式对象初始化为零,应将其视为存储 CVX 表达式的临时位置;它可以在 CVX 规范中赋值、自由重新赋值和覆盖。
当然,正如我们的第一个示例所示,在创建或使用表达式持有者之前,并不总是需要声明表达式持有者。但是,这样做为模型提供了额外的清晰度,因此我们强烈建议这样做。
CVX用户指南之基础相关推荐
- CVX用户指南之快速入门
安装 CVX(请参阅安装)后,可以通过在 Matlab 脚本或函数中输入 CVX 规范,或直接从命令提示符开始使用它.为了将 CVX 规范与周围的 Matlab 代码区分开来,在它们前面加上语句 cv ...
- CVX用户指南之DCP规则集
CVX 强制执行规范凸编程规则集(简称 DCP 规则集)规定的约定.CVX 每当遇到违反任何规则的行为时,都会发出一条错误消息,因此在开始构建模型之前了解这些规则非常重要.这些规则来自凸分析的基本原理 ...
- CVX用户指南之简介
什么是 CVX? CVX 是一个建模系统,用于构建和求解规范凸程序 (DCP).CVX 支持多种标准问题类型,包括线性和二次型程序(LP/QPs).二阶锥形程序 (SOCP) 和半 ...
- CVX用户指南之半定编程模式
熟悉半定编程 (SDP) 的人都知道,在上面关于集合成员的讨论中,使用集合semidefinite(n)的约束在实践中通常使用线性矩阵不等式(LMI)表示.例如,给定.约束表示;也就是说,即X为正半定 ...
- CVX 工具箱(安装及用户指南)
目录 Introducition 下载地址 User Guide 安装CVX步骤 Quick Start 一个实例 CVX工具箱学习教程 Introducition CVX是一个基于matlab的凸优 ...
- MacOS基础用户指南-不断更新
Mac&macOS小白用户指南(不断更新) 一 Mac&macOS简介 App Store:苹果电脑软件商店 iTunes:在 Mac 上管理 iPhone 的利器 iTunes ...
- Gradle2.0用户指南翻译——第六章. 构建脚本基础
翻译项目请关注Github上的地址: https://github.com/msdx/gradledoc 本文翻译所在分支: https://github.com/msdx/gradledoc/tre ...
- 《UML用户指南第二版》再次温读笔记(一)(downmoon)
前言:最近,花点时间重读(也不知道是第几遍了)<UML用户指南第二版>这本书,感觉虽然对WEB程序开发而言,UML的应用是一个极大的挑战,然而,其中蕴含的基本原理和指导性却是历久弥新,耐人 ...
- Spark性能优化指南:基础篇
前言 在大数据计算领域,Spark已经成为了越来越流行.越来越受欢迎的计算平台之一.Spark的功能涵盖了大数据领域的离线批处理.SQL类处理.流式/实时计算.机器学习.图计算等各种不同类型的计算操作 ...
最新文章
- canvas-应用大全
- 1-选择器 计算法
- boost源码剖析之:多重回调机制signal(下)
- 2.3微秒的特征点匹配
- linux命令运行中,输入命令,如果输入错误,怎么删除?
- MobaXterm 中文乱码问题
- 安卓手机如何使用第三方主题,制作专属自己喜好的主题
- unity导出fbx模型_三维制作内容,maya模型贴图文件导入untiy,烘焙灯光贴图
- Incorrect string value: '\xF0\x9F\x91\x80' for column数据库中添加表情报错
- 趣头条的开屏广告有什么优势呢?适合哪些企业投放?
- 最新初中级前端面试题合集一,你确定不看一看嘛
- lede 内核 单 编_编译了一个 K3 的 LEDE 17.01.4 版本提供下载(忠于 LEDE 原版,无任何附加包)...
- 16进制颜色代码大全
- JDBC连接oracle11g——socket read timed out
- java零钱换整程序_透析递归应用-换零钱
- 【深度学习基础】数字手势识别实验:2.MLP
- 在极路由极1S上使用entware
- mysql外键创建不成功/失效
- 居民个人综合所得预扣预缴税款计算器(网页单机版)
- 音频剪切拼接软件哪个好?给你分享四款音频剪切拼接软件
热门文章
- 拓网超大文件上传组件
- cfd计算linux windows,[转载]实现fluent软件在windows单机系统中多核计算
- 【L2-030 冰岛人】天梯赛L2系列详解
- MVP如何激活 office 365订阅
- Oracle SQL到DB2 SQL移植解决方案(引)
- 运维必知的网络基础知识!
- 150ms流畅体验 NBA2KOnline如何网络同步优化
- AVOSCloud(AVOSCloud.o)' does not contain bitcode. You must rebuild it with bitcode enabled (Xcode se
- 国际大会演讲ppt_如何在会议或活动中接受技术演讲
- 张一鸣,究竟有多可怕?身家千亿,不爱豪车美女,就喜欢做产品!