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

系列文章目录


前言

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


一、定义工厂模型

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

% continuous-time state-space matrices, with temperature as first output
A = [   -5  -0.3427;
     47.68    2.785];
B = [    0   1
       0.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:    2

Plant 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: 0
    ManipulatedVariablesRate: 0.1000
             OutputVariables: [1 0]
                         ECR: 100000

State Estimation:  Default Kalman Filter (type "getEstimator(mpcobj)" for details)

Unconstrained

Use 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 变量形式返回仿真结果。您可以将结果用于其他目的,包括自定义绘图。例如,在同一图表中绘制操作变量和两个输出变量。

figure

subplot(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);

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

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

相关文章

(阿里云万网)-域名注册购买实名流程

1&#xff0c;进入阿里云网万官网 输入网址 https://wanwang.aliyun.com/?spm5176.161059.J_3207526240.33.581fa505OGhzsW 注册域名 &#xff0c;域名推荐com&#xff08;国际顶级域名&#xff09; &#xff0c;cn&#xff08;国内顶级域名&#xff09;。其中cn价钱比com便…

状态机高阶讲解-16

2534 01:44:41,942 --> 01:44:44,140 那我们&#xff0c;你看这里 2535 01:44:45,170 --> 01:44:46,452 你看这里改之后 2536 01:44:46,452 --> 01:44:48,833 它代码就做新的调整了嘛 2537 01:44:48,833 --> 01:44:49,200 对吧 2538 01:44:50,150 --> 01:44…

smbms:超市订单管理系统(项目分析)

smbms&#xff1a;超市订单管理系统&#xff08;项目分析&#xff09; 文章目录 smbms&#xff1a;超市订单管理系统&#xff08;项目分析&#xff09;前言一、项目介绍&#xff1a;二、项目来源&#xff1a;三、架构图&#xff1a;&#xff08;流程图&#xff09;四、使用了什…

【论文阅读】CompletionFormer:深度完成与卷积和视觉变压器

【论文阅读】CompletionFormer:深度完成与卷积和视觉变压器 文章目录 【论文阅读】CompletionFormer:深度完成与卷积和视觉变压器一、介绍二、联系工作深度完成Vision Transformer 三、方法四、实验结果 CompletionFormer: Depth Completion with Convolutions and Vision Tran…

腾讯云添加域名后不生效

问题原因 添加域名后不生效可能是因为没有加CDN域名解析 解决步骤

手动实现Tomcat底层机制+自己设计Servlet

文章目录 1.Tomcat整体架构分析自己理解 2.第一阶段1.实现功能2.代码1.TomcatV1.java 3.调试阶段1.阻塞在readLine导致无法返回结果 4.结果演示 3.第二阶段1.实现功能2.代码1.RequestHander.java2.TomcatV2.java 3.调试阶段1.发现每次按回车会接受到两次请求 4.结果演示 4.第三…

【Python使用】嘿马头条完整开发md笔记第4篇:数据库,1 方案选择【附代码文档】

嘿马头条项目从到完整开发笔记总结完整教程&#xff08;附代码资料&#xff09;主要内容讲述&#xff1a;课程简介&#xff0c;ToutiaoWeb虚拟机使用说明1 产品介绍,2 原型图与UI图,3 技术架构,4 开发,1 需求,2 注意事项。数据库&#xff0c;理解ORM1 简介,2 安装,3 数据库连接…

C++要点细细梳理(下)(内存分配、异常处理、template和文件读写)

4. 类动态内存分配 4.1 C语言动态内存分配&#xff1a;malloc和free 4.2 C动态内存分配&#xff1a;new和delete 思考&#xff1a;定义一个对象和定义一个普通变量有何区别? 普通变量:分配足够空间即可存放数据对象:除了需要空间&#xff0c;还要构造/析构 类比&#xff1a;…

关于 VScode, 点击文件右键或者在文件夹中没有 【 在vscode中打开选项】 解决办法

关于 VScode, 点击文件右键或者在文件夹中没有 【 在vscode中打开选项】 解决办法 段子手-168 2024-4-6 1、在任意位置创建一个文本文件。如&#xff1a;a.txt 2、复制以下代码到 a.txt 文本文件中。 &#xff08;注&#xff1a; 以 ; 开头的 , 是备注信息 , 不需要做任何修…

代码随想录第19天

654. 最大二叉树 已解答 中等 相关标签 相关企业 给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建: 创建一个根节点&#xff0c;其值为 nums 中的最大值。递归地在最大值 左边 的 子数组前缀上 构建左子树。递归地在最大值 右边 的 子数组后缀…

影院座位选择简易实现(uniapp)

界面展示 主要使用到uniap中的movable-area&#xff0c;和movable-view组件实现。 代码逻辑分析 1、使用movable-area和movea-view组件&#xff0c;用于座位展示 <div class"ui-seat__box"><movable-area class"ui-movableArea"><movab…

【QT学习】5.控件

一。控件的了解 1.控件作用 拖拽页面&#xff0c;所见即所得。 2.创建控件 3.向qt项目中添加资源 3.1显示图片 项目右键--》add new 创建结果&#xff1a; 添加资源到文件中 补充&#xff1a;使用代码的方式添加图片 3.2显示动图 1.添加动图资源 添加资源 2.显示动图 3.3显示…

基于单片机电子硬币储存器的设计

**单片机设计介绍&#xff0c;基于单片机电子硬币储存器的设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机电子硬币储存器的设计概要主要涵盖了硬件设计、软件设计、硬币识别、计数与储存等核心功能。以下是对该设…

OWASP TOP10 漏洞详解

前言 该内容是 OWASP TOP 10 的学习笔记&#xff0c;笔记内容来源 B 站龙哥的视频【12.Top漏洞10&#xff1a;服务器请求伪造_哔哩哔哩_bilibili】 一、访问控制崩溃 概念 未对通过身份验证的用户实施恰当的访问控制。攻击者可以利用这些缺陷访问未经授权的功能或数据&#xf…

【Linux】环境基础开发工具使用——gcc/g++使用

Linux编译器-gcc/g使用 1. 背景知识 1. 预处理&#xff08;进行宏替换 ) 2. 编译&#xff08;生成汇编 ) 3. 汇编&#xff08;生成机器可识别代码&#xff09; 4. 连接&#xff08;生成可执行文件或库文件 ) 2. gcc如何完成 格式 gcc [ 选项 ] 要编译的文件 [ 选…

阿德勒、荣格、埃里克森、霍妮、弗洛姆、沙利文的新精神分析理论

新精神分析理论&#xff0c;强调自我的自主性及其整合与调节功能&#xff0c;强调文化和社会因素对人格的重大影响。 一、阿德勒的个体心理学 阿德勒&#xff0c;是一个男人努力克服自卑感的优秀样板。阿德勒写了《超越与自卑》。 阿德勒&#xff0c;向意识层面扩展精神分析…

c++11的重要特性3

目录 1、lambda表达式 C98中的一个例子 lambda表达式的 lambda表达式语法 函数对象与lambda表达式 3、可变参数模板 递归获取 逗号表达式展开参数包 2、包装器 function包装器 bind 1、lambda表达式 C98中的一个例子 在C98中&#xff0c;如果想要对一个数据集合中的元素进…

NetSuite 自定义记录类型的权限控制

在近期的一个定制项目中&#xff0c;遭受了一次用户洗礼。有个好奇宝宝把我们的一个自定义类型的表记录进行了删除&#xff0c;导致一个重要功能失败。算是给我们扎实上了一课。自定义类型的权限也需要重视起来。所以&#xff0c;今朝我们记录下这个设置&#xff0c;同时写给未…

C++ setw() 函数

C setw() 函数 分类 编程技术 C setw() 函数用于设置字段的宽度&#xff0c;语法格式如下&#xff1a; setw(n) n 表示宽度&#xff0c;用数字表示。 setw() 函数只对紧接着的输出产生作用。 当后面紧跟着的输出字段长度小于 n 的时候&#xff0c;在该字段前面用空格补齐&…

《QT实用小工具·十五》多种样式的开关控件

1、概述 源码放在文章末尾 目前实现了三种样式的开关控件按钮&#xff0c;如下所示&#xff1a; 项目部分代码如下所示&#xff1a; #ifndef IMAGESWITCH_H #define IMAGESWITCH_H/*** 图片开关控件 * 1. 自带三种开关按钮样式。* 2. 可自定义开关图片。*/#include <QWid…