MATLAB - 用命令行设计 MPC 控制器

系列文章目录


前言

        本例演示如何通过命令行创建和测试模型预测控制器。


一、定义工厂模型

        本示例使用《使用 MPC Designer 设计控制器》中描述的工厂模型。创建工厂的状态空间模型,并设置一些可选的模型属性,如输入、状态和输出变量的名称和单位。

% continuous-time state-space matrices, with temperature as first output
A = [   -5  -0.3427;47.68    2.785];
B = [    0   10.3   0];
C = [0 1;1 0];
D = zeros(2,2);% create state space plant model
CSTR = ss(A,B,C,D);% set names
CSTR.InputName = {'T_c', 'C_A_f'};  % set names of input variables
CSTR.OutputName = {'T', 'C_A'};     % set names of output variables
CSTR.StateName = {'C_A', 'T'};      % set names of state variables% set units
CSTR.InputUnit = {'deg K', 'kmol/m^3'};     % set units of input variables
CSTR.OutputUnit = {'deg K', 'kmol/m^3'};    % set units of output variables
CSTR.StateUnit = {'kmol/m^3', 'deg K'};     % set units of state variables

        需要注意的是,该模型是由非线性模型围绕工作点线性化而来。因此,线性模型输入和输出信号的值代表与非线性模型中工作点值的偏差。更多信息,请参阅使用 MATLAB 代码进行线性化。

二、为不同的 MPC 类别分配输入和输出信号

        冷却剂温度是受控变量 (MV),流入试剂浓度是未测量干扰输入 (UD),反应器温度是测量输出 (MO),试剂浓度是未测量输出 (UO)。

CSTR=setmpcsignals(CSTR,'MV',1,'UD',2,'MO',1,'UO',2);

三、显示工厂基本属性并绘制阶跃响应图

        使用阻尼来显示线性工厂模型极点的阻尼比、固有频率和时间常数。

damp(CSTR)
                                                                       Pole              Damping       Frequency      Time Constant  (rad/seconds)      (seconds)    -1.11e+00 + 1.09e+00i     7.13e-01       1.55e+00         9.03e-01    -1.11e+00 - 1.09e+00i     7.13e-01       1.55e+00         9.03e-01    

        绘制开环阶跃响应图。

step(CSTR)

        考虑到设备的额定稳定性,约 1 秒的时间常数建议采样时间不大于 0.5 秒。在采样时间为 0.5 秒的情况下,10 步的预测范围可以覆盖开环设备的整个稳定时间,因此可以使用这两个参数作为初始猜测。采样时间越短,意味着可用于控制计算的时间越短。预测时间越长(步数越多),意味着优化变量的数量越多,因此在可用时间步数内需要解决的计算问题也就越多。

四、创建控制器

        为提高示例的清晰度,请抑制来自 MPC 控制器的命令窗口消息。

old_status = mpcverbosity('off');

        创建一个模型预测控制器,控制间隔或采样时间为 0.5 秒,所有其他属性均为默认值,包括 10 步预测范围和 2 步控制范围。

mpcobj = mpc(CSTR,0.5) %#ok<*NOPTS>
MPC object (created on 12-Feb-2024 23:58:42):
---------------------------------------------
Sampling time:      0.5 (seconds)
Prediction Horizon: 10
Control Horizon:    2Plant Model:        --------------1  manipulated variable(s)   -->|  2 states  ||            |-->  1 measured output(s)0  measured disturbance(s)   -->|  2 inputs  ||            |-->  1 unmeasured output(s)1  unmeasured disturbance(s) -->|  2 outputs |--------------
Indices:(input vector)    Manipulated variables: [1 ]Unmeasured disturbances: [2 ](output vector)        Measured outputs: [1 ]Unmeasured outputs: [2 ]Disturbance and Noise Models:Output disturbance model: default (type "getoutdist(mpcobj)" for details)Input disturbance model: default (type "getindist(mpcobj)" for details)Measurement noise model: default (unity gain after scaling)Weights:ManipulatedVariables: 0ManipulatedVariablesRate: 0.1000OutputVariables: [1 0]ECR: 100000State Estimation:  Default Kalman Filter (type "getEstimator(mpcobj)" for details)UnconstrainedUse built-in "active-set" QP solver with MaxIterations of 120.

五、查看和修改控制器属性

        显示控制器属性及其当前值的列表。

get(mpcobj)
                          Ts: 0.5                 PredictionHorizon (P): 10                  ControlHorizon (C): 2                   Model: [1x1 struct]        ManipulatedVariables (MV): [1x1 struct]        OutputVariables (OV): [1x2 struct]        DisturbanceVariables (DV): [1x1 struct]        Weights (W): [1x1 struct]        Optimizer: [1x1 struct]        Notes: {}                  UserData: []                  History: 12-Feb-2024 23:58:42

        控制器显示的历史记录值会有所不同,因为这取决于控制器的创建时间。有关 MPC 控制器可编辑属性的说明,请在命令行输入 mpcprops。

        使用点符号修改这些属性。例如,将预测范围改为 15。

mpcobj.PredictionHorizon = 15;

        有些属性名称有别名。例如,可以使用别名 MV 代替 ManipulatedVariables。此外,许多控制器属性都是包含附加字段的结构。使用点符号可以查看和修改这些字段值。例如,由于默认情况下控制器对操纵变量和输出变量没有约束,因此可以使用点符号查看和修改这些约束。

        为控制器操作变量设置约束条件。

mpcobj.MV.Min = -10;    % K
mpcobj.MV.Max = 10;     % K
mpcobj.MV.RateMin = -1; % K/step
mpcobj.MV.RateMax = 1;  % K/step

        您可以缩写属性名称,但缩写必须明确无误。您还可以查看和修改控制器调整权重。例如,修改操作变量速率和输出变量的权重。

mpcobj.W.ManipulatedVariablesRate = 0.3;
mpcobj.W.OutputVariables = [1 0];

        您还可以在预测范围内定义随时间变化的约束条件和权重,预测范围在每个时间步长内 都会发生变化。例如,如果要在预测期结束时强制受控变量以更慢的速度变化,请输入

mpcobj.MV.RateMin = [-2; -1.5; -1; -1; -1; -0.5];mpcobj.MV.RateMax = [2; 1.5; 1; 1; 1; 0.5];

-0.5和 0.5 值用于第四步及以后。

        同样,您也可以为预测范围的每一步指定不同的输出变量权重。例如,输入

mpcobj.W.OutputVariables = [0.1 0; 0.2 0; 0.5 0; 1 0];

        您还可以修改控制器的干扰抑制特性。更多信息,请参阅 setEstimator、setindist 和 setoutdist。

六、审查控制器设计

        生成有关潜在运行时稳定性和性能问题的报告。

review(mpcobj)

        在本例中,审查命令发现设计存在两个潜在问题。第一个警告是由于 C_A 输出误差的权重为零。第二个警告是由于 MV 和 MVRate 都存在硬约束。

        您可以向下滚动查看每个测试结果的详细信息。

七、稳态闭环输出灵敏度增益

        计算闭环系统的闭环稳态增益矩阵。

SoDC = cloffset(mpcobj)
SoDC =-4.4409e-15

八、执行线性仿真

        使用 sim 函数对系统进行线性仿真。例如,仿真 mpcobj 在 26 个控制间隔内的闭环响应。从第二步开始,为反应器温度(第一输出)和试剂浓度(第二输出)分别指定 2 和 0 的设定点。请注意,由于第二输出的调整权重为 0,因此浓度的设定点将被忽略。

T = 26;
r = [0 0;2 0];
sim(mpcobj,T,r)

        您可以使用 mpcsimopt 修改仿真选项。例如,关闭操纵变量约束运行仿真。

mpcopts = mpcsimopt;
mpcopts.Constraints = 'off';
sim(mpcobj,T,r,mpcopts)

        现在,被操作变量的第一次移动超过了指定的 1 单位速率限制。

        您也可以在工厂/模型不匹配的情况下进行仿真。例如,定义一个工厂,其增益比控制器使用的模型中的增益大 50%,时间延迟为 0.1 秒。

mpcopts.Model = tf(1.5,1,'InputDelay',0.1)*CSTR;
sim(mpcobj,T,r,mpcopts)

        从闭环响应的振荡行为可以看出,工厂/模型不匹配会降低控制器的性能。退化可能很严重,必须逐个进行测试。

        其他仿真选项包括在被控变量或测量输出中添加指定的噪声序列、开环仿真和前瞻选项,以实现更好的设定点跟踪或测量干扰抑制。

九、存储和绘制仿真结果

        仿真系统,将仿真结果存储在 MATLAB® 工作区中。

[y,t,u] = sim(mpcobj,T,r);

        该语法抑制自动绘制,并以 y、t 和 u 变量形式返回仿真结果。您可以将结果用于其他目的,包括自定义绘图。例如,在同一图表中绘制操作变量和两个输出变量。

figuresubplot(2,1,1)
plot(t,u)
title('Inputs')
legend('T_c')subplot(2,1,2)
plot(t,y)
title('Outputs')
legend('T','C_A')
xlabel('Time')

        恢复 mpcverbosity 设置。

mpcverbosity(old_status);

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

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

相关文章

正确使用@Resource

目录 1 怎么使用Resource&#xff1f;1.0 实验环境1.1 通过字段注入依赖1.2 bean property setter methods &#xff08;setter方法&#xff09; 2 打破岁月静好&#xff08;Resource takes a name attribute&#xff09;2.1 结论2.2 那我不指定呢&#xff1f;【结论&#xff1…

Seata(分布式事务集成测试和总结)

文章目录 1.集成测试1.集成测试正常下单1.步骤2.浏览器访问 http://localhost:10008/order/save?userId666&productId1&nums1&money1003.注意事项和细节 2.集成测试模拟异常1.步骤1.com/sun/springcloud/controller/StorageController.java 休眠12s&#xff0c;模…

自动驾驶执行层 - 线控底盘基础原理(非常详细)

自动驾驶执行层 - 线控底盘基础原理(非常详细) 附赠自动驾驶学习资料和量产经验&#xff1a;链接 1. 前言 1.1 线控的对象 在自动驾驶行业所谓的“感知-定位-决策-执行”的过程中&#xff0c;在末端的执行层&#xff0c;车辆需要自主执行决策层所给出的指令&#xff0c;具体…

leetcode(HOT100)——链表篇

1、相交链表 本题思路就是定义两指针&#xff0c;指向两链表的同一起跑线&#xff0c;然后共同往前走&#xff0c;边走边判断两链表的节点是否相等&#xff0c; 代码如下&#xff1a; /*** Definition for singly-linked list.* public class ListNode {* int val;* L…

Android14应用启动流程(源码+Trace)

1.简介 应用启动过程快的都不需要一秒钟&#xff0c;但这整个过程的执行是比较复杂的&#xff0c;无论是对手机厂商、应用开发来说启动速度也是核心用户体验指标之一&#xff0c;本文采用Android14源码与perfetto工具进行解析。 源码参考地址&#xff1a;Search trace分析工…

2024.4.5|牛客小白月赛90

2024.4.5|牛客小白月赛90 A.小A的文化节 B.小A的游戏 C.小A的数字 D.小A的线段&#xff08;easy version&#xff09; E.小A的任务 F.小A的线段&#xff08;hard version&#xff09; 心有猛虎&#xff0c;细嗅蔷薇。你好朋友&#xff0c;这里是锅巴的C\C学习笔记&#xff0c…

[报错解决]源服务器未能找到目标资源的表示或者是不愿公开一个已经存在的资源表示。

目录 报错信息解决办法 spring整合mvc时&#xff0c;遇到的404报错&#xff0c;梳理mvc知识供参考供 报错信息 解决办法 Controller RequestMapping("user") public class UserController {//spring整合webmvc// 请求地址 http://localhost:7070/user/quickRequest…

数据字典

文章目录 一、需求分析二、表设计&#xff08;两张表&#xff09;三、功能实现3.1 数据字典功能3.1.1 列表功能3.1.2 新增数据字典3.1.3 编辑数据字典 3.2 数据字典明细3.2.1 列表功能3.2.2 新增字典明细3.2.3 编辑字典明细 3.3 客户管理功能3.3.1 列表功能3.3.2 新增用户3.3.3…

Golang | Leetcode Golang题解之第11题盛最多水的容器

题目&#xff1a; 题解&#xff1a; func maxArea(height []int) int {res : 0L : 0R : len(height) - 1for L < R {tmp : math.Min(float64(height[L]), float64(height[R]))res int(math.Max(float64(res), tmp * float64((R - L))))if height[L] < height[R] {L} el…

【环境变量】基本概念理解 | 查看环境变量echo | PATH的应用和修改

目录 前言 基本概念&理解 注意的点 查看环境变量方法 PATH环境变量 PTAH应用系统指令 PTAH应用用户程序 命令行的修改&#xff08;内存级&#xff09; 配置文件的修改 windows环境变量 大家天天开心&#x1f642; bash进程的流程。环境变量在系统指令和用户…

Linux网卡IP地址配置错误的影响

在Linux系统中&#xff0c;网络配置是保持系统顺畅运行的关键一环。正确配置网卡的IP地址对于确保网络通信的准确性和效率至关重要。然而&#xff0c;如果在这个过程中发生错误&#xff0c;可能会带来一系列问题。让我们一起探讨一下&#xff0c;如果Linux网卡的IP地址配置错误…

Python+Yolov8框选位置目标识别人数统计计数

程序示例精选 PythonYolov8框选位置目标识别人数统计计数 如需安装运行环境或远程调试&#xff0c;见文章底部个人QQ名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对《PythonYolov8框选位置目标识别人数统计计数》编写代码&#xff0c;代码整洁&#…

测开——基础理论面试题整理

1. 测试流程 需求了解分析需求评审制定测试计划【包括测试人员、时间、每人负责的模块、测试的风险项以及预防】编写自动化测试用例 —— 测试评审【尽量丰富测试点】编写测试框架和脚本&#xff08;若是功能测试 可省去这步骤&#xff09;执行测试提交缺陷报告测试分析与评审…

Coursera上托福专项课程02:TOEFL Speaking and Writing Sections Skills Mastery 学习笔记

TOEFL Speaking and Writing Sections Skills Mastery Course Certificate 本文是学习 https://www.coursera.org/learn/toefl-speaking-writing-sections-skills-mastery 这门课的学习笔记&#xff0c;如有侵权&#xff0c;请联系删除。 文章目录 TOEFL Speaking and Writing…

docker-ce部署

目录 1. 更新软件包列表 2. 安装必要的软件包&#xff0c;以允许 apt 使用 HTTPS 3. 添加 Docker 的官方 GPG 密钥 4. 设置 Docker CE 的稳定存储库 5. 再次更新包索引以及安装 Docker CE 6. 验证 Docker CE 是否正确安装 7. 将当前用户添加到 docker 用户组&#xff0c;…

Linux之shell脚本编辑工具awk

华子目录 概念工作流程工作图流程&#xff08;按行处理&#xff09; awk程序执行方式1.通过命令行执行awk程序实例 2.awk命令调用脚本执行实例 3.直接使用awk脚本文件调用实例 awk命令的基本语法格式BEGIN模式与END模式实例awk的输出 记录和域&#xff08;记录表示数据行&#…

【陈老板赠书活动 - 25期】- 《Effective Java》

陈老老老板&#x1f9d9;‍♂️ &#x1f46e;‍♂️本文专栏&#xff1a;赠书活动专栏&#xff08;为大家争取的福利&#xff0c;免费送书&#xff09; &#x1f934;本文简述&#xff1a;活就像海洋,只有意志坚强的人,才能到达彼岸。 &#x1f473;‍♂️上一篇文章&#xff…

行人重识别项目 | 基于Pytorch实现ReID行人重识别算法

项目应用场景 面向行人重识别场景&#xff0c;项目具有轻量化 (训练的时候也只需要 2GB 的显存占用)、性能好 (只使用 softmax 损失就能够达到 Rank188.24%, mAP70.68%)&#xff0c;另外提供友好的上手项目流程教程 项目效果&#xff1a; 项目流程 > 具体参见项目内README.…

利用Flutter混淆工具提高应用的反编译难度

在移动应用开发中&#xff0c;保护应用代码安全至关重要。Flutter 提供了简单易用的混淆工具&#xff0c;帮助开发者在构建 release 版本应用时有效保护代码。本文将介绍如何在 Flutter 应用中使用混淆&#xff0c;并提供了相关的操作步骤和注意事项。 &#x1f4dd; 摘要 本…

第十四届蓝桥杯大赛软件赛省赛

第十四届蓝桥杯大赛软件赛省赛 2.日期统计 小蓝现在有一个长度为 100 的数组&#xff0c;数组中的每个元素的值都在 0 到 9 的范围之内。 数组中的元素从左至右如下所示&#xff1a; 5 6 8 6 9 1 6 1 2 4 9 1 9 8 2 3 6 4 7 7 5 9 5 0 3 8 7 5 8 1 5 8 6 1 8 3 0 3 7 9 2 7 …