CVX使用基础
cvx_begin
和 cvx_end
所有的CVX模型必须以命令cvx_begin
开头且以命令cvx_end
终止。所有变量声明,目标函数和约束都应介于两者之间。cvx_begin命令可能还包含一个或多个修饰符:
cvx_begin guiet
当模型在解答时阻止任何屏幕输出。
cvx_begin sdp
调用半正定规划模式.
cvx_begin gp
调用几何规划模式.
适当时可以组合使用这些修饰符。例如,cvx_begin sdp quiet调用SDP模式并关闭求解器的屏幕输出。
变量
所有的变量必须先使用variable
或者variables
命令声明后才可以在约束条件以及目标函数中使用。variable
命令包括变量名、一个可选的列表维度以及一个或多个关键词,这些关键词提供有关变量内容或结构的附加信息。
变量可以是实数或者复数标量、向量、矩阵、n维数组,下面的命令生成了共326个变量:一个标量X
,一个20*10的矩阵Y
(包含200个标量变量),一个5*5*5的数组Z
(包含125个标量变量)。
variable X
variable Y(20,10)
variable Z(5,5,5)
变量声明还可以包含一个或多个关键字,以表示变量的各种结构或条件。例如,要声明一个复杂变量,请使用complex关键字,如下所示:
variable w(50) complex
可以分别使用nonnegative
和semidefinite
关键字指定非负变量和对称/ Hermitian正半定(PSD)矩阵,如下所示。其中x
是一个非负向量,z
是一个实对称PSD矩阵,Q
是一个复杂的Hermitian PSD矩阵。对于第三种情况hermitian semidefinite
将是等效选择
variable x(10) nonnegative
variable Z(5,5) semidefinite
variable Q(5,5) complex semidefinite
对于MIDCPs,integer
和binary
关键词被用来声明整数和二进制变量,如下所示:
variable p(10) integer
variable q binary
可以使用多种关键字来帮助构造具有矩阵结构(比如对称性或bandedness)的变量,比如下面的代码段声明了Y
是一个50*50的对称矩阵变量,Z
是一个100*100的Hermitian Toeplitz矩阵(hermitian
关键字同时指定矩阵是复杂的)。
variable Y(50,50) symmetric
variable Z(100,100) hermitian toeplitz
当前支持的结构关键字如下所示:
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)
the matrix is banded with a lower bandwidth lb and an upper bandwidth ub. If both lb and ub are zero, then a diagonal matrix results. ub can be omitted, in which case it is set equal to lb. For example, banded(1,1) (or banded(1)) is a tridiagonal matrix.
upper_hankel
The matrix is Hankel (i.e., constant along antidiagonals), and zero below the central antidiagonal, i.e., for i+j>n+1.
当提供多个关键字时,结果矩阵结构由交集确定。 例如,symmetric
与tridiagonal
是有效组合。 就是说,当存在更合理的替代方法(在这种情况下为diagonal
)时,CVX确实拒绝了symmetric
与lower_tridiagonal
的组合。 此外,如果关键字完全冲突,从而使emph {no}非零矩阵满足所有关键字,则会导致错误。
矩阵特定的关键字也可以应用于n维数组:数组的每个二维切片都将具有指定的结构,如下所示构造了8个10*10的复杂Hermitian PSD矩阵,存储在R的二维切片中。
variable R(10,10,8) hermitian semidefinite
尽管变量语句非常灵活,但是它只能用于声明单个变量。如果要声明很多变量,可能会很不方便。因此提供了variables
语句用于声明多个变量,如下所示:
variables x1 x2 x3 y1(10) y2(10,10,10);
variables
命令的一个限制是它不能声明复数,整数或结构化变量。必须使用单变量命令一次声明一次。
目标函数
声明一个目标函数需要适当地使用minimize
或者maximize
函数。(为了使英语更好的用户受益,还提供了最小化和最大化同义词。)最小化调用中的目标函数必须是凸的; 最大化调用的目标函数必须是凹形的;比如:
minimize( norm( x, 1 ) )
maximize( geo_mean( x ) )
在CVX规范中最多可以声明一个目标函数,并且该函数必须具有标量值。
如果未指定目标函数,则将该问题解释为可行性问题,与将目标函数设置为零的最小化相同。 在这种情况下,如果找到可行点,则cvx_optval为0;如果约束不可行,则cvx_optval为+ Inf。
约束条件
CVX支持以下约束类型:
- 等式
==
约束,左右两侧均为仿射表达式。 - 小于等于
<=
约束,其中左侧表达式为凸形,而右侧表达式为凹形。 - 大于等于
>=
约束,其中左侧表达式为凹形,而右侧表达式为凸形。
不等式符号~=
从不使用在约束条件中,无论如何,这种约束很少是凸的。最新版本的CVX现在允许您将不等式连接在一起:比如l <= x <= u
。先前的版本不支持这种操作。
请注意,单项等于=(它是一个赋值)和双等号==(它表示相等)之间的重要区别。
严格的不等式<和>也可以接受,但是它们与非严格不等式的解释相同。我们强烈建议不要使用它们,将来的CVX版本可能会将它们完全删除。这带你在Strict inequalities中有完整的讨论。
不等式和等式约束以元素方式应用,对应于Matlab中的行为。比如,A
和B
是一个 m ∗ n m*n m∗n的矩阵,那么A<=B
等价于A(i, j) <= B(i, j)
。当一侧或另一侧为标量时,该值将被复制;例如,将A>0
解释为A(i,j)> = 0
。
不等式的元素处理在 semidefinite programming mode下发生了变化。
CVX此外支持一组成员的约束,参照下面[一组成员](###Set membership)
函数
基本的CVX函数库包括各种凸,凹和仿射函数,它们接受CVX变量或表达式作为参数。许多常见的Matlab函数,例如sum
,trace
,diag
, sqrt
, max
和min
,可根据需要重新实现以支持CVX;其他是Matlab中找不到的新函数。基本库中完整的函数列表可以在Reference guide中查看。同样也支持添加您自己的新函数,可参考Adding new functions to the atom library.
基本库中的一个函数示例是二次线性函数quad_over_lin
:
f : R n × R → R , f ( x , y ) = { x T x / y y > 0 + ∞ y ≤ 0 f:R^n \times R \rightarrow R, \quad f(x,y)= \begin{cases} x^Tx/y &y>0 \\ +\infty &y \leq 0 \end{cases} f:Rn×R→R,f(x,y)={
xTx/y+∞