Yalmip使用教程(6)-将约束条件写成矩阵形式

这篇具有很好参考价值的文章主要介绍了Yalmip使用教程(6)-将约束条件写成矩阵形式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

        博客中所有内容均来源于自己学习过程中积累的经验以及对yalmip官方文档的翻译:https://yalmip.github.io/tutorials/

        这篇博客将详细介绍如何借助yalmip工具箱将约束条件写成矩阵形式。

1.相关函数介绍

1.1 depends和getvariables函数

        depends和getvariables函数都可用于求出sdpvar类型变量在Yalmip工具箱内部的索引(可以简单理解为该变量是第几个使用的变量,比如索引为3,表示为第3个使用的变量),两个函数的使用语法分别为:

k = depends(x)
k = getvariables(x)

        其中,x为sdpvar类型变量,k为变量的索引。

        对于线性变量来说,两者的返回结果完全相同,例如下面的代码:

        例1:对线性变量使用depends和getvariables函数

yalmip('clear')
x = sdpvar(1);
y = sdpvar(2,3);
x_index1 = getvariables(x)
y_index1 = getvariables(y)
x_index2 = depends(x)
y_index2 = depends(y)

        运行结果为:

Yalmip使用教程(6)-将约束条件写成矩阵形式,Yalmip工具箱使用教程,matlab,yalmip,线性规划,线性代数

        两个函数的区别在于非线性的变量。对于非线性变量,depends函数只会返回其中涉及的线性变量,而getvariables函数则将直接返回非线性变量的索引。下面是一个例子:

        例2:对非线性变量使用depends和getvariables函数

yalmip('clear')
x = sdpvar(1);
z = x^2;
z_index1 = getvariables(z)
z_index2 = depends(z)

        运行结果为:

Yalmip使用教程(6)-将约束条件写成矩阵形式,Yalmip工具箱使用教程,matlab,yalmip,线性规划,线性代数

        上面的代码中涉及到1个线性变量x和一个非线性变量z,其中x的索引为1,z的索引为2。从结果中可以看到,getvariables函数将直接返回非线性变量z的索引,而depends函数只会输出非线性变量z中涉及到的线性变量x的索引。

1.2 getbase函数

        getbase函数将返回sdpvar类型变量中的full basis(我将其理解为变量的系数矩阵),使用语法如下:

B = getbase(x);

        其中x表示sdpvar类型的变量,B表示所涉及基本变量(也就是Yalmip内部中分配了索引号的1维变量)的系数矩阵。光看这个函数的文字描述也是比较难理解它的作用,我们还是结合一个实例进行讲解。

例3:

yalmip('clear')
x = sdpvar(1);
y = sdpvar(1);
z = [1;2*x;3*y;4*x+5*y + 6*x^2];
full(getbase(z))

        运行结果为:

ans =
     1     0     0     0
     0     2     0     0
     0     0     3     0
     0     4     5     6

        首先我们可以知道,变量z为4×1的矩阵形式,其中共涉及3个基本变量,x,y和x²。那么我们可以把变量z用这三个基本变量进行表达,也就是:

Yalmip使用教程(6)-将约束条件写成矩阵形式,Yalmip工具箱使用教程,matlab,yalmip,线性规划,线性代数

        对于上面的例子来说:

Yalmip使用教程(6)-将约束条件写成矩阵形式,Yalmip工具箱使用教程,matlab,yalmip,线性规划,线性代数

        也就是系数矩阵为:

Yalmip使用教程(6)-将约束条件写成矩阵形式,Yalmip工具箱使用教程,matlab,yalmip,线性规划,线性代数

从分析结果可知,getbase函数所返回的就是所涉及基本变量的系数矩阵。

1.3 getbasematrix函数

        getbasematrix函数将返回sdpvar类型变量中指定基本变量的系数矩阵,使用语法如下:

B = getbasematrix(x,index)

        其中x表示sdpvar类型的变量,index表示指定的基本变量索引,B表示所涉及基本变量(也就是Yalmip内部中分配了索引号的1维变量)的系数矩阵。

        如果理解了getbase函数的用法,那么getbasematrix函数也就不难理解,无非是将返回所有涉及的基本变量系数矩阵变成了指定基本变量的系数矩阵。下面是一个示例:

        例4:

yalmip('clear')
x = sdpvar(1);
y = sdpvar(1);
z = [1;2*x;3*y;4*x+5*y + 6*x^2];
xB = full(getbasematrix(z,1))
yB = full(getbasematrix(z,2))

        运行结果如下:

Yalmip使用教程(6)-将约束条件写成矩阵形式,Yalmip工具箱使用教程,matlab,yalmip,线性规划,线性代数Yalmip使用教程(6)-将约束条件写成矩阵形式,Yalmip工具箱使用教程,matlab,yalmip,线性规划,线性代数

1.4 recover函数

        recover函数通过索引来创建变量,标准语法如下:

x = recover(index)

        其中index表示变量索引,x表示所创建的变量。

        从本质上来讲,recover和getvariables函数是一个逆运算,即recover函数的输入是getvariables函数的输出,recover函数的输出是getvariables函数的输入。下面的代码说明了这一点:

yalmip('clear')
x = sdpvar(1);
assign(x,2);
x_index = getvariables(x);
x1 = recover(x_index);
x_value = value(x)
x1_value = value(x1)

        运行结果如下:

Yalmip使用教程(6)-将约束条件写成矩阵形式,Yalmip工具箱使用教程,matlab,yalmip,线性规划,线性代数

        从结果上来看,我们首先使用getvariables函数获取了变量x的索引,再利用recover函数,通过索引得到变量x1。由于我们提前使用了assign函数给变量x赋值为2,因此变量x的取值为2。但我们并没有给变量x1赋初值,但结果显示变量x1的取值也为2,说明变量x和变量x1本质上是同一个变量。也就是说通过recover函数和变量的索引号得到的新变量,和原变量是完全等价的。

1.5 see函数

        see函数在命令行返回sdpvar类型变量中所涉及基本变量的索引、常数矩阵和基本变量的系数矩阵,语法如下:

see(x)

        下面是一个例子:

        例5:

yalmip('clear')
x = sdpvar(1);
y = sdpvar(1);
z = [1;2*x;3*y;4*x+5*y + 6*x^2];
see(z)

        运行结果如下:

Yalmip使用教程(6)-将约束条件写成矩阵形式,Yalmip工具箱使用教程,matlab,yalmip,线性规划,线性代数Yalmip使用教程(6)-将约束条件写成矩阵形式,Yalmip工具箱使用教程,matlab,yalmip,线性规划,线性代数Yalmip使用教程(6)-将约束条件写成矩阵形式,Yalmip工具箱使用教程,matlab,yalmip,线性规划,线性代数Yalmip使用教程(6)-将约束条件写成矩阵形式,Yalmip工具箱使用教程,matlab,yalmip,线性规划,线性代数Yalmip使用教程(6)-将约束条件写成矩阵形式,Yalmip工具箱使用教程,matlab,yalmip,线性规划,线性代数

该结果和getvariables、getbase等函数返回结果的含义相同,此处不再赘述。

2.将优化问题改写为矩阵形式

        我们知道,在线性规划中一个变量对应优化问题中的一列,一个约束条件对应优化问题中的一行。对于有N个变量和M条约束的线性规划问题,那约束矩阵就有M行N列。我们可以将每一条约束都改写成≤0或≥0的形式,并使用一个中间变量表示这条约束,再通过上述函数确定中间变量所涉及的基本变量索引与系数矩阵,就可以间接表示出约束矩阵,进一步将优化问题改写为矩阵形式。

        下面通过1个实际例子进行说明。

        例6:

Yalmip使用教程(6)-将约束条件写成矩阵形式,Yalmip工具箱使用教程,matlab,yalmip,线性规划,线性代数

        假设我们想把上面的优化问题写成紧凑的矩阵形式:

Yalmip使用教程(6)-将约束条件写成矩阵形式,Yalmip工具箱使用教程,matlab,yalmip,线性规划,线性代数

        求矩阵A、b、c,然后使用矩阵形式求解优化问题的代码如下:

clc
clear
close all
warning off
yalmip('clear')
 
%% 决策变量
sdpvar x1 x2
 
%% 求系数矩阵
obj0 = x1 + 2*x2;
 
z = [-2*x1 + 3*x2 - 12 ;
    x1 + x2 - 14;
    -3*x1 + x2 + 3;
    3*x1 + x2 - 30];
 
M1 = full(getbase(z));
M2 = full(getbase(obj0));
index = depends([x1 x2]);
A = M1(:,index + 1);
b = -M1(:,1);
c = M2(index + 1)';
 
%% 矩阵形式的目标函数
x = [x1;x2];
obj = c'*x;
C = [A*x <= b , x >= 0];
 
%% 求解优化问题
ops = sdpsettings('verbose', 3, 'solver', 'gurobi');
sol = optimize(C , -obj ,ops);
 
%% 判断求解是否成功
if sol.problem == 0
    disp('求解成功!!!');
    x = value(x)
else
    disp(['求解失败,原因为',sol.info]);
end

        运行结果如下:

Yalmip使用教程(6)-将约束条件写成矩阵形式,Yalmip工具箱使用教程,matlab,yalmip,线性规划,线性代数

        上面的例子是一个简单的线性规划问题,直接写出约束矩阵也很容易,采用Yalmip函数反而多此一举。但是实际问题通常涉及0-1变量,多重下标,需要用循环语句表达约束等等,手动写系数矩阵非常麻烦且容易出错,借助Yalmip的相关函数将会简单很多。

3.测试题

3.1测试1

        将下列优化问题建模为混合整数线性规划问题,并利用Yalmip函数改写为矩阵形式:

Yalmip使用教程(6)-将约束条件写成矩阵形式,Yalmip工具箱使用教程,matlab,yalmip,线性规划,线性代数

3.2测试2

Yalmip使用教程(6)-将约束条件写成矩阵形式,Yalmip工具箱使用教程,matlab,yalmip,线性规划,线性代数

        其中数据为:

Yalmip使用教程(6)-将约束条件写成矩阵形式,Yalmip工具箱使用教程,matlab,yalmip,线性规划,线性代数

Yalmip使用教程(6)-将约束条件写成矩阵形式,Yalmip工具箱使用教程,matlab,yalmip,线性规划,线性代数

        请将上述优化问题改写为下面的矩阵形式,并使用矩阵形式进行求解:

Yalmip使用教程(6)-将约束条件写成矩阵形式,Yalmip工具箱使用教程,matlab,yalmip,线性规划,线性代数

3.3测试3

        将旅行商问题(TravelingSalesmanProblem,TSP)的0-1规划模型改写成矩阵形式并进行求解:

Yalmip使用教程(6)-将约束条件写成矩阵形式,Yalmip工具箱使用教程,matlab,yalmip,线性规划,线性代数

3.4测试题参考答案

        第六章测试题的参考答案可以从下面的链接中获取:文章来源地址https://www.toymoban.com/news/detail-716175.html

到了这里,关于Yalmip使用教程(6)-将约束条件写成矩阵形式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 使用Matlab机器人工具箱完成四元数到旋转矩阵的转换,附程序

    在进行机械臂操作或写论文时,经常需要进行四元数、旋转矩阵、欧拉角等的转换。 此时,我们利用matlab里的机器人工具箱(Peter 开发)内置的函数就可完成,具体程序如下: 环境:Matlab2020b+robotics toolbox(安装方法在前几期文章里有) 此时运行matlab可得以下结果: 重要注

    2024年02月13日
    浏览(56)
  • 如何获取不同分区模板的基因表达矩阵,abagen: Allen 大脑图谱遗传数据工具箱的使用笔记

    基因表达从根本上塑造了人类大脑的结构和功能结构。像Allen人脑图谱这样的开放获取转录组数据集提供了前所未有的能力来检查这些机制。abagen工具箱,这是一个用于处理转录组学数据的开放获取软件包,并使用它来检查方法可变性如何影响使用Allen人脑图谱的研究结果。

    2024年02月08日
    浏览(157)
  • MATLAB - 使用 TOPP-RA 求解器生成带约束条件的时间最优轨迹

      本例演示如何生成满足速度和加速度限制的轨迹。该示例使用了 contopptraj 函数,该函数使用可达性分析 (RA) 求解受约束的时间最优路径参数化 (TOPP) 轨迹。   本例解决的是 TOPP 问题,这是一个机器人问题,其目标是在系统约束条件下找到最快的路径。在本例中,您将使用

    2024年01月18日
    浏览(47)
  • ImageJ | 免疫组织化学(IHC)图像分析工具箱 | 下载地址 | 安装教程 | 使用教程

    安装IHC 工具箱,需要安装ImageJ 1.40或更高版本。你可以使用小编提供的最新版本的ImageJ。(截至发文前) :::block-1 ImageJ 软件下载 ImageJ for Windows 链接:https://pan.baidu.com/s/1v9pXegaU8Lps0CaT3ZYx2A?pwd=yp23 提取码:yp23 ImageJ for MacOS(Intel) 链接:https://pan.baidu.com/s/1LyBa-fWtfTVLo7OWTF84HA?pwd

    2024年01月17日
    浏览(76)
  • ChatGPT4 的体验 一站式 AI工具箱 -—Poe(使用教程)

    界面介绍: 是一个基于机器学习的聊天机器人,能够识别自然语言并做出智能回答。Sage通过自然语言处理和对话管理技术来实现对话的自然流畅和个性化,同时支持多种语言。Sage较为擅长语言相关的工作,例如创作文章,做摘要等。 是由开放人工智能(OpenAI)公司开发的一

    2023年04月22日
    浏览(48)
  • ChatGP4 的体验 一站式 AI工具箱 -—Poe(使用教程)

    界面介绍: 是一个基于机器学习的聊天机器人,能够识别自然语言并做出智能回答。Sage通过自然语言处理和对话管理技术来实现对话的自然流畅和个性化,同时支持多种语言。Sage较为擅长语言相关的工作,例如创作文章,做摘要等。 是由开放人工智能(OpenAI)公司开发的一

    2024年02月11日
    浏览(106)
  • 基于MATLAB的最小二乘法拟合与拟合工具箱使用教程(附完整代码与算法)

    给定一组数据满足某一函数模型,其中a为待定系数向量。 那么,最小二乘曲线拟合的目标就是:求出一组待定系数的值,使得以下表达式子最小: 在MATLAB中格式如下: 由以下MATLAB代码生成一组数据: 该组数据满足y(x),求出待定系数,使得目标函数的值为最小。 解: MATL

    2024年01月17日
    浏览(57)
  • Yalmip入门教程(1)-入门学习

            博客中所有内容均来源于自己学习过程中积累的经验以及对yalmip官方文档的翻译:YALMIP         Yalmip的作者是Johan Löfberg,是由Matlab平台编程实现的一个免费开源数学优化工具箱,在官网上就可以下载。官方下载链接如下: Download - YALMIP         下载时可以选

    2024年02月15日
    浏览(50)
  • Oracle删除约束条件不会锁表

    最近有个需求要删除一个Oracle约束条件,但是由于不知道会不会锁表,所以测试了一下 使用python写了段代码验证下 程序一直执行,删除约束条件没有任何压力 技术无止境

    2024年02月16日
    浏览(42)
  • HNU-离散数学-工具箱系列3-关系矩阵法求传递闭包

    用于解决这类问题: 举例一、  举例二、(求传递闭包)   代码如下:

    2024年02月11日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包