CVX文档(Release 2.2)(自翻中文)

CVX用户指南(Release 2.2)

Authors: Michael C. Grant, Stephen P. Boyd CVX Research, Inc. January 28,2020
翻译:BJTU/PacificL,如有不对之处,请多多指教!

1、简介

1.1、什么是CVX?

CVX是一种用于构建和解决标准凸规划(disciplined convex programs, DCPs)的建模系统。CVX支持一定数量的标准问题类型,包括线性(linear programs, LPs)和二次规划(quadratic programs, QPs),二阶锥规划(second-order cone progrmas, SOCPs)以及半正定规划(semidefinite programs, SDPs)。CVX也可以解决许多复数凸优化问题,包括许多涉及不可为的函数,例如 l 1 l_1 l1 范数。你可以用CVX快捷地构造和解决带约束范数最小化问题,熵值最大化问题,行列式最大化问题以及其他凸问题。从 2.0 2.0 2.0 版本开始,CVX也可以通过合适的具有整数功能的求解器来解决混合整数标准凸规划(mixed
integer disciplined convex programs, MIDCPs)。

为了更有效地使用CVX,您至少需要了解一些凸优化的知识。关于凸优化的背景,您可以参考书籍Convex Optimization (Boyd&Vandenberghe)或者是斯坦福的课程Stanford course EE364A

CVX被部署在Matlab中,可以高效地将Matlab代码转化为一种优化建模语言。通过使用通用的Matlab操作符和函数可以构建建模规范,同时CVX的规范写法也可以和标准的Matlab代码进行自由地混写。这样的组合形式使得构建优化问题或者根据已知解来处理结果的计算变得更加简单。比如,CVX可以通过验证约束条件来构建和解决一类优化问题并且很容易计算出一个最佳权衡曲线。阿再比如,CVX可以被用作大型凸优化系统的其中一部分,例如,分支定界方法或者工程设计框架。

CVX提供两种特殊问题类别中的特殊模式来简化问题的构成。在半正定规划(semidefinite programming, SDP)模式中,CVX将矩阵解释应用于不等式运算符,因此线性矩阵不等式(linear matrix inequality, LMIs)和SDPs都可以被标示成一种更自然的形式。在几何规划(geometric programsing, GP)中,CVX接受所有的特殊函数和集合规划的组合规则,包括单项式,多项式以及广义多项式,并将这些问题转化为凸形式以便高效地求解。几何规划的背景知识可以参考A Tutorial on Geometric Programming (Boyed&Kim)

CVX先前的版本支持两种免费的SQLP求解器,及SeDuMi [Stu99]SDPT3 [TTT03]。这些求解器被包含在CVX发行版当中。从 2.0 2.0 2.0 版本开始,CVX还将支持两种商业求解器,GurobiMOSEK,具体内容查阅Solvers章节。

我们已经决定在新的专业版授权模型的CVX中将商业求解器一同提供给用户使用。学术人员无需改变便可以直接使用这些特性内容,而商业用户则需要购买CVX专业版的授权许可。更多详情,请参考 Licensing章节。

1.1.1、有何新特性?

近期关于求解器技术的发展扩展了CVX解决问题的能力。尤其是商业求解器Mosek增加了对指数锥的本级支持,同时其允许CVX求解包含对数、指数和熵函数的求解,而无需依靠连续近似启发算法的帮助。

1.2、什么是标准凸规划?

标准凸规划是一种用于构建由Michael GrantStephen BoydYinyu Ye1,2提出的凸优化问题的技术方法。这就意味着

4、基础知识

4.1、 cvx_begin cvx_end

所有的CVX模型都必须先于命令 cvx_begin ,并在命令 cvx_end 处截止。所有变量声明,目标函数和约束都必须放在两个命令中间。 cvx_begin 可以包括一种或多种修改模式:

  • cvx_begin qiute :在解决模型时阻止任何屏幕输出。
  • cvx_begin sdp :调用半正定规划模型(详情参考 semidefinite programming mode)。
  • cvx_begin gp :调用几何规划模型(详情参考 geometric programming mode)。

有需要的时候,这些修改模式可以组合使用。举个例子, cvx_begin sdp quite 会调用SDP模型并使求解器在输出时静默。

4.2、变量

所有变量在被用在约束和目标函数之前都必须通过 variable 命令进行声明(或者是 variables 命令,查阅以下内容)。一个 variable 命令包括变量的名称,一个可选的维度列表和一个或多个关键字用于提供该变量的内容或结构的额外信息。

变量可以是实数或者是复数变量,向量,矩阵或者 n n n 维数组。举个例子,

variable X
variable Y(20,10)
variable Z(5,5,5)

以上三个命令声明了326个(标量)变量:一个标量 X ,一个 20 × 10 20\times10 20×10 的矩阵 Y (包含了200​个标量变量)和一个 5 × 5 × 5 5\times5\times5 5×5×5 的数组 Z (包含了125个标量变量)。

变量声明可以包括一个或多个关键字去说明该变量的结构或是条件。举个例子,想要去声明一个复数变量,可以用 complex 关键字:

variable w(50) comnplex

非负变量和对称/赫米特正半定(positive semidefinite,PSD)矩阵可以分别用 nonnegetivesemidefinite 关键字来声明:

variable X(10) nonnegetive
variable Z(5,5) semidefinite
variable Q(5,5) complex semidefinite

在这个例子中, X 是一个非负的向量, Z 是一个实数对称的PSD矩阵,而 Q 是一个复数赫米特PSD矩阵。 正如我们下面看到的,赫米特半定可以看做是第三个命令的等效写法。

对于MIDCPs,关键字 integerbinary 被用于声明整数和二元变量,分别写做:

variable p(10) integer
variable q binary

各种各样的关键字可以帮助构建带有矩阵结构的变量,例如对称性或者条带化。举例说明,代码段为:

variable Y(50,50) symmetric
variable Z(100,100) hermitian toeplitz

声明 Y 为一个实数 50 × 50 50\times50 50×50 对称矩阵变量,而且 Z 为一个 100 × 100 100\times100 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的矩阵。如果上下边界都为零,则该矩阵为对角矩阵,其中上边界可以被忽略,因为上下边界相同。例如, banded(1,1) (或者 banded(1) )为一个三对角线矩阵。

** upper_hankel **:该矩阵为汉克尔(Hankel)矩阵(每一条逆对角线上的元素相等),且逆对角线下的元素为零,即 i + j > n + 1 i+j>n+1 i+j>n+1

当多个关键字被使用的时候,生成的矩阵结构由关键字的交集构成。举个例子, symmetric tridiagonal 是有效的组合形式。也就是说,在本例中,如果存在更为合理的替代方式—— diagonal ,则CVX将会拒绝例如 symmetric lower_triangular 的组合关键字。此外,如果关键字完全冲突,以致于没有非零矩阵满足所有的关键字,那么将会得到一个错误。

矩阵专用的关键字也可以用在 n n n 维数组上:每一个数组的 2 2 2 维切片都具有指定的结构。举例说明,下面的声明

variable R(10,10,8) hermitian semidefinite

构建了8个 10 × 10 10\times10 10×10 的复数赫米特PSD矩阵,储存在 R 2 2 2 维切片中。

尽管 variable 的声明很灵活,但是其只能声明单个变量,如果您有很多变量需要去声明,这个命令是很不方便的。出于这个原因,CVX还有提供了 variables 允许您声明多个变量,即

variables x1 x2 x3 y1(10) y2(10,10,10);

variables 命令有一个限制就是它不能声明复数,整数或者是结构化的变量。这些变量必须使用 variable 命令单独依次声明。

4.3、目标函数

声明目标函数需要使用 minimizemaximize 函数( minimisemaximise 同样适用)。最小化调用中的目标函数必须是凸的,最大化调用中的目标函数必须是凹的。举例说明,

minimize(norm(x,1))
maximize(geo_mean(x))

在CVX标准中,最多只有一个目标函数可以被声明,而且必须返回一个标量值。

如果没有目标函数被指定,则问题会被解释为一个可行性问题,该问题与执行一个目标函数设置为零的最小化问题一样。在本例中,如果可行解存在,则cvx_optval(CVX的最优值)为0,如果不存在则cvx_optval为+Inf(正无穷)。

4.4、约束

CVX支持一下的约束类型:

  • 等式约束,用 == 构建,两边都是放射的。
  • 小于等于约束,用 <= 构建,其中左边是凸函数,右边是凹函数。
  • 大于等于约束,用 >= 构建,其中左边是凹函数,右边是凸函数。

不等号操作符 ~= 几乎不用在约束中,在任意的例子中,这样的约束几乎是不凸的。最新版本的CVX支持不等式约束的链式写法,举例说明, l<=x<=u (之前的版本是不支持这样的链式写法的,模目前最新的版本为Release 2.2)。

需要注意区分单等号 = 和双等号 == 的区别,前者是赋值,后者表示相等,详情请参考下面的 Assignment and expression holders

严格不等式约束 <> 也可以使用,但它们的解释与非严格对应的解释相同。强烈建议不要使用严格约束,之后版本的CVX可能会将其一起移出,其背后的原因请查阅更详细的讨论 Srtict inequalities

不等式和等式约束以元素方式使用,与MATLAB本身的行为匹配。举例说明,如果如果 AB 都是 m × n m\times n m×n 的数组,则 A<=B 可以被解释为 m n mn mn 个(标量)不等式 A(i,j)<=B(i,j)​ 。当其中一边为标量时,该标量值要复制的,举个例子, A>0 被解释为 A(i,j)>=0

这种元素形式的处理方式可以用 semidefinite programming mode 来替换,详情查阅对应章节。

CVX也支持集合成员关系约束,详情查阅下面的 Set membership

4.5、函数

基本的CVX函数库包含了一系列的可接受CVX变量或者是表达式作为参数的凸函数,凹函数和仿射函数。其中许多都是MATLAB函数,例如: sumtracediagsqrtmaxmin ,可根据需要重新实现用来支持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: \mathbf{R}^{n} \times \mathbf{R} \rightarrow \mathbf{R}, \quad f(x, y)=\left\{\begin{array}{ll} x^{T} x / y & y>0 \\ +\infty & y \leq 0 \end{array}\right. f:Rn×RR,f(x,y)={xTx/y+y>0y0
(该函数也接受复数 x x x ,但是为了简单这里只考虑实数 x x x )。二次线性函数在 x x x y y y 上都是都是凸函数,而且可以被当做目标函数,或者用在合适的约束中,或者用在更复杂的表达式中。举例说明,我们可以最小化二次线性函数 ( A x − b , c T x + d ) (Ax-b,c^Tx+d) (Axb,cTx+d) 中,

minimize(quad_over_lin(A*x-b,c'*x+d));

在CVX标准中,假设 x x x 为向量最优化变量, A A A 为一个矩阵, b b b c c c 为向量,而 d d 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

4.6、集合成员关系

CVX支持凸集的定义和使用。基本库中包含了正半定 n × n n\times n n×n 矩阵的锥,二阶或洛伦兹(Lorentz)锥以及各种范式球(norm ball)。基本库支持的集合的完成列表请在 Sets 中查阅。

不幸的是,MATLAB并不支持关系例如 x in S 表示 x ∈ S x \in S xS 。因此在CVX中,我们使用略有不同的语法来要求表达式必须在集合中。我们用一个返回单个要求在集合中的未命名变量的函数来表示集合。举例说明,考虑 S + n \mathbf{S}^n_+ S+n ,即对称正半定 n × n n\times n n×n 矩阵。在CVX中,我们通过函数 semidefinite(x) 来表示,该函数会返回一个新的被约束为正半定的未命名变量。为了要求矩阵表达式 X 为对称正半定,我们使用下列语法。

X==semidefinite(n)

字面上的意思就是 X 被约束为一些未命名的变量,而这些变量被要求是 n × n n\times n n×n 的对称正半定矩阵。当然,这就相当于说 X 本身必须为对称半正定矩阵。

举个例子,考虑这样的一个约束,(矩阵)变量 X 为一个相关矩阵,换句换说,就是该变量是对称的,具有单位对角元素和是正半定的。在CVX中我们可以通过以下的命令来声明这样的变量并加以约束条件。

variable X(n,n) symmetric;
X==semidefinite(X);
diag(X)==1;

上述命令的第二行将 X 加上约束使其成为正半定的(您可以将这里 == 读作“是”或者是“在…内”,因此第二行可以被解释为 X 是正半定的)。第三行左边是包含 X 对角元素的一个向量,该向量的每个元素值都被要求等于1。

如果这种用来表示集合成员关系的等式约束的用法依旧不理解或者只是在美学上令人不快,我们也创造了一个“伪操作符” <In> 来代替等号。举个例子,上述的半定约束可以被替换为

X <In> semidefinite(n);

这与使用等式约束操作符是一样的,但是您如果觉得这种用法更赏心悦目,请随意使用。使用这样的操作符需要一些MATLAB的操作技巧,因此不要在CVX模型外使用。

集合可以在仿射表达式中合并,而且我们将一个仿射表达式约束为一个凸集。举个例子,我们可以施加下列形式的约束

A*X*A'-X <In> B*semidefinite(n)*B';

其中 X 是一个 n × n n\times n n×n 的对称变量矩阵,而且 AB n × n n\times n n×n 的常量矩阵。这个约束要求的是对于一些 Y ∈ S + n Y \in \mathbf{S}^n_+ YS+n ,使得 A X A T − X = B Y B T AXA^T-X=BYB^T AXATX=BYBT

CVX也支持元素为数量为有序列表的集合。举例说明,考虑二阶锥或者洛伦兹锥,
Q m = { ( x , y ) ∈ R m × R ∣   ∣ ∣ x ∣ ∣ 2 ≤ y } = e p i ∣ ∣ ⋅ ∣ ∣ 2 \mathbf{Q}^m=\{(x,y)\in\mathbf{R}^m\times\mathbf{R}|\ ||x||_2\leq y\}=\mathbf{epi}||\cdot||_2 Qm={(x,y)Rm×R x2y}=epi2
其中 e p i \mathbf{epi} epi 为表示函数的题词(epigraph)。 Q m \mathbf{Q}^m Qm 中的一个元素为一个有两个元素的有序列表:第一个元素为一个 m m m 维的向量,而第二个元素为一个标量。我们使用这个锥来表示 Least squares 章节中简单的最小二乘问题(以相当复杂的方式):
minimize y subject to ( A x − b , y ) ∈ Q m \begin{array}{ll} \text{minimize}& y\\ \text{subject to}& (Ax-b,y)\in \mathbf{Q}^m \end{array} minimizesubject toy(Axb,y)Qm
CVX使用MATLAB的元胞数组方式来模拟这种表示:

cvx_begin
	variables x(n) y;
	minimize(y);
	subject to
		{A*x-b,y} <In> lorentz(m);
cvx_end

该函数调用了 lorentz(m) 并反悔了一个未命名的变量(换句话说,一对包含一个向量和一个标量),该变量被约束在长度为 m m m 的洛伦兹锥中。因此在这个标准中的约束要求变量对 {A*x-b,y} 在适当尺寸的洛伦兹锥中。

4.7、对偶变量

当一个标准的凸规划被解决的时候,其相应的对偶问题也会被解决。(在本文中,初始问题(original problem)被叫做原问题(primal problem))。每一个最优的对偶变量都与原问题的一个约束相关。而且这些最优的对偶变量可以给出有关原问题的变量信息,例如关于干扰约束的敏感性(参考 Convex Optimization 第五章)。为了在CVX中获得最优的对偶变量,您可以简单地声明它们,并将它们与约束联系起来。举个例子,考虑线性规划问题:
minimize c T x subject to A x ⪯ b \begin{array}{ll} \text{minimize}&c^Tx\\ \text{subject to}&Ax\preceq b \end{array} minimizesubject tocTxAxb
其中,变量 x ∈ R n x\in\mathbf{R}^n xRn ,以及 m m m 个不等式约束。为了将对偶变量 y 与线性规划中的不等式约束 A x ⪯ b Ax\preceq b Axb 联系起来,我们使用一下的语法

n=size(A,2);
cvx_begin
	variable x(n);
	dual variable y;
	minimize(c'*x);
	subject to
		y:A*x<=b;
cvx_end

dual variable y 会告诉CVX, y 表示对偶变量,而 y:A*x<=b; 则将其与不等式约束联系在一起。注意分号 : 操作符与在标准的MATLAB用法不同,在标准的Matlab语法中是用于构建数值序列,例如 1:10 。这种新式的操作符只有在有对偶变量的时候才会有效,所以不用担心出现混乱。 y 的维度并没有给出,这是因为可以根据与其相关联的约束自动确定维度。举个例子,如果 m = 20 m=20 m=20 ,在 cvx_end 命令之前在MATLAB命令窗口输入 y ,则会立即得到。

y=
	cvx dual variable (20x1 vector)

此外,也并不需要将对偶变量放在约束的左边。举例说明,上述的对偶变量命令也可以写作

A*x<=b:y;

同时,对偶变量对应的不等式约束总是非负的,这就意味着不需要改变对偶变量的值,将上述不等式约束翻转一些也是可以的,即

b>=A*x:y;

两种写法的结果一致。另一方面,对于等式约束,将其左右两边互换将会使对偶值的最优值无效。

cvx_end 命令被处理之后,且假设成功地得到了最优值,CVX会将数值结果分别分配给 xy 即最优原变量值和最优对偶变量值。对于线性规划的最优的原变量和对偶变量必须满足补充松弛条件
y i ( b − A x ) i = 0 , i = 1 , … , m . y_i(b-Ax)_i=0,\quad i=1,\dots,m. yi(bAx)i=0,i=1,,m.
您可以在MATLAB中用以下命令进行检查

y.*(b-A*x)

然后会打印出 yb-A*x 两项的乘积,该乘积应该接近于0。该行命令必须在 cvx_end 命令后被执行(这是为了将数值结果分配给 xy )。如果在CVX语段内执行该命令则会抛出一个错误,其中 yb-A*x 依旧是抽象的表达式。

如果没有成功地得到最优值,因为这么问题是不可行或者是无限制的,所以 xy 具有不同的值。在无限制的例子中, x 将会包含一个无限制的方向,换句话说,一个点 x x x 满足
c T x = − 1 , A x ⪯ 0 c^Tx=-1,\quad Ax\preceq0 cTx=1,Ax0
同时 y 将会得到一个 NaN 值,这就反映了对偶变量不可行的事实。在不可行的例子中,x 充斥着 NaN 值,而 y 包含了一个无边界的对偶方向,换句话说就是一个点 y 满足
b T y = − 1 ,   A T y = 0 , y ⪰ 0 b^Ty=-1,\ A^Ty=0,\quad y\succeq 0 bTy=1, ATy=0,y0
当然,原始点和对偶点和(或)方向取决于问题的结构。更多对偶信息的解释请查阅 Convex Optimization 等参考资料。

4.8、赋值和表达式持有符

任何有过C语言或者MATLAB经验的人都会明白单个等号 = 的赋值操作符和两个等号 == 操作符的区别。在CVX中这种区别也至关重要,而且CVX也会采取行动来保证赋值操作不会被错误地使用。举例说明,考虑下列代码片段:

variable X(n,n) symmetric;
X=semidefinite(n);

乍一看,这个声明 X=semidefinite(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
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 1 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 为一个表达式持有符。出于这个目的,我们提供了关键字表达式和表达式用于声明单个或者多个表达式持有符方便之后地赋值。一旦一个表达式持有符被声明,您就可以自由地将其插入在数值和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标准中重写。

当然,正如我们第一个例子展示的,并不是必须要在表达式被创造或者使用之前去声明一个表达式占位符。但是这样做可以为模型提供额外的清晰度,因此我们强烈建议您这样做。

5、DCP规则

CVX强制实行标准凸规划规则准则,简单的说就是DCP规则。当遇到任何一个违反准则,CVX都会抛出一个错误消息,因此在构建模型之间搞清楚规则是十分重要的。这些规则是由基本的凸分析得出,只要接触过凸分析和凸优化之后,这些规则很容易学习。

DCP规则是一系列凸性质的充分不必要条件。因此,可能构建的问题违反了规则,但是其事实上还是凸的。将熵函数作为一个例子, − ∑ i = 1 n x i log ⁡ x i -\sum_{i=1}^nx_i\log{x_i} i=1nxilogxi ,其定义域为 x > 0 x>0 x>0 ,这是一个凸函数。如果该函数被写作

sum(x.*log(x))

CVX将会拒绝接受,因为其凸性质不满足任意一个组成规则(尤其是,其违背了在 Expression rules 中的无内积规则)。然而,包含熵的函数是可以被解决的,通过明确地使用熵函数,

sum(entr(x))

熵函数在基本的CVX库中,因此会被CVX识别为具有凸性质。如果一个凸(或者凹)函数无法被CVX识别为凸或者凹时,其可以被改写为一个新原子3。详情查阅 Adding new function to the atom library

另一个例子为函数 x 2 + 1 = ∣ ∣ [ x 1 ] ∣ ∣ 2 \sqrt{x^2+1}=||[x_1]||_2 x2+1 =[x1]2 ,这是一个凸函数。如果其被写作

norm([x_1])

那么将会为被CVX识别为一个凸函数(假设 x x x 是一个标量或者是仿射表达式)。因此可以用于(适当的)约束和目标。但是如果其被写作

sqrt(x^2+1)

CVX将拒绝接受它,因为该函数凹性质不满足CVX规则。

5.1、曲率分类

在标准凸规划中,一个标量表达式通过其曲率(curvature)进行分类。这里存在四种曲率类别,常量、仿射函数、凸函数和凹函数。对于一个定义在所有 R n \mathbf{R}^n Rn 上的函数 f : R n ⟶ R f:\mathbf{R}^n\longrightarrow \mathbf{R} f:RnR ,其分类有下面的四种意义:

类别数学表达式定义域
常量 f ( α x + ( 1 − α ) y ) = f ( x ) f(\alpha x+(1-\alpha)y)=f(x) f(αx+(1α)y)=f(x) ∀ x , y ∈ R n , α ∈ R \forall x,y \in \mathbf{R}^n,\alpha \in \mathbf{R} x,yRn,αR
仿射 f ( α x + ( 1 − α ) y ) = α f ( x ) + ( 1 − α ) f ( y ) f(\alpha x+(1-\alpha)y)=\alpha f(x)+(1-\alpha)f(y) f(αx+(1α)y)=αf(x)+(1α)f(y) ∀ x , y ∈ R n , α ∈ R \forall x,y \in \mathbf{R}^n,\alpha \in \mathbf{R} x,yRn,αR
凸函数 f ( α x + ( 1 − α ) y ) ≤ α f ( x ) + ( 1 − α ) f ( y ) f(\alpha x+(1-\alpha)y)\leq\alpha f(x)+(1-\alpha)f(y) f(αx+(1α)y)αf(x)+(1α)f(y) ∀ x , y ∈ R n , α ∈ [ 0 , 1 ] \forall x,y \in \mathbf{R}^n,\alpha \in [0,1] x,yRn,α[0,1]
凹函数 f ( α x + ( 1 − α ) y ) ≥ α f ( x ) + ( 1 − α ) f ( y ) f(\alpha x+(1-\alpha)y)\geq\alpha f(x)+(1-\alpha)f(y) f(αx+(1α)y)αf(x)+(1α)f(y) ∀ x , y ∈ R n , α ∈ [ 0 , 1 ] \forall x,y \in \mathbf{R}^n,\alpha \in [0,1] x,yRn,α[0,1]

当然,在这些类别中有着很大部分的重叠。举个例子,常量表达式也是仿射的,此外,(实数)仿射表达式既是凸的也是凹的。

根据定义,凹凸表达式是实数。复数常量也是可以被构建的,但是它们的用法有很多限制。举例来说,它们不能出现在不等式约束的左边或者是右边。

5.2、顶层规则

CVX支持三种不同类型的标准凸规划:

  • 最小化问题,包含一个凸的目标函数和零个或多个约束。
  • 最大化问题,包含一个凹的目标函数和零个或多个约束。
  • 可行问题,包含零个或多个约束没有目标函数。

5.3、约束

在标准凸规划中约束可以被分为三种:

  • 等式约束,用 == 构建,两边都是放射的。
  • 小于等于约束,用 <= 构建,其中左边是凸函数,右边是凹函数。
  • 大于等于约束,用 >= 构建,其中左边是凹函数,右边是凸函数。

~= 构建的非等式约束是不被允许的(这种约束是非凸的)。

等式约束的一边或两边可以是复数的;不等式约束必须是实数。一个复数等式约束相当于两个实数等式约束,一个是针对实数部分,另一个针对虚数部分。一边是实数,一边是复数的等式约束会迫使将复数边的虚部设置为0。

正如在 Set membership 中讨论的,CVX使用等式约束来这是集合成员关系约束(即 x ∈ S x\in S xS )。同样的等式约束两边应为仿射的规则也用于集合成员关系约束。事实上,集合原子像 semidefinite()lorentz() 的返回值都是仿射的,因此有必要验证下集合成员关系约束的剩下的部分。对于混合变量例如 {x,y} ,要求每一个变量都要是仿射的。

5.3.1、严格不等式

正如在 Constrains 中提到的那样,严格不等式<,>与非严格不等式>=,<=的解释是一样的。需要特别注意的是,CVX无法保证计算出来的解能够保证严格不等式。这不仅仅是我们在CVX中所做的选择,而是基础数学和凸优化求解器设计的自然结果。出于以上的原因,我们强烈抵制在CVX中使用严格不等式,而且在之后的版本中我们可能会将严格不等式移除。

当在您的模型中严格不等式十分重要,您可能需要采用额外的步骤来确保合理性。在这样的例子中,可以通过规范化来实现。举例说明,考虑一系列的同构方程和不等式
A x = 0 , C x ⪯ 0 , x ≻ 0 Ax=0,\quad Cx\preceq0,\quad x \succ 0 Ax=0,Cx0,x0
除了严格的不等式, x = 0 x=0 x=0 也可以成为一个可以接受的解,事实上可以通过严格不等式的变形来避免原问题。然而,请注意,如果给定的 x x x 满足上述的约束,则对于所有 α > 0 \alpha>0 α>0 α x \alpha x αx 也满足上述约束。通过消除规范化的自由度,我们消除严格不等式。举例说明:
A x = 0 , C x ⪯ 0 , x ≻ 0 , 1 T x = 1 Ax=0,\quad Cx\preceq0,\quad x\succ0,\quad \mathbf{1}^Tx=1 Ax=0,Cx0,x0,1Tx=1
如果对于您的模型来说规范化并不是可行的方法,您可能需要通过添加一个小的偏移量来简单地将严格不等式转换为一个非严格的不等式。举例说明,将 x>0 转换为 x>=1e-4 。注意这个边界需要足够的大,以便于底层的求解器将其认为数值上是比较重要的。

最后,注意对于一些函数像 log(x)inv_pos(x) ,其定义域都是严格不等式,而这些定义域的限制将由函数本身处理。您不需要添加一个明确的约束 x>0 到您的模型中来保证解释正值。

5.4、表达式规则

到目前为止,上述规则并没有特别的限制,因为在所有的凸规划中(标准的或者是其他形式的)通常都遵守这些规则。标准规则通过在目标函数和约束中表达式的构建来将标准凸规划从通常的凸规划中区分出来。

标准凸规划通过递归地使用下列的规则来确定标量表达式的曲率。尽管这个列表看起来很长,但是在很大程度上,它就是凸分析的基本规则,例如结合凸函数,凹函数和仿射形式函数:求和,标量相乘等等的枚举。

  • 一个可用的常量表达式为
    • 任意计算为有限值的格式正确的MATLAB表达式。
  • 一个可用的仿射表达式为
    • 一个常量表达式。
    • 一个声明过的变量。
    • 一个在原子库中具有仿射结果的函数的返回值。
    • 一个仿射表达式的求和或差值。
    • 一个仿射表达式和一个常量的乘积。
  • 一个可用的凸表达式为
    • 一个可用的常量或者是仿射表达式。
    • 一个在原子库中具有凸结果的函数的返回值。
    • 一个标量的偶数 p p p 次幂, p ≥ 1 , p ≠ 3 , 5 , 7 , 9 , … p\geq1,\quad p\neq3,5,7,9,\dots p1,p=3,5,7,9,
    • 一个凸标量二次型,查阅 Scalar quadratic froms
    • 两个或多个凸表达式求和。
    • 一个凸表达式和一个凹表达式的差值(凸函数 − - 凹函数)。
    • 一个凸表达式和一个非负常量的乘积。
    • 一个凹表达式和一个非正常量的乘积。
    • 一个凹表达式的负值。
  • 一个可用的凹表达式为
    • 一个可用的常量或者是仿射表达式。
    • 一个在原子库中具有凹结果的函数的返回值。
    • 一个标量的小数 p p p 次幂, p ∈ ( 0 , 1 ) p\in(0,1) p(0,1)
    • 一个凹标量二次型,查阅 Scalar quadratic froms
    • 两个或多个凹表达式求和。
    • 一个凹表达式和一个凸表达式的差值(凹函数 − - 凸函数)。
    • 一个凹表达式和一个非负常量的乘积。
    • 一个凸表达式和一个非正常量的乘积。
    • 一个凸表达式的负值。

如果一个表达式无法通过以上的规则进行分类,那么这个表达式就会被拒接。对于矩阵和数组表达式,这些规则将会被用在每个元素上。需要提示的是,以上的规则是冗余的,可以采用更小的或者相同的规则集合。

特别需要注意的是,这些表达式的规则通常禁止非常量表达式之间的乘积,但是除了标量二次形式。举个例子,表达式 x*sqrt(t) 可以被看做是一个关于 x x x 的凸函数,但是其凸性质无法通过CVX规则的验证,因此会被拒绝。(但是,其可以被表示为 pow_p(x,3/2) )。我们将其称之为非乘积规则,而且密切关注这个规则可以大大确保您所构建的表达式被验证通过。

5.5、函数

在CVX中,函数被分类为两种属性:曲率(常量,仿射,凸或者凹)和单调性(非递减,非递增以及非单调性)。曲率根据上面给出的表达式规则确定它们在表达式中出现的条件。单调性决定了如何在函数组合中使用它们,正如我们将在下一节中看到的那样。

对于仅有一个参数的函数,函数分类是比较直接的。下面的表中给出了一些例子

函数表示曲率单调性
sum(x) ∑ i x i \sum_ix_i ixi仿射非递减
abs(x)$x$
log(x) l o g ( x ) log(x) log(x)凹函数非递减
sqrt(x) x \sqrt{x} x 凹函数非递减

遵循凸分析的标准做法,当参数在定义域外时,凸函数被解释为 + ∞ +\infty + ,而凹函数被解释为 − ∞ -\infty 。换句话说就是凸函数和凹函数被解释为他们的极限值。

CVX可以自动将函数的参数约束到函数的定义域中。举个例子,如果我们在CVX标准中构建一个 s q r t ( x + 1 ) sqrt(x+1) sqrt(x+1) ,其中 x 为变量,则 x 会被自动地约束为大于等于 − 1 -1 1 。而不需要额外地添加一个约束 x>=-1 来强调。
一个函数的单调性被扩展地解释,换句话说,单调的解释包括了在定义域外的参数值。举例说明, sqrt(x) 被定为非递减的是因为对于参数 x 的负值,函数值被定义为 − ∞ -\infty ,在参数等于零处函数值跳至 0 0 0 ,此后随着参数值为正,函数值增加。

如果只是在定义域的一部分上,CVX将不会考虑函数是凸的还是凹的,即使参数被约束在了这些部分的其中一个上。举例说明,考虑函数 1 / x 1/x 1/x 。对于 x > 0 x>0 x>0 ,该函数为凸,对于 x < 0 x<0 x<0 ,该函数为凹。但是您仍无法在CVX中写入 1/x (除非 x 为常数),即使您已经提出了例如 x>=1 的约束,这个约束保证函数 1 / x 1/x 1/x 的参数 x x x 在函数为凸的部分上。您可以使用CVX函数 inv_pos(x) ,其被定义为 1 / x , x > = 0 1/x,\quad x>=0 1/x,x>=0 ∞ \infty ,对应的是函数 1 / x 1/x 1/x 的凸部分。CVX将该函数识别为凸且非递增的函数。在CVX中,您可以使用 -inv_pos(-x) 来表示函数 1 / x 1/x 1/x 的凹部分,其中 x x x 为负,而且该函数可以被CVX正确地识别为凹且非递增的函数。

对于带有多个参数的函数,曲率被联合考虑,但是单调性还是针对一个个参数分别考虑。举个例子,函数 quad_over_lin(x,y)
KaTeX parse error: Expected '}', got '_' at position 16: f_{\text {quad_̲over_lin }}(x, …
该函数是对于 x x x y y y 是联合凸的,但是仅对于参数 y y y 是单调的(非递增)。

有一些函数仅在参数定义域的子集上为凸、凹或者是仿射的。举个例子,函数 norm(x,p) ,其中 p ≥ 1 p\geq 1 p1 时函数对于第一个参数 x 为凸。无论什么时候该函数被用在CVX标准中,剩余的参数即 p p p 都会被看作是一个常量,或者CVX会抛出一个错误信息。这样的参数(arguments)对应于数学术语中的函数的参数(parameters)4。例如,
f p ( x ) : R n → R , f p ( x ) ≜ ∣ ∣ x ∣ ∣ p f_p(x):\mathbf{R}^n\rightarrow \mathbf{R},\qquad f_p(x)\triangleq||x||_p fp(x):RnR,fp(x)xp
由此看来,参考上下文上面的参数(arguments) p p p 被解释为参数(parameters)更加合适。此后,无论我们说一个CVX参数是否为凸,凹或者仿射的,我们都假设参数(parameters)是已知的而且是合适的常量。

5.6、复合

凸分析的一个基本的规则就是在一个具有仿射映射的复合下,函数的凸性质是封闭的。这也是DCP规则的一部分:

  • 一个凸、凹或者仿射函数可以接受一个仿射表达式(可以被兼容的尺度)作为一个参数。对应的结果依旧是凸、凹或者仿射函数。

举个例子,考虑函数 square(x) ,该函数存在于CVX原子库中。该函数对其参数进行了平方操作,即 x.*x (对于数组参数,函数独立地对每一个元素平方)。当其参数为实数时,该函数在CVX原子库中被视为凸函数。如果 x 为是一个维度为 n n n 的实数变量, a 是一个 n n n 维的常数向量而且 b 为一个常数,则表达式

square(a'*x+b)

就可以被CVX接受,并会被视为凸函数。

上述的仿射复合规则是我们下面描述的更为复杂的复合规则的一个特例。我们考虑一个已知其曲率和单调性的、可以接受多个参数的函数。对于凸函数,规则如下:

  • 如果函数在一个参数上为非递减的,则这个参数必须是凸的。
  • 如果函数在一个参数上为非递增的,则这个参数必须是凹的。
  • 如果函数在一个参数上为既不是非增减的也不是非递增的,则这个参数必须是仿射的。

如果函数的每一个参数都满足上述的规则,则CVX可以接受这个表达式,而且将其分类为凸函数。回想一下,一个常量或者是仿射表达式既凹又凸,因此任何参数都可以是仿射的,包括特殊的例子,常量。

相应的凹函数的规则如下:

  • 如果函数在一个参数上为非递减的,则这个参数必须是凹的。
  • 如果函数在一个参数上为非递增的,则这个参数必须是凸的。
  • 如果函数在一个参数上为既不是非增减的也不是非递增的,则这个参数必须是仿射的。

在这个例子中,表达式可以被CVX接受并分类为凹函数。

更多复合规则的背景知识,可以查阅 Convex Optimization,3.2.4 节。事实上,除了标量二次型表达式,整个DCP规则集都可以被认为是上述六条规则的特例。

让我们用用一些例子来测试下。最大化函数在每个参数上都是凸的且非递减的,因此它可以接受任何凸表达式作为参数。举个例子,如果 x 为一个向量变量,则

max(abs(x))

遵守六条复合规则的第一条,因此可以被CVX接受,且分类为凸函数。另一个例子,考虑求和函数,这是一个既凹又凸的函数(因为它是仿射的),所以在每一个参数上都是非递减的。因此表达式

sum(square(x))
sum(sqrt(x))

都可以被CVX是被并分类为凸函数和凹函数。第一个函数遵守凸函数的第一条规则,第二个遵守凹函数的第一条规则。

大多数了解基本凸分析的人都喜欢根据更具体的规则来思考这些示例:凸函数的最大化是凸函数,凸函数(凹函数)的求和依旧是凸函数(凹函数)。但是这些只是上述通用复合规则的特例。一些满足通用复合规则的其他众所周知的基本规则有:

  • 凸函数(凹函数)的非负数倍为凸(凹)。
  • 凸函数(凹函数)的非正数倍为凹(凸)。

现在我们往深处考虑更为复杂的例子。假设 x 为一个向量变量,且 Abf 为合适维度的常量。CVX可以将下列函数识别为凹函数。

sqrt(f'*x)+min(4,1.3-norm(A*x-b))

考虑 sqrt(f'*x) 项。CVX将 sqrt 识别为凹函数且 f'*x 为仿射函数,因此该项为凹函数。现在考虑第二项 min(4,1.3-norm(A*x-b))。CVX将 min 识别为凹函数且非递减的,因此它可以接受凹函数作为参数。CVX识别 1.3-norm(A*x-b) 为凹函数,因为这是一个常量和一个凸函数的差值。因此CVX将第二项识别为凹函数,因此它是两个凹函数之和。

复合规则对于正确分类来说是充分不必要条件,所以一些实际上是凸的或者是凹的表达式并不能满足这些规则,所以会被CVX拒绝。举个例子,如果 x 是一个向量变量,则表达式

sqrt(sum(square(x)))

会被CVX拒绝,因为没有规则规定了一个非递减的凹函数可以将凸函数作为参数。当然,这个例子可以被简单地解决,利用 norm(x) 代替,因为 norm 可以被CVX识别为凸函数。

5.7、非线性复合中的单调性

单调性是非线性复合规则的一个关键方面。存在着一些结论并不是那么明显,在这里我们通过例子来说明。考虑表达式

square(square(x)+1)

其中 x 为标量变量。这个表达式事实上是凸的,因为 ( x 2 + 1 ) 2 = x 4 + 2 x 2 + 1 (x^2+1)^2=x^4+2x^2+1 (x2+1)2=x4+2x2+1 是凸的。但是CVX仍会拒绝这个表达式,因为外部的 square 不接受一个凸函数作为参数。事实上,一个凸函数的平方并不一定是凸的,举例: ( x 2 − 1 ) 2 = x 4 − 2 x 2 + 1 (x^2-1)^2=x^4-2x^2+1 (x21)2=x42x2+1 并不是凸的。

有两种方法可以修正上述的表达式使其遵守规则集。一种是将其写作 x^4+2*x^2+1,这样CVX就可以将其石碑为凸函数,因为CVX允许正偶数次方使用 ^ 操作符(注意,相同的操作在函数 ( x 2 − 1 ) 2 (x^2-1)^2 (x21)2 上是不行的,因为其第二项是一个凹函数)。‘

另一种方法是利用 square_pos 替代外面的函数,square_pos 是在CVX原子库中的,其表示函数 ( x + ) 2 (x_+)^2 (x+)2 ,其中 x + = m a x { 0 , x } x_+=max\{0,x\} x+=max{0,x}。很明显,当参数为负数时,squaresquare_pos 是相反的两面。但是 square_pos 是非递增的,因此它可以接受一个凸的参数。所以,表达式

square_pos(square(x)+1)

数学上等效于上述被CVX拒绝的版本(以为外部函数的参数总是正的),但是 square_pos 满足DCP规则集,因此可以被CVX接受。

这就是位为什么CVX原子库中的一些函数采用两种形式的原因,一种自然形式和一种以一种单调性的方法修正的形式,因此可以使用复合规则。其他的单调扩展的函数包括 sum_square_posquad_pos_over_lin。如果您自己在执行一个新的函数时,您可能要去考虑函数的扩展单调性,这对您有所帮助。

5.8、标量二次型

按照单纯的DCP格式,DCP规则集甚至禁止使用简单的二次表达式例如 x*x(假设 x 为标量)。出于实际原因,我们选择在规则集中设置例外,来允许识别某些特定的二次形式,这些形式直接映射到CVX原子库中的某些凸二次函数(或它们的凹负形式):

原形式CVX形式
x.*xsquare(x) (实数 x x x
conj(x).*xsquare_abs(x)
y'*ysum_square_abs(y)
(A*x-b)'*Q*(A*x-b)quad_form(A*x-b,Q)

CVX将探测例如上述的二次表达式,并确定它们是否为凸或者是凹。如果是,将他们转化为例如右边命令的等效函数。

CVX测试每个仿射表达式的乘积和每个仿射表达式的二次型来检查它的凸性质,而例如仿射表达式乘积的求和,CVX将不会检查。举例说明,给定标量变量 xy,表达式

x^2+2*x*y+y^2

在CVX是错误的,因为第二项 2*x*y 既不是凸的也不是凹的。但是等效的表达式

(x+y)^2
(x+y)*(x+y)

则将会被CVX接受。

当存在标量二次形式时,CVX实际上对其完成了平方操作,因此这种形式不需要是对称的。举例说明,如果 z 是一个向量变量,a,b 是常量,且 Q 为正定矩阵,则

(z+a)'*Q*(z+b)

将会被CVX识别为凸函数。只要一个二次形式被CVX认证,它就可以以一种正常的凸或者凹的表达式的形式自由地被使用,正如 Expression rules(5.4、表达式规则)所描述的那样。

相比于传统的数学规划框架,二次形式实际上在标准凸规划中应该尽可能地少用。在数学规划框架中一个二次形式通常可以平滑地替代人们真正希望使用的非光滑形式。在CVX中,很少需要这样的替代,因为CVX支持非光滑函数。例如,约束

sum((A*x-b).^2)<=1

可以使用欧几里得范数等效替换

norm(A*x-b)<=1

有现代化的求解器的加持,第二种形式可以被更广泛用一个二阶锥约束来表示,所以第二种形式实际上效率更高。事实上,在我们的实验中,非二次形式通常可以被更准确地处理。所以,鉴于标准凸规划提供的新功能,我们强烈鼓励您重新评估您模型中二次形式的使用。


CVX常用凸函数写法

内置函数

rel_entr

标量相对熵(Scalar relative enrtopy),rel_entr(x,y)=x.*log(x/y) 为凸函数,公式表示如下:
f ( x , y ) = x log ⁡ ( x y ) f(x,y)=x\log(\frac{x}{y}) f(x,y)=xlog(yx)

norms

范数函数,norms(x,p,dim) 可以按照维度进行范数的计算。MATLAb中的norm得到的是一个标量,想要每行都计算范数,就需要用vecnorm函数(可以参考Matlab技巧)。当然,也可以写循环来操作,但是很慢,向量化还是很快的。

非内置函数

log ⁡ ( 1 + 1 x ) \log(1+\frac{1}{x}) log(1+x1)

命令:rel_entr(x+1,x)+rel_entr(x,x+1)

推导:
( x + 1 ) log ⁡ ( x + 1 x ) + x log ⁡ ( x x + 1 ) = log ⁡ ( x + 1 x ) + x log ⁡ ( x + 1 x ) + x log ⁡ ( x x + 1 ) = log ⁡ ( 1 + 1 x ) + x log ⁡ ( x + 1 x × x x + 1 ) = log ⁡ ( 1 + 1 x ) + x log ⁡ ( 1 ) = log ⁡ ( 1 + 1 x ) \begin{array}{ll} &(x+1)\log(\frac{x+1}{x})+x\log(\frac{x}{x+1})\\ =&\log(\frac{x+1}{x})+x\log(\frac{x+1}{x})+x\log(\frac{x}{x+1})\\ =&\log(1+\frac{1}{x})+x\log(\frac{x+1}{x}\times\frac{x}{x+1})\\ =&\log(1+\frac{1}{x})+x\log(1)\\ =&\log(1+\frac{1}{x}) \end{array} ====(x+1)log(xx+1)+xlog(x+1x)log(xx+1)+xlog(xx+1)+xlog(x+1x)log(1+x1)+xlog(xx+1×x+1x)log(1+x1)+xlog(1)log(1+x1)

x log ⁡ ( 1 + x y ) x\log(1+\frac{x}{y}) xlog(1+yx)

命令:rel_entr(x+y,y)+rel_entr(y,x+y)
推导:
( x + y ) log ⁡ ( x + y y ) + y log ⁡ ( y x + y ) = x log ⁡ ( x + y y ) + y log ⁡ ( x + y y ) + y log ⁡ ( y x + y ) = x log ⁡ ( 1 + x y ) + y log ⁡ ( x + y y × y x + y ) = x log ⁡ ( 1 + x y ) + y log ⁡ ( 1 ) = x log ⁡ ( 1 + x y ) \begin{array}{ll} &(x+y)\log(\frac{x+y}{y})+y\log(\frac{y}{x+y})\\ =&x\log(\frac{x+y}{y})+y\log(\frac{x+y}{y})+y\log(\frac{y}{x+y})\\ =&x\log(1+\frac{x}{y})+y\log(\frac{x+y}{y}\times\frac{y}{x+y})\\ =&x\log(1+\frac{x}{y})+y\log(1)\\ =&x\log(1+\frac{x}{y}) \end{array} ====(x+y)log(yx+y)+ylog(x+yy)xlog(yx+y)+ylog(yx+y)+ylog(x+yy)xlog(1+yx)+ylog(yx+y×x+yy)xlog(1+yx)+ylog(1)xlog(1+yx)


  1. M. Grant and S. Boyd and Y. Ye. Disciplined convex programming. In Global Optimization: from Theory to Implementation, Nonconvex Optimization and Its Applications, L. Liberti and N. Maculan, eds., Springer, 2006. http://stanford.edu/~boyd/disc_cvx_prog.html ↩︎

  2. M. Grant. Disciplined Convex Programming. Ph.D. thesis, Information Systems Laboratory, Department of Electrical Engineering, Stanford University, 2004. http://stanford.edu/~boyd/disc_cvx_prog.html ↩︎

  3. 原文写作 atom,这里译作原子。 ↩︎

  4. 本说明文档中,涉及到了两个参数的翻译问题,一个是 arguments,一个是 parameters。两者都是参数的意思,不过后者更偏向于数学术语。本文中凡是没有在后面括号中注明的都被视为 arguments↩︎

  • 19
    点赞
  • 79
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值