CVX基础

1 cvx_begin和cvx_end

所有的cvx建模必须以cvx_begin开始以cvx_end结束,所有的变量声明,目标函数和约束必须位于这两者之间,cvx_begin命令可以包含多个修饰词。

cvx_begin quiet 禁止求解过程中的屏幕输出

cvx_begin sdp 调用半正定规划

cvx_begin gp 调用几何规划

修饰词可以组合使用

 

 

2 变量

所有的变量必须在使用前以variable(或者variables)命令申明,variable命令包含变量名,可选的纬度列表,一个或者多个关键词提供有关变量内容和结构的额外信息。

variable X                                        %标量

variable Y(20,10)                              %矩阵

variable Z(5,5,5)                               %多维矩阵

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  %厄密共轭常对角矩阵

目前支持的结构关键词还有:

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

指定矩阵关键词同样可以用于多维矩阵,此时将定义多个申明的结构

variable R(10,10,8) hermitian semidefinite%定义8个厄密共轭半正定矩阵

variables 可以同时定义多个变量,但是不能定义复数,整数,结构变量:

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

 

3 目标函数

申明目标函数要求使用minimize或maximize函数,注意调用minimize的目标函数必须是凸的,调用maximize的目标函数必须是凹的。

minimize( norm( x, 1 ) )

maximize( geo_mean( x ) )

如果不指定目标函数,问题将被解释成可行性问题,如果可行性点找到,cvx_optval将设定为0,否则将为+Inf。

 

4 约束条件

CVX支持下列约束类型

相等==,等式左右两边是仿射表达式

小于<=不等式约束,左边表达式是凸的,右边表达式是凹的。

大于>=约束,左边表达式是凹的,右边表达式是凸的。

可以使用链式不等式:如l <= x <= u.

同时不建议使用<或者>

 

5 函数

许多matlab函数如sum,trace,diag,sqrt,max和min均支持CVX

还有一些CVX新函数,可以在Reference guide里面找到

此外,可以自己定义新函数,见Adding new functions to the atomlibrary

 

6 设定集合

可以用==或者来设定集合

X semidefinite(n);

A*X*A’-X B*semidefinite(n)*B’;

cvx_begin

variables x(n) y;

minimize( y );

subject to

{ A*x-b, y } lorentz(m);

cvx_end

 

7 对偶变量

 

8赋值和表达式定义

使用=进行赋值操作

使用ex_pression命令进行定义表达式

 

variable u(9);

express_ion x(10);

x(1) = 1;

for k = 1 : 9,

x(k+1) = sqrt( x(k) + u(k) );

end

 

 

variables x y

expre_ssion z
z = 2 * x - y;
square( z ) <= 3;
quad_over_lin( x, z ) <= 1;

你可能感兴趣的:(CVX基础)