Yalmip入门教程(2)

您所在的位置:网站首页 cplex二维数组变量 Yalmip入门教程(2)

Yalmip入门教程(2)

2024-01-21 16:40| 来源: 网络整理| 查看: 265

博客中所有内容均来源于自己学习过程中积累的经验以及对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));

        两种定义方式是等价的。

8ac2072775a64c9bbce70d17644dce3f.png

        使用cell格式定义多维变量比较方便,但缺点是无法使用一些常用的数学运算函数,例如下面的代码将会报错:

M = sdpvar(20*ones(5,1),80*ones(5,1)); N = sdpvar(20*ones(5,1),80*ones(5,1)); M + N

096ce21502c141de9aa63806026de818.png

        更高维度的变量也可以采用相同的方式进行定义,例如下面的代码就是定义了一个5×5×10×20的变量L:

L = sdpvar(5,5,10,20);

        需要主义的是,因为变量L前两个维度是相同的,按照之前的说明,前两个维度始终是对称的,为了定义一个不对称的变量L,也需要添加参数'full':

L = sdpvar(5,5,10,20,'full');

        这样就可以保证L的前两个维度不是对称的。

1.2 binvar

        binvar和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