在本节中,我们将介绍您在 CVX 中可能遇到的每个运算符、函数、集合和命令。在某些情况下,求解器的局限对其使用施加了某些限制或警告:
- 用†标记的函数本身不受 CVX 使用的求解器的支持。包含这些函数的模型将由 Mosek 有效求解,Mosek 是唯一支持构建这些函数的指数锥的求解器。对于所有其他求解器,使用逐次逼近方法处理这些函数,该方法对求解器进行多次调用,从而实现相同的最终精度。如果您的问题需要使用逐次逼近法,则会发出警告。这种技术在逐次逼近法中进一步讨论。正如本节所讨论的,这是一种实验性方法,在许多情况下效果很好,但不能保证。
- 涉及幂(例如 x^p)和p-范数(例如,norm(x,p))用‡标记。当p是一个有理数,CVX 可以准确表示这些函数。对于 p 的无理数值,将选择最近的有理数。有关如何处理这两种情况的详细信息,请参阅幂函数和 p 范数。
算术运算符
Matlab 的标准算术运算:加+、减 -、乘* .*、除 / ./ \ .\ 和幂 ^ .^ 为了在 CVX 中工作已经重载,只要它们的使用与标准数学和 Matlab 约定以及 DCP 规则集一致。例如:
- 如果两个 CVX 表达式具有相同的维度(或者其中一个是标量表达式)并且具有相同的曲率(即,两者都是凸、凹或仿射),则可以将它们相加。
- CVX 表达式可以乘以或除以标量常数。如果常数为正,则保留曲率;如果为负,则曲率反转。
- 仿射列向量CVX表达式可以乘以适当维度的常数矩阵;或者它可以被左除以适当维度的非奇异常数矩阵。
当然,还有许多其他组合是可能的。幂运算符 ^ .^ 的使用受到一定限制;请参阅下面非线性中幂的定义。
Matlab 的基本矩阵操作和算术运算也已扩展为可与 CVX 表达式配合使用,包括:
- 串联: [ A, B ; C, D ]
- 索引: x(n+1:end), X([3,4], :), 等等
- 索引分配,包括删除:y(2:4) = 1,Z(1:4,:) = []等。
- 转置和共轭转置:Z.',y'
内置函数
线性
Matlab 的许多基本线性和双线性函数要么自动与 cvx 表达式一起工作,要么已经得到扩展包括:conj、conv、cumsum、diag、dot、find、fliplr、flipud、flipdim、horzcat、hankel, ipermute, kron, mean, permute, repmat, reshape, rot90, sparse, sum, trace, tril, triu, toeplitz, vertcat.
大多数对CVX表达式的行为与对数值表达式的行为相同。那些执行某种求和(如 cumsum、sum)或乘法,(如 conv、dot 或 kron)只能根据规范凸编程规则使用。例如,kron(X,Y) 仅在 X 或 Y 为常量时才有效; trace(Z) 仅当沿对角线的元素具有相同的曲率时才有效。
非线性
abs
实数组和复数组的绝对值。凸。
†exp
指数。凸和非递减。
†log
对数。凹和非递减。
max
最大。凸和非递减。
min
最低。凹和非递减。
norm
实/复向量和矩阵的范数。凸。这个函数严格遵循 Matlab 约定。因此,单参数norm(x)计算向量的2范数,计算矩阵的2范数(最大奇异值)。双参数 norm(x,p)支持如下:
- ‡ 对于向量,p≥1的所有值被接受。
- 对于矩阵,p 必须是 1、2、Inf 或 "Fro"。
polyval
多项式计算。polyval(p,x),其中 p 是长度为 n 的向量,计算
p(1) * x.^(n-1) + p(2) * x.^(n-2) + ... + p(n-1) * x + p(n)
此函数通过两种方式在 CVX 中使用:
- 如果 p 是变量,x 是常量,polyval(p,x)计算 p 元素的线性组合。组合必须满足求和和缩放的 DCP 规则。
- 如果 p 是常量,x 是变量,polyval(p,x)构造变量 x 的多项式函数。多项式必须是仿射、凸或凹的,并且 x 必须是实数和仿射。
‡ power(x,p)
x^p 和 x.^p,其中 x 是实变量,p 是实常数。对于 x^p,x 和 p 都必须是标量。只有那些可以合理且明确地解释为凸或凹的 p 值才被接受:
- p=0.常数。x.^p 被视为 1。
- 0<p<1.凹。参数x必须是凹(或仿射),并且隐式地约束为非负。
- p=1.仿射。x.^p 就是 x。
- p∈{2,4,6,8,.。。}.凸。参数x必须是仿射。
,
.凸。参数x必须是仿射,并且隐式约束为非负数。
不允许负和奇整数p,但请参阅下一节中pow_p、pow_pos和pow_abs函数,了解有用的替代方法。
†power(p,x)
p.^x 和 p^x,其中 p 是实常数,x 是实变量。对于 p^x,p 和 x 都必须是标量。p 的有效值包括:
- p∈{0,1}.常数。
- 0<p<1凸和非递增;x 必须是凹的。
.凸和非递减;x 必须是凸的。
不允许使用负值p。
std
标准差。凸。
sqrt
平方根。隐式地将其参数限制为非负数。凹和非递减。
var
方差。凸。
新函数
尽管这些函数是专门为 CVX 开发的,但如果提供数值参数,它们也可以在 CVX 规范之外工作。
avg_abs_dev
关于平均值的平均绝对偏差.凸。
avg_abs_dev_med
关于中位数的平均绝对偏差.凸
det_inv
对称(或埃尔米特)正定矩阵逆的行列式,,它与特征值倒数的积相同。当在 CVX 规范中使用时,det_inv将矩阵约束为对称(如果实数)或埃尔米特(如果复数)和正半定。当与数值参数一起使用时,如果不满足这些约束,det_inv返回 +Inf。凸。
det_rootn
半定矩阵行列式的n次根,.当在 CVX 规范中使用时,det_rootn将矩阵约束为对称(如果实数)或埃尔米特矩阵(如果复数)和正半定。当与数值参数一起使用时,如果不满足这些约束,det_rootn返回 -Inf。凹。
det_root2n
半定矩阵行列式的2n次根;即,det_root2n(X)=sqrt(det_rootn(X)).凹。仅用于向后兼容目的。
† entr
熵函数:entr(x)=-x.*log(x)。凹。当使用具有负元素的常量参数调用时,返回 -Inf。
geo_mean
向量的几何平均值,在 CVX 规范中使用时,geo_mean将向量的元素限制为非负数。当与数值参数一起使用时,如果任何元素为负数,geo_mean返回 -Inf。凹和递增。
inv_pos
正部分的倒数,.在 CVX 规范内部,施加约束,使其参数为正。CVX 规范外部,如果
返回
。凸和递减。
† kl_div
Kullback-Leibler距离:
凸。CVX 规范外部,如果参数不在域中返回。
lambda_max
实对称或复埃尔米特矩阵的最大特征值。在 CVX 内部,施加约束保证参数是对称的(如果是实数)或埃尔米特的(如果是复数)。凸。
lambda_min
实对称或复埃尔米特矩阵的最小特征值。在 CVX 内部,施加约束保证参数是对称的(如果是实数)或埃尔米特的(如果是复数)。凹。
lambda_sum_largest(X,k)
实对称或复埃尔米特矩阵的k个最大特征值之和。在 CVX 内部,施加约束保证参数是对称的(如果是实数)或埃尔米特的(如果是复数)。凸。
lambda_sum_smallest(X,k)
实对称或复埃尔米特矩阵的k个最小特征值之和。在 CVX 内部,施加约束保证参数是对称的(如果是实数)或埃尔米特的(如果是复数)。凹。
log_det
正定矩阵行列式对数,,当在 CVX 规范中使用时,log_det将其参数限制为对称(如果实数)或埃尔米特(如果复数)和正定。使用数值参数时,如果不满足这些约束,log_det返回 -Inf。凹。
‡ log_normcdf(x)
标准正态随机变量累积分布函数的对数。凹和递增。
† log_prod(x)
当x是整数;否则
。凹和非递增。等效于 sum_log(x)。
†log_sum_exp(x)
x 的元素指数之和的对数。凸和非递减。
logsumexp_sdp
log-sum-exp函数的多项式近似,具有全局绝对精度。这可用于估计log-sum-exp函数,而无需使用逐次逼近法。
matrix_frac(x,Y)
。在 CVX 中,施加约束保证Y是对称的(或埃尔米特)和正定的;在 CVX 外部,返回+∞除非
。凸。
norm_largest(x,k)
对于实和复向量,返回向量 x 中k 个最大幅值的总和。凸。
norm_nuc(X)
实或复矩阵 X 的奇异值之和。凸。
‡ norms(x,p,dim), norms_largest(x,k,dim)
沿矩阵或 N维数组的指定维度计算向量范数。对于范数之和和最大范数问题很有用。凸。
poly_env(p,x)
计算 p 描述的多项式(在polyval意义上)的凸包络或凹包络的值。p 必须是一个实数常数向量,其长度 n 为 0、1、2、3 或其他奇数长度;并且 x 必须是实数和仿射。p 的第一个非零元素的符号决定了是构造凸(正)包络还是凹(负)包络。
pos(x)
,用于实数x.凸和递增。
‡ pow_abs(x,p)
用于
或
,
.凸。
‡ pow_pos(x,p)
用于
.凸和非递减。
‡ pow_p(x,p)
用于和实常数p,计算幂函数的非负凸分支和凹分支:
prod_inv(x)
当x为正数时,;否则 +∞. 凸和非递增.
quad_form(x,P)
对于实x和对称P,对于复x和埃尔米特P,
.当P固定和正半定,凸;当P固定和负半定,凹;
注意:二次函数(如quad_form,sum_square通常可以被norm函数替换,而不会牺牲等价性。出于数值原因,此替代公式是首选。有关详细信息,请参阅消除二次型。
quad_over_lin(x,y)
对于,
,
;对于
,
,
。在 CVX 规范中,添加约束y>0. CVX 规范之外,如果y≤0,返回+∞.凸,y上递减.
quad_pos_over_lin(x,y)
对于,
,sum_square_pos( x )/y .凸,x上递增,y上递减.
†rel_entr(x)
标量相对熵;rel_entr(x,y)=x.*log(x/y).凸。
sigma_max
实或复矩阵的最大奇异值。与norm相同。凸。
square
对于,
.凸。
square_abs
对于或
,
。
square_pos
对于,
.凸和递增。
sum_largest(x,k)
实向量x的k个最大值之和, 对于x.凸和非递减。
† sum_log(x)
当x为正数时,; 否则−∞. 凹和非递减。
sum_smallest(x,k)
k个最小值之和,即等效于 -sum_largest(-x,k)。凹和非递减。
sum_square
等效于 sum(square(x)),但效率更高。凸。仅适用于实值。
sum_square_abs
等效于 sum(square_abs(x)),但效率更高。凸。
sum_square_pos
等效于 sum(square_pos(x)),但效率更高。仅适用于实值。凸和递增。
trace_inv(X)
SPD 矩阵 X 逆的迹,它与特征值的倒数之和相同。凸。在 CVX 之外,如果参数不是正定的,则返回 +Inf。
trace_sqrtm(X)
正半定矩阵 X 的平方根的迹。这与特征值的平方根之和相同。凹。在 CVX 外部,如果参数不是正半定,则返回 +Inf。
集合
CVX目前支持以下集合;在每种情况下,n 都是正整数常量。
nonnegative(n)
simplex(n)
semidefinite(n)
hermitian_semidefinite(n)
nonneg_poly_coeffs(n)
convex_poly_coeffs(n)
exp_cone
geo_mean_cone(n)
命令
cvx_begin
开始新的 CVX 模型。如果模型已在进行中,它将发出警告并清除它。有关完整说明,请参阅cvx_begin和cvx_end,包括控制求解器输出、SDP 模式、GDP 模式等关键字。
cvx_clear
清除正在构造的任何模型。当出现错误并且必须从头开始时很有用。虽然当模型在进行中时,cvx_begin在调用时发出警告,但cvx_clear是静默的。
cvx_end
表示 CVX 模型的结束。在典型使用中,这会指示 CVX 开始求解过程。请参阅cvx_begin和cvx_end。
cvx_expert
控制在采用需要使用逐次逼近的模型时发出警告;请参阅逐次逼近法更多详细信息。
cvx_power_warning
控制 CVX 在构建涉及有理幂函数的模型期间是否以及何时发出警告(即 x^p,其中 x 是变量,p 是常量);请参见幂函数和 p 范数。
cvx_precision
控制求解器精度;请参阅控制精度。
cvx_quiet
在求解过程中启用或禁用屏幕输出;请参阅控制屏幕输出。另请参阅cvx_begin和cvx_end,了解较新的首选语法cvx_begin quiet。
cvx_save_prefs
将cvx_expert、cvx_power_warning、cvx_precision和cvx_solver的当前状态保存到磁盘,以便在退出和重新启动 MATLAB 时保留其值。该文件保存在 MATLAB 的首选项目录中,可以通过键入 prefdir 命令找到该目录。
cvx_setup
用于安装和配置 CVX 的安装脚本;请参阅安装。
cvx_solver
选择求解 CVX 模型时要使用的求解器;请参见选择求解器。
cvx_solver_settings
允许用户向CVX不支持的求解器提供高级的、特定于求解器的设置;请参阅高级求解器设置。
cvx_version
打印有关 CVX、Matlab 和操作系统的当前版本的信息。提交错误报告时,请包含此命令的输出。
cvx_where
返回安装 CVX 的目录。
dual variable, dual variables
创建一个或多个与当前模型中的约束联系的对偶变量;请参阅对偶变量。
expression, expressions
创建一个或多个表达式持有者;请参见赋值和表达式持有者。
maximise, maximize
指定最大化目标;请参阅目标函数。
minimise, minimize
指定最小化目标;请参阅目标函数。
variable, variables
创建一个或多个变量以在当前 CVX 模型中使用;请参阅变量。