MATLAB 模型预测控制(MPC)控制入门 —— 设计并仿真 MPC 控制器

系列文章目录


文章目录

  • 系列文章目录
  • 前言
  • 一、使用 MPC Designer 设计控制器
    • 1.1 CSTR 模型
    • 1.2 导入被控对象并定义 MPC 结构
    • 1.3 定义输入和输出通道属性
    • 1.4 配置仿真场景
    • 1.5 配置控制器水平线
    • 1.6 定义输入约束条件
    • 1.7 指定控制器调整权重
    • 1.8 消除输出超调
    • 1.9 测试控制器抗干扰能力
    • 1.10 指定浓度输出约束条件
    • 1.11 删除被控对象、控制器和场景
  • 二、使用步骤
    • 1.引入库
    • 2.读入数据
  • 总结


前言

模型预测控制工具箱™ 提供了用于开发模型预测控制 (MPC) 的函数、应用程序、Simulink® 模块和参考示例。对于线性问题,该工具箱支持设计隐式、显式、自适应和增益调度 MPC。对于非线性问题,您可以实现单级和多级非线性 MPC。该工具箱提供可部署的优化求解器,还能让您使用自定义求解器。

您可以在 MATLAB® 和 Simulink 中通过运行闭环仿真来评估控制器性能。对于自动驾驶,您还可以使用提供的符合 MISRA C™ 和 ISO 26262 标准的模块和示例,快速开始车道保持辅助、路径规划、路径跟踪和自适应巡航控制应用。

工具箱支持 C 和 CUDA® 代码以及 IEC 61131-3 结构化文本生成。


一、使用 MPC Designer 设计控制器

本例说明如何使用 MPC Designer 为连续搅拌槽反应器 (CSTR) 设计模型预测控制器。

1.1 CSTR 模型

连续搅拌罐反应器(CSTR)的线性化模型见 CSTR 模型。在该模型中,前两个状态变量分别是试剂浓度(此处称为 CA,单位为 kmol/m3)和反应器温度(此处称为 T,单位为 K),而前两个输入量分别是冷却剂温度(Tc,单位为 K,用于控制被控对象)和流入的进料试剂浓度 CAf,单位为 kmol/m3,(通常被视为未测量的干扰)。

在本例中,冷却剂温度与标称值的变化范围为 ±10 度,变化速率为每秒 ±2 度。

创建 CSTR 系统的状态空间模型。

A = [   -5  -0.3427;
     47.68    2.785];
B = [    0   1
       0.3   0];
C = flipud(eye(2));
D = zeros(2);
CSTR = ss(A,B,C,D);

1.2 导入被控对象并定义 MPC 结构

mpcDesigner

在这里插入图片描述

在 "MPC 设计器 "选项卡的 "结构 "部分,单击 “MPC 结构”。

在 "通过导入定义 MPC 结构 "对话框中,在 "从 MATLAB 工作区选择一个被控对象模型或一个 MPC 控制器 "表中,选择 CSTR 模型。

由于 CSTR 是一个稳定的连续时间 LTI 系统,因此 MPC Designer 将控制器采样时间设置为 0.1 Tr,其中 Tr 是 CSTR 的平均上升时间。在本例中,在指定 MPC 控制器采样时间字段中,输入 0.5 秒的采样时间。

默认情况下,所有被控对象输入均定义为操纵变量,所有被控对象输出均定义为测量输出。在 "分配被控对象 i/o 通道 "部分,分配输入和输出通道索引,以便

  • 第一个输入,即冷却液温度,为操纵变量。

  • 第二个输入,进料浓度,是一个未测量的干扰。

  • 第一个输出,反应器温度,是一个测量输出。

  • 第二个输出,反应物浓度,是一个未测量的输出。

在这里插入图片描述

单击导入。

应用程序会将 CSTR 被控对象导入数据浏览器。以下内容也会添加到数据浏览器中:

  • mpc1 - 使用 CSTR 作为内部模型创建的默认 MPC 控制器。

  • scenario1 - 默认模拟场景。

该程序运行默认模拟场景,并更新输入响应和输出响应图。闭环系统能够成功跟踪所需的测量输出,而未测量输出则不然。由于被控对象只有一个操纵变量,因此这种行为是意料之中的。

在这里插入图片描述

一旦定义了 MPC 结构,就不能在当前的 MPC Designer 会话中进行更改。要使用不同的通道配置,请启动新的应用程序会话。

1.3 定义输入和输出通道属性

在 MPC Designer 选项卡上,选择 I/O Attributes。

在 "输入和输出通道规格 "对话框的 "名称 "栏中,为每个输入和输出通道指定一个有意义的名称。

在 "单位 "栏中,可选择指定每个通道的单位。

由于状态空间模型是使用与标称工作点的偏差来定义的,因此请将每个输入和输出通道的标称值保持为 0。

各通道的比例因子保持默认值 1。

在这里插入图片描述

单击 “确定”。

输入响应和输出响应绘图标签会更新,以反映新的信号名称和单位。

1.4 配置仿真场景

在 "MPC 设计器 "选项卡的 "场景 "部分,单击 “编辑场景”>“场景 1”。

在 "模拟场景 "对话框中,将模拟持续时间设置为 20 秒。

在参考信号表的第一行,指定步长为 2,时间为 5。

在信号列第二行,选择常量参考,将浓度设定点保持在输入和输出通道规格对话框中定 义的标称值上(本例中标称值为零)。

在这里插入图片描述

默认设置为模拟参考反应器温度 T 在 5 秒钟内发生 2 开尔文的阶跃变化。

单击确定。

响应图更新以反映新的模拟方案配置。CA 的参考值不再是阶跃值,而是等于零的常数。

在 MPC Designer 左下方的 "情景 "部分,单击情景 1。第二次单击情景 1,并将情景重命名为 stepT。

1.5 配置控制器水平线

在 "调整 "选项卡的 "水平线 "部分,指定预测水平线为 15,控制水平线为 3。

在这里插入图片描述

响应图更新以反映新的范围。输入响应图显示,控制操作违反了对冷却剂温度变化率的限制要求。

1.6 定义输入约束条件

在 "设计 "部分,单击 “约束”。

在 "约束 "对话框的 "输入和输出约束 "部分的 "输入 "行中,分别在 "最小值 "和 "最大值 "列中输入冷却剂温度的上下限。

在 RateMin 和 RateMax 栏中指定变化率限制。

在这里插入图片描述

单击 “确定”。

在这里插入图片描述
输入响应图显示了受控变量的控制行动。输入响应图显示了受控变量的控制行动。

1.7 指定控制器调整权重

在 "调整 "选项卡的 "设计 "部分,单击 “权重”。

在输入权重表中,将操纵变量 (MV) 比率权重增加到 0.3。在控制器优化成本函数中,增加 MV 率权重可抑制 MV 的大幅变化。

在输出权重表中,保留默认权重值。默认情况下,所有未测量的输出权重为零。

由于只有一个受控变量,如果控制器试图将两个输出都保持在特定的设定点上,则一个或两个输出的响应都会出现稳态误差。由于控制器会忽略权重为零的输出设定点,因此将浓度输出权重设置为零可实现反应釜温度设定点跟踪,且稳态误差为零。

在这里插入图片描述

单击 “确定”。

在这里插入图片描述

输入响应图显示了较为保守的控制操作,这导致输出响应速度较慢。

1.8 消除输出超调

假设应用要求输出响应零过冲。在 "性能调整 "选项卡上,向左拖动 "闭环性能 "滑块,直到输出响应没有过冲。向左移动该滑块可同时增加控制器的操纵速率权重和减少输出变量权重,使控制器更加稳健。假设应用要求输出响应零过冲。在 "性能调整 "选项卡上,向左拖动 "闭环性能 "滑块,直到输出响应没有过冲。向左移动该滑块可同时增加控制器的操纵速率权重和减少输出变量权重,使控制器更加稳健。

在这里插入图片描述

使用 "闭环性能 "滑块调整控制器调整权重时,MPC Designer 不会更改您在 "权重 "对话框中指定的权重。相反,滑块控制一个调整系数,该系数与用户指定的权重一起用于定义实际控制器权重。

当滑块居中时,该系数为 1;当滑块向左移动时,其值减小;当滑块向右移动时,其值增大。权重系数乘以操纵变量和输出变量权重,再除以权重对话框中的操纵变量速率权重。因此,移动滑块增加鲁棒性会降低 OV 和 MV 权重,增加 MV 率权重,从而放宽对输出的控制,使控制动作更加保守。

要查看实际控制器权重,请将控制器导出到 MATLAB® 工作区,然后查看导出控制器对象的权重属性。

1.9 测试控制器抗干扰能力

在过程控制应用中,干扰抑制往往比设定点跟踪更重要。模拟控制器对进料浓度阶跃变化(未测量干扰)的响应。

在 "MPC 设计器 "选项卡的 "情景 "部分,单击 “绘制情景”>“新建情景”。

在模拟场景对话框中,将模拟持续时间设为 20 秒。

在参考信号表的第一行信号下拉列表中,选择步长,然后指定步长为 2,时间为 5。在第二行的信号列中,保持恒定参考以将浓度设定点保持在标称值上。

在 "未测量的干扰 "行的信号下拉列表中,选择 “步长”,然后指定步长为 0.2,时间为 5。

在这里插入图片描述

单击确定。

应用程序会将新方案添加到数据浏览器中,并创建新的相应输入响应图和输出响应图。

在数据浏览器的 "方案 "部分,将 NewScenario 重命名为 distReject。

在这里插入图片描述

从输出响应图中可以看出,闭环系统仍能达到预期的反应器温度。在这种情况下,所需的控制动作加上输入干扰会导致输出浓度 CA 稳态下降 0.1 kmol/m3。

1.10 指定浓度输出约束条件

之前,您定义了控制器调整权重,以实现跟踪反应釜温度设定点且稳态误差为零的主要控制目标。这样做可以使未测量的反应器浓度自由变化。假设反应器浓度相对于其标称值降至 0.05 kmol/m3 以下时,会发生不必要的反应。要限制反应釜浓度,请指定输出限制。

在 "设计 "部分的 "调谐 "选项卡上,单击 “约束”。

在 "约束 "对话框的 "输入 "和 "输出约束 "部分的 "输出 "表第二行中,指定最小未测量输出 (UO) 值为 -0.05。

默认情况下,所有输出约束都是软约束,即最小ECR 值和最大ECR 值都大于零。要进一步软化未测量输出 (UO) 约束,请增加其最大ECR 值。

在这里插入图片描述
单击 “确定”。

在这里插入图片描述
在输出响应图中,反应器浓度 CA 在 10 秒后稳定在-0.05 kmol/m3 的水平。由于只有一个控制变量,控制器在两个相互竞争的控制目标之间进行了折中: 温度跟踪和满足约束条件。较软的输出约束使控制器可以牺牲更多的约束要求来改善温度跟踪。

由于输出约束条件较软,控制器可通过允许少量违反浓度约束条件来保持一定的温度控制水平。一般来说,根据您的应用要求,您可以尝试使用不同的约束设置来实现可接受的控制目标折衷。

输出控制器
在 "调谐 "选项卡的 "分析 "部分,单击 "导出控制器 "将调谐控制器 mpc1 保存到 MATLAB 工作区。

1.11 删除被控对象、控制器和场景

要删除被控对象、控制器或场景,请在 "数据浏览器 "中右键单击要删除的项目,然后选择 “删除”。

不能删除当前控制器。此外,如果被控对象是唯一列出的工厂或方案,则无法删除。

如果某个工厂被任何控制器或场景使用,则无法删除该工厂。

要删除多个被控对象、控制器或场景,请按住 Shift 键并单击要删除的每个项目。

二、使用步骤

1.引入库

代码如下(示例):

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import warnings
warnings.filterwarnings('ignore')
import  ssl
ssl._create_default_https_context = ssl._create_unverified_context

2.读入数据

代码如下(示例):

data = pd.read_csv(
    'https://labfile.oss.aliyuncs.com/courses/1283/adult.data.csv')
print(data.head())

该处使用的url网络请求的数据。


总结

提示:这里对文章进行总结:

例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

node 第十九天 使用node插件node-jsonwebtoken实现身份令牌jwt认证

实现效果如下 前后端分离token登录身份验证效果演示 node-jsonwebtoken 基于node实现的jwt方案, jwt也就是jsonwebtoken, 是一个web规范可以去了解一下~ 一个标准的jwt由三部分组成 第一部分:头部 第二部分:载荷,比如可以填入加密…

探索Scrapy中间件:自定义Selenium中间件实例解析

简介 Scrapy是一个强大的Python爬虫框架,可用于从网站上抓取数据。本教程将指导你创建自己的Scrapy爬虫。其中,中间件是其重要特性之一,允许开发者在爬取过程中拦截和处理请求与响应,实现个性化的爬虫行为。 本篇博客将深入探讨…

Pytorch torch.dot、torch.mv、torch.mm、torch.norm的用法详解

torch.dot的用法: 使用numpy求点积,对于二维的且一个二维的维数为1 torch.mv的用法: torch.mm的用法 torch.norm 名词解释:L2范数也就是向量的模,L1范数就是各个元素的绝对值之和例如:

Linux环境下C++ 接入OpenSSL

接上一篇:Windows环境下C 安装OpenSSL库 源码编译及使用(VS2019)_vs2019安装openssl_肥宝Fable的博客-CSDN博客 解决完本地windows环境,想赶紧在外网环境看看是否也正常。毕竟现在只是HelloWorld级别的,等东西多了&am…

Windows Server2012 R2修复SSL/TLS漏洞(CVE-2016-2183)

漏洞描述 CVE-2016-2183 是一个TLS加密套件缺陷,存在于OpenSSL库中。该缺陷在于使用了弱随机数生成器,攻击者可以利用此缺陷预测随机数的值,从而成功绕过SSL/TLS连接的加密措施,实现中间人攻击。这个漏洞影响了OpenSSL 1.0.2版本…

Android——Gradle插件项目根目录settings.gradle和build.gradle

一、settings.gradle结构分析 项目根目录下的settings.gradle配置文件示例: pluginManagement {/*** The pluginManagement.repositories block configures the* repositories Gradle uses to search or download the Gradle plugins and* their transitive depen…

无需公网IP,使用MCSM面板一键搭建我的世界Minecraft服务器联机游戏

文章目录 前言1.Mcsmanager安装2.创建Minecraft服务器3.本地测试联机4. 内网穿透4.1 安装cpolar内网穿透4.2 创建隧道映射内网端口 5.远程联机测试6. 配置固定远程联机端口地址6.1 保留一个固定TCP地址6.2 配置固定TCP地址 7. 使用固定公网地址远程联机 前言 MCSManager是一个…

商业化三年,OceanBase在忙什么?

文|刘雨琦 2020年,国产数据库厂商OceanBase(以下简称OB)商业化的第一年,只有18个客户。 如何打开局面,让这个从蚂蚁场景中走出来的数据库活下去,并进入到更多的场景里,发挥更大的价…

对分过层后的类进行可视化

变量是&#xff1a; std::vector<pcl::PointCloud<pcl::PointXYZRGB>::Ptr> clusters_k_upper std::vector<pcl::PointCloud<pcl::PointXYZRGB>::Ptr> clusters_k_lower std::vector<pcl::PointCloud<pcl::PointXYZRGB>::Ptr> clusters_un…

无需添加udid,ios企业证书的自助生成方法

我们开发uniapp的app的时候&#xff0c;需要苹果证书去打包。 假如申请的是个人或company类型的苹果开发者账号&#xff0c;必须上架才能安装&#xff0c;异常的麻烦&#xff0c;但是有一些app&#xff0c;比如企业内部使用的app&#xff0c;是不需要上架苹果应用市场的。 假…

C语言真的需要头文件吗?

C语言真的需要头文件吗&#xff1f; 头文件的作用是什么&#xff1f; 如果你直接定义了函数&#xff0c;当然不需要头文件。 因为调用函数&#xff0c;你得知道函数的参数有多少&#xff0c;都什么类型的&#xff0c;返回值是什么&#xff0c;这样才能调用。最近很多小伙伴找…

免费开源的区域屏幕录制(gif转换)工具(支持编辑功能)

软件优点&#xff1a;区域截屏&#xff0c;直接转换为gif即刻分享&#xff0c;免费开源&#xff0c;支持编辑功能 它可以让你轻松地录制屏幕&#xff0c;摄像头或画板的动画&#xff0c;并编辑、保存为 GIF&#xff0c;视频或其他格式。 下载并安装 ScreenToGif 首先&#xf…

HTTPS流量抓包分析中出现无法加载key

HTTPS流量抓包分析(TLSv1.2)&#xff0c;这篇文章分析的比较透彻&#xff0c;就不班门弄斧了 https://zhuanlan.zhihu.com/p/635420027 写个小问题&#xff1a;RSA密钥对话框加载rsa key文件的时候注意不要在中文目录下&#xff0c;否则会提示&#xff1a;“Enter the passwor…

系列一、GC概述 作用域

一、概述 GC是垃圾回收的意思。次数上频繁收集Young区&#xff0c;少收集Old区&#xff0c;基本不动元空间。 二、作用域 GC的作用域是方法区和堆&#xff0c;主要针对于堆。

程序员如何把【知识体系化】

你好&#xff0c;我是田哥 最近有不少人找我聊如何准备面试&#xff0c;其中有个点是大家都无从下手的问题。 这个问题估计是困扰了很多人&#xff0c;最可怕的是都没有想到什么好点办法。 下面来说说个人的想法&#xff08;仅供参考&#xff09;。 我该怎么准备&#xff1f;这…

c# 字符串转换为byte

c# 字符串转换为byte using System.Text; class proj {internal static void Main(string[] args){byte[] anew byte[3];Console.WriteLine("打印a");Console.WriteLine("a的长度{0}",a.Length);foreach (byte b in a){ Console.WriteLine(b); }a Encodi…

zookeperkafka学习

1、why kafka 优点 缺点kafka 吞吐量高&#xff0c;对批处理和异步处理做了大量的设计&#xff0c;因此Kafka可以得到非常高的性能。延迟也会高&#xff0c;不适合电商场景。RabbitMQ 如果有大量消息堆积在队列中&#xff0c;性能会急剧下降每秒处理几万到几十万的消息。如果…

接口测试 —— 接口测试的意义

1、接口测试的意义&#xff08;优势&#xff09; &#xff08;1&#xff09;更早的发现问题&#xff1a; 不少的测试资料中强调&#xff0c;测试应该更早的介入到项目开发中&#xff0c;因为越早的发现bug&#xff0c;修复的成本越低。 然而功能测试必须要等到系统提供可测试…

Pytorch torch.norm函数详解用法

torch.norm参数定义 torch版本1.6 def norm(input, p"fro", dimNone, keepdimFalse, outNone, dtypeNone)input input (Tensor): the input tensor 输入为tensorp p (int, float, inf, -inf, fro, nuc, optional): the order of norm. Default: froThe following …

【计算思维】蓝桥杯STEMA 科技素养考试真题及解析 5

1、要把下面4张图片重新排列成蜗牛的画像&#xff0c;该如何排列这些图片 A、 B、 C、 D、 答案&#xff1a;A 2、将下图的绳子沿虚线剪开后&#xff0c;绳子被分成了()部分 A、6 B、7 C、8 D、9 答案&#xff1a;C 3、下面的立体图形&#xff0c;沿箭头方向看去&#…