Yalmip入门教程(2) |
您所在的位置:网站首页 › cplex二维数组变量 › Yalmip入门教程(2) |
博客中所有内容均来源于自己学习过程中积累的经验以及对yalmip官方文档的翻译:https://yalmip.github.io/tutorials/ 1.决策变量的定义 1.1 sdpvar上文简单介绍了sdpvar函数的用法,接下来将对其进行详细介绍。复习一下,sdpvar函数的基本语法如下: x = sdpvar(n) x = sdpvar(n,m) x = sdpvar(n,m,'type') x = sdpvar(n,m,'type','field') x = sdpvar(dim1,dim2,dim3,...,dimn,'type','field') sdpvar x 1.1.1)x = sdpvar(n)该命令用于定义一个n阶的对称变量方阵,当n=1时,也就相当于定义一个标量; 1.1.2)x = sdpvar(n,m)该命令用于定义一个n行m列的变量矩阵,当n=m时,默认该变量矩阵具有对称性,也就是说,如果使用sdpvar定义了方阵x,则x(i,j) = x(j,i),例如,定义一个3行3列决策变量P的语法如下: P = sdpvar(3,3);这时候变量P默认为一个对称矩阵,也就是P(1,2) = P(2,1),P(1,3) = P(3,1),P(2,3) = P(3,2)。 1.1.3)x = sdpvar(n,m,'type')sdpvar函数的第三个参数用于初始化变量的性质,例如需要定义一个不对称的变量P,则需要将第三个参数设置为'full',语法如下: P = sdpvar(3,3,'full');在定义n阶变量方阵时,其他可使用的'type'参数如表1所示: 表1 sdpvar函数中常用的'type'参数 'type'参数 简化表示 含义 'full' 'f' 完整的不对称变量矩阵 'symmetric' 'sy' 对称变量矩阵 'diagonal' / 对角阵 'toeplitz' 't' 对称托普利茨矩阵 'hankel' / 非对称hankel矩阵 'rhankel' / 对称hankel矩阵 'skew' 'sk' 反对称矩阵 'Hermitian' / hermitian矩阵 1.1.4)x = sdpvar(n,m,'type','field')sdpvar函数中的第四个参数'field'可用于定义复数变量矩阵。不输入任何参数时默认是实数变量矩阵,当需要定义复数矩阵时,可以添加参数'complex',形式如下: P = sdpvar(3,3,'full','complex');上面的语句就表示定义了一个3阶不对称的复数变量方阵。 1.1.5)sdpvar x该语句表示定义一个标量x(也可以理解为1行1列的变量),也可以同时定义多个标量,语句如下: sdpvar a b c d e上述语句就表示定义了5个不同的标量a,b,c,d,e。 综上,在Yalmip工具箱中一共有三种不同的方式定义标量,分别如下: a = sdpvar(1); a = sdpvar(1,1); sdpvar a三个语句的作用完全一样,可以按照自身的使用习惯进行选择。对于二维变量,也可以通过这种方式进行定义,但根据官方文档所述,这种方式可能存在bug,建议谨慎使用: sdpvar a(2,2);上述代码表示定义一个2行2列的变量a。 1.1.6)定义多维变量(三维及以上)对于三维以上的变量,Yalmip工具箱可以有两种不同的建模方式(当然还有简单的一种,将多维变量转为低维变量,例如2×3×4的三维变量可以转为2×12的二维变量,也可以转为1×24的一维变量,这里不再赘述),元胞数组和多维sdpvar对象,两种建模方式分别如下: ①定义元胞类型(cell)的sdpvar变量 假设需要定义一个5×20×80的变量M,使用cell定义的方法为: M = cell(1,5); for k = 1:5 M{k} = sdpvar(20,80); end也可以写成: M = sdpvar(20*ones(5,1),80*ones(5,1));两种定义方式是等价的。 使用cell格式定义多维变量比较方便,但缺点是无法使用一些常用的数学运算函数,例如下面的代码将会报错: M = sdpvar(20*ones(5,1),80*ones(5,1)); N = sdpvar(20*ones(5,1),80*ones(5,1)); M + N更高维度的变量也可以采用相同的方式进行定义,例如下面的代码就是定义了一个5×5×10×20的变量L: L = sdpvar(5,5,10,20);需要主义的是,因为变量L前两个维度是相同的,按照之前的说明,前两个维度始终是对称的,为了定义一个不对称的变量L,也需要添加参数'full': L = sdpvar(5,5,10,20,'full');这样就可以保证L的前两个维度不是对称的。 1.2 binvarbinvar和sdpvar的语法完全一样,唯一不同的就是使用binvar定义的变量是0-1变量,也就是取值要么为0,要么为1。在实际的优化问题中很多变量都可以建模为0-1变量,例如仓库选址、配电网的支路状态等。同时,对于约束条件中的逻辑“或”的关系,也可以通过0-1变量进行建模(这实际上是线性规划的知识,我在这里只做简单介绍)。下面举两个例子: 例1:变量x,y满足:4x + 3y ≤ 50 (1) 或x + y ≤ 20 (2) 对于例1的约束条件,可以通过引入一个0-1变量w和一个足够大的正数M进行建模(实际上这就是常说的大M法),建模方式如下: sdpvar x y binvar w M = 1e5; Constraints = [4*x + 3*y - 50 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |