Yalmip入门教程(2)-变量定义和操作

news2024/7/7 16:53:20

博客中所有内容均来源于自己学习过程中积累的经验以及对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 <= w*M , x + y -20 <= (1-w)*M];

        当w=1时,约束1成立,当w=0时,约束2成立,这样就通过0-1变量完成了约束条件中逻辑“或”的表达。

例2:

变量x,y满足下面3个不等式其中2个:

4x + 3y ≤ 50,x + y ≤ 20,3x+2y <= 35

        对于例2的约束条件,可以通过引入一个3维0-1变量w和一个足够大的正数M进行建模,建模方式如下:

sdpvar x y

w = binvar(1,3);

M = 1e5;

Constraints = [

    4*x + 3*y - 50 <= w(1)*M ,...

    x + y -20 <= w(2)*M , ...

    3*x +2*y -35 <= w(3)*M , ...

    sum(w) == 2];

        当w1=1时,约束1成立,当w2=1时,约束2成立,当w3=1时,约束3成立,同时令w1+w2+w3=2,这样就通过0-1变量完成了3个约束条件中必须满足其中2个的表达。

        通过0-1变量,还可以实现分段函数、分类讨论等表达,此处不再赘述。

        另外,也可以先把变量定义为连续型,然后通过binary函数约束为0-1变量,具体用法如下:

x = sdpvar(2,3);

Constraints = [binary(x)];

1.3 intvar

        intvar和sdpvar的语法完全一样,唯一不同的就是使用intvar定义的变量是整数变量,也就是取值只能为整数。在实际的优化问题中很多变量都可以建模为整数变量,例如人数、商品件数等。

1.4 semivar

        semivar和sdpvar的语法完全一样,唯一不同的就是使用semivar定义的变量是半连续变量,也就是取值要么为0,要么为某个区间内的连续变量。但使用semivar时,可能会出现求解器不支持的情况。按上文的介绍,这种变量可以理解为逻辑“或”的关系,可以通过引入0-1变量使用大M法进行建模。为了避免求解器不支持导致模型无法求解,所以semivar很少使用,通常都会应用大M法对半连续变量进行建模。

2.决策变量相关函数

        在这一节的介绍之前,首先说明一点,sdpvar时Yamlip中的一个函数,用于定义决策变量,定义的决策变量在Matlab中为sdpvar类型。而binvar、intvar等函数定义的决策变量,本质上就是带有约束的sdpvar类型变量。所以,下面介绍的决策变量相关函数适用于所有sdpvar类型的变量,而不仅仅是通过sdpvar函数定义的变量。

2.1常见的数学运算

        Matlab中几乎所有的数学运算都可应用于sdpvar类型的变量,最常用的数学运算函数以及符号如表2所示:

表2 sdpvar类型变量常用的数学运算

数学运算

含义

用法

+

加法

x+y

-

减法

x-y

*

乘法,可用于标量和矩阵相乘以及矩阵乘法

x*y

.*

用于维度相同的矩阵,表示对应元素相乘

x.*y

abs

求绝对值

y = abs(x)

det

求行列式,仅用于方阵

y = det(x)

exp

指数函数

y = exp(x)

floor

向下取整

y = floor(A)

log,log2,log10

对数函数

y = log(A)

y = log2(A)

y = log10(A)

min/max

求最大值/最小值

y = min(x)

y = min(x,z)

y = min(x,[],dim)

[y,loc]= min(x,[],dim)

norm

求1范数、2范数、∞范数

y = norm(x)

y = norm(x,1)

y = norm(x,2)

y = norm(x,inf)

pnorm

求p范数

y = pnorm(x,q/r);

y = pnorm(x,p,'power')

2.2 value函数

        value函数是最常用的决策变量处理函数之一,可以在优化问题求解成功之后,提取决策变量的取值,其语法如下:

Y = value(X)

例如,下面的代码就是在求解优化问题后求出决策变量与目标函数的取值:

sdpvar x y

objective = 2*x + 3*y;

Constraints = [x + y >= 2 , 2*x - 3*y <= 9 , x>=0];

optimize(Constraints,objective)

x = value(x)

y = value(y)

objective = value(objective)

运行结果如下:

5f0fa0ef2de94368814cab778f5c3a31.png

   

        优化问题求解成功后,通过使用value函数我们可以知道该线性规划问题的目标函数2x+3y在(3,-1)处取得最小值3。

2.3 sdisplay函数

        sdisplay函数可以用来以符号的形式显示sdpvar变量,其语法如下:

s = sdisplay(p,[digits])

        其中,p为一个sdpvar变量,digits表示四舍五入的位数。例如:

x1 = sdpvar(1,1);

x2 = sdpvar(1,1);

f1 = x1^2 + 5*x2^2;

f2 = 3*x1^3 + x2;

m1 = sdisplay(f1)

m2 = sdisplay(f2)

m3 = sdisplay(f1*f2)

        运行结果为:

0deb8cf9c2f84824a7b7066d72401a1e.png

在调试代码的过程中,合理地应用sdisplay函数可以帮助我们确认目标函数或者约束条件的公式是否书写正确。

2.4 binmodel函数

        binmodel函数通过引入其他变量和约束,将涉及0-1变量和连续变量的多项式表达式转换为线性表达式,其语法如下:

[plin1,...,plinN,F] = binmodel(p1,...,pN,Domain)

其中plin1-plinN表示线性化之后的表达式,F表示相应的约束条件,p1-pN为初始表达式,Domain为连续变量的取值范围。下面是一个示例代码:

binvar a b

sdpvar x y

[plinear01,plinear02,F0] = binmodel(a^3+b,a*b);

[plinear1,plinear2,F] = binmodel(a^3*x+b*y,a*b*x, -2 <=[x,y] <=2);

        在上述代码中,plinear01对应线性化后的表达式a^3+b,plinear02对应于线性化之后的表达式a*b,F0为可行域,由于原始表达式中不包含连续变量,所以不需要指定取值范围;plinear1对应线性化后的表达式a^3*x+b*y,plinear2对应于线性化之后的表达式a*b*x,F0为可行域,连续变量的取值范围被限定在[-2,2]。

2.5 assign函数

        assign函数用来给sdpvar变量指定一个取值,其语法如下:

assign(X,value)

        例如下面的代码就是将变量x赋值为1

sdpvar x

assign(x,1)

value(x)

运行结果为:

 6fac62fec404486794072469d5a07b30.png

2.6 is函数

        is函数用于检查sdpvar变量是否为某类型的变量,其语法如下:

d = is(x,property)

        当变量x满足属性’property’时,d取值为1,否则取值为0。下面的示例代码时检查变量是否为线性:

x = sdpvar(1,1);

y1 = x*x;

y2 = 2*x;

m1 = is(y1,'linear')

m2 = is(y2,'linear')

        运行结果为:

 d65339d16837420ab8e18b1b716a3f99.png

上面的代码中,变量y1为非线性,因此m1=0,y2为线性,因此m2=1。其他常用的类型如表3所示:

表3 is函数常用的判断类型

属性

含义

'real'

实数

'symmetric'

对称

'hermitian'

自共轭

'scalar'

标量

'linear'

线性

'bilinear'

双线性

'quadratic'

二次型

'integer'

整数

'binary'

0-1变量

2.7 int函数

        int函数使用sdpvar形式返回多项式的积分(注意只能返回多项式的积分,无法实现其他非线性表达式的积分),其语法如下:

F = int(f,x,from,to)

        下面是一个例子:

sdpvar x1 x2 T

p = 4*x1^4 + x1*x2;

m1 = sdisplay(int(p))

m2 = sdisplay(int(p,x2))

m3 = sdisplay(int(p,[x1 x2],[0 0],[1 T]))

m4 = sdisplay(int(p,[x1 x2],[0 0],[1 x2]))

运行结果为:

9a3c9d1f64254032b132f18160440b91.png

上面的结果中,m1展示了对p中包含的所有变量求积分的结果;m2中只对变量x2求积分;m3中同时对变量x1和x2求积分,并指定了积分上下限。

2.8 jacobian函数

        jacobian函数以sdpvar变量形式返回多项式的导数,其语法如下:

J = jacobian(p)

J = jacobian(p,x)

其中,p为初始多项式,x为需要求导数的变量。下面是一个例子:

x1 = sdpvar(1,1);

x2 = sdpvar(1,1);

f = x1^2+5*x2^2;

m1 = sdisplay(jacobian(f))

m2 = sdisplay(jacobian(f,x2))

其运行结果为:

99290cfef81444798507c690b0f0b84a.png

2.9 linearize函数

linearize函数用来求出多项式p(x)在x=value(x)处的切线表达式,其语法如下:

h = linearize(p)

例子:

x = sdpvar(1,1);

f = x^2;

assign(x,1);

m1 = sdisplay(linearize(f))



assign(x,3);

m2 = sdisplay(linearize(f))

运行结果:

2fabd4262a3747089aab2bc9a3df84aa.png

2.10 replace函数

        replace函数用于将一个sdpvar类型变量替换为另一个sdpvar类型变量、表达式或者常数,其语法如下:

newexpression = replace(expression,variable,replacement)

        例如,可以用常数替换表达式中对应的变量:

sdpvar x y a b

p = 1 + x^2 + y;

m1 = replace(p,[x y],[7 8])



p1 = replace(p,[x y],[a^2 b^4]);

m2 = sdisplay(p1)

运行结果为:

 dc84a384e33b4155bda1b244ed0e7738.png

3.测试题

3.1测试1

求如下优化问题的解并将结果在命令行展示

2cb572c67b9d4a82820a7d38d382a4ef.png

3.2测试2

一汽车厂生产小、中、大三种类型的汽车,已知各类型每辆车对钢材、劳动时间的需求,利润以及每月工厂钢材、劳动时间的现有量如表4所示,试制定月生产计划,使工厂的利润最大。

表4 相关数据

小型

中型

大型

现有量

钢材/吨

1.5

3

5

600

劳动时间/小时

280

250

400

60000

利润/万元

2

3

4

3.3测试3

请使用Yalmip工具箱求积分ec0a2598a1d147f0a95d70459d81357c.png的取值。

3.4测试4

请使用Yalmip工具箱求函数981fddc3bea4407792537d2c20ac4088.png在点(-1,f(-1))处的切线方程。 

3.5测试题参考答案

第二章测试题的参考答案可以从下面的链接中获取:

https://download.csdn.net/download/weixin_44209907/88049325

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/767234.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

window10安装telnet

1、打开控制面板 2、点击程序和功能 3、点击启用或关闭Windows功能 4、选中Telnet客户端&#xff0c;然后点击确定&#xff0c;然后就可以使用telnent 主机 端口来查看本地是否能连通该主机的该端口。

Linux系统部署Tomcat详细教程(图文讲解)

前言&#xff1a;本篇博客教大家如何一步一步使用Linux系统去部署自己的Tomcat服务器&#xff0c;每一行代码都是我自己严格执行过的&#xff0c;共分为了8点进行阐述&#xff0c;逻辑清晰&#xff01; 目录 一、安装JDK环境 二、准备Tomcat安装包 三、安装Tomcat 四、配置…

【前端】求职必备知识点1-HTML

文章目录 DOCUTYPE的作用HTML语义化HTML5新特性iframedefer 和 async 标题链接【前端】求职必备知识点1-HTMLhttps://blog.csdn.net/karshey/article/details/131795380 DOCUTYPE的作用 DOCTYPE是document type (文档类型) 的缩写。 是HTML5中一种标准通用标记语言的文档类型…

《TCP IP网络编程》第七章

第七章&#xff1a;优雅的断开套接字的连接 TCP 的断开连接过程比建立连接更重要&#xff0c;因为连接过程中一般不会出现大问题&#xff0c;但是断开过程可能发生预想不到的情况。因此应该准确掌控。所以要掌握半关闭&#xff08;Half-close&#xff09;&#xff0c;才能明确断…

131、仿真-基于51单片机智能电子称HX711报警仿真设计(程序+原理图+PCB图+Proteus仿真+参考论文+元器件清单等)

摘 要 电子秤是将检测与转换技术、计算机技术、信息处理、数字技术等技术综合一体的现代新型称重仪器。它与我们日常生活紧密结合息息相关。 电子称主要以单片机作为中心控制单元&#xff0c;通过称重传感器进行模数转换单元&#xff0c;在配以键盘、显示电路及强大软件来组成…

【手撕C语言基础】递归

(꒪ꇴ꒪ ),hello我是祐言博客主页&#xff1a;C语言基础,Linux基础,软件配置领域博主&#x1f30d;快上&#x1f698;&#xff0c;一起学习&#xff01;送给读者的一句鸡汤&#x1f914;&#xff1a;集中起来的意志可以击穿顽石!作者水平很有限&#xff0c;如果发现错误&#x…

数据结构(王道)——数据结构之 二叉树

一、数据结构之 二叉树概念&#xff1a; 特殊的二叉树结构&#xff1a; 满二叉树完全二叉树 二叉排序树 平衡二叉树 二叉树基本概念总结&#xff1a; 二、二叉树的常用性质&#xff1a; 1、叶子结点比二分支结点多一个

汽车的空气悬架的功能以及发展趋势

空气悬架能实现什么功能以及发展趋势 了解空气悬架之前,首先得快速了解什么是悬架。 教科书说法是: 悬架系统是汽车的车架与车桥或车轮之间的一切传力连接装置的总称。悬架系统基本构成有弹性元件(各类弹簧,缓冲作用);减震元件(减震器,减震作用);导向机构(控制臂等…

技术分享:如何用pytest_addoption切换自动化测试环境?

前言 在目前互联网公司中&#xff0c;都会存在多个测试环境&#xff0c;那么当我们编写的自动化想要在多套测试环境下进行运行时&#xff0c;如何使用&#xff1f; 大多数人想到的可能是通过将我们自动化代码中的地址修改成不同环境。 但是这时候就会增加一些工作量&#xf…

智安网络|移动安全的转型:零信任如何重新定义格局

数字化转型和远程/移动办公的常态化已经成为许多企业的现实。这一转变为企业带来了许多便利&#xff0c;但同时也引入了前所未有的风险&#xff0c;涉及员工的隐私、个人身份和特权访问凭证。尤其是在经济衰退和疫情的持续影响下&#xff0c;许多企业不得不在提高生产力的同时面…

260道网络安全工程师面试题汇总(附答题解析+配套资料)

由于我之前写了不少网络安全技术相关的文章和回答&#xff0c;不少读者朋友知道我是从事网络安全相关的工作&#xff0c;于是经常有人私信问我&#xff1a; 我刚入门网络安全&#xff0c;该怎么学&#xff1f; 想找网络安全工作&#xff0c;应该要怎么进行技术面试准备&…

Linux gdb汇编调试

文章目录 一、示例代码二、gdb汇编指令2.1 step/stepi2.2 next/nexti2.3 info registers2.4 set2.5 x2.6 rip寄存器2.7 rip 寄存器 参考资料 一、示例代码 &#xff08;1&#xff09; #include <stdio.h>int add(int a, int b) {return a b; }int main() {int a 3;in…

Linux安装或者升级cmake,例子为v3.10.2升级到v3.25.0(自己指定版本)

1. 引言 系统: ubuntu 1804 64位点我进入清华源-GCC链接: https://cmake.org/files/v3.25/ 先卸载自己电脑上的cmake。 cmake -version sudo apt-get autoremove cmake2. 下载编译指定版本cmake 可以根据自己的需求下载对应版本的cmake。 cd ~ && mkdir cmake &…

3Ds max图文教程:高精度篮球3D建模

推荐&#xff1a; NSDT场景编辑器助你快速搭建可二次开发的3D应用场景 第 1 步。使用以下设置在顶部视口上创建球体&#xff1a; 第 2 步。将球体转换为可编辑的多边形&#xff1a; 第 3 步。转到 Edge 子对象级别并剪切以下边缘&#xff1a; 第 4 步。选择以下边&#xff0c;然…

农产品后台管理系统(一)——项目总览

后端技术栈 SpringBoot2.xMybatis-plusMysql8.0redisjsoup&#xff08;测试爬取数据&#xff09; 前端技术栈 Vue3EchartsAxios前端组件&#xff1a;element-china-area-data、element-plus 项目概览截图 登录界面 注册界面 农产品发布界面 用户管理界面 用户画像界面 订单…

【JavaEE】Tomcat的安装和使用、创建Mevan项目使用Servlet写一个程序

目录 前言 一、Tomcat的下载和安装 二、写一个简单的Servlet项目 1、创建一个Maven项目 2、引入依赖 3、创建目录 4、编写Servlet代码。 5、打包程序 6、将程序部署到Tomcat上 7、验证程序运行结果 三、在IDEA上安装Smart Tomcat插件 四、Servlet中的一些常见错误 …

欧姆龙plc之间的以太网通讯

捷米特JM-ETH-CP转以太网模块控&#xff0c;用于欧姆龙 CP1L/ CP1E/ CP1H 系列 PLC 的以太网数据采集&#xff0c;非常方便构建生产管理系统。 支持 FINS/UDP、FINS/TCP 以太网协议通信&#xff0c;支持上位机软件&#xff08;组态王、MCGS、力控、KepWare OPC 服务器等&#…

怎么把pdf转换成jpg图片?这几种方法纯干货

怎么把pdf转换成jpg图片&#xff1f;PDF和JPG是两种常见的文件格式&#xff0c;它们各自有自己的应用场景和优势。PDF格式通常用于创建和共享文档&#xff0c;因为它可以保留文档中的格式和布局&#xff0c;而且可以在几乎所有设备上查看。JPG格式通常用于存储和共享图像文件&a…

5款实用的软件,能帮你解决一些工作和生活中的问题

​ 我乐于分享一些有用的软件给大家&#xff0c;让大家的工作更高效。今天&#xff0c;我要向大家推荐五款实用的软件&#xff0c;它们都能帮你解决一些工作和生活中的问题。 桌面整理——蜂窝桌面整理 ​ 蜂窝桌面整理是一个桌面整理软件&#xff0c;可以让你在桌面上创建和…

OpenCV for Python 学习第四天 :通道的获取与合并

上一篇博客&#xff0c;我们学习了如何通过更快的item()和itemset()的方法访问图片&#xff0c;以及了解了图像的兴趣位置的获取方法&#xff0c;那么今天&#xff0c;我们将学习通道的处理方法&#xff0c;通过通道的拆分和合并的实例&#xff0c;让大家更好的了解咱们有关于B…