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

2024-04-07 12:36

本文主要是介绍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)

d11b62c0be654d6190f4dac6996c2050.png

        考虑到设备的额定稳定性,约 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)

0652a9edd11c4a1089eef27f757470ce.png

        在本例中,审查命令发现设计存在两个潜在问题。第一个警告是由于 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)

ff9723fd34b8422295d4baa9d3ea7049.png

4f59127a1e1d4d0d9b931f6b3c058377.png

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

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

e8e8ab397a5240b9b607060dc3211b73.png

0a78a7e24abd4434973bfe7f84dbe98c.png

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

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

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

1872aa659c5c425db7cf62090872ade9.png

94235716f5044b148dd3a8c1e4ce2544.png

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

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

九、存储和绘制仿真结果

        仿真系统,将仿真结果存储在 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')

589918f49a244ccab8cf03fd6cac6f57.png

        恢复 mpcverbosity 设置。

mpcverbosity(old_status);

 

这篇关于MATLAB - 用命令行设计 MPC 控制器的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/882608

相关文章

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

用命令行的方式启动.netcore webapi

用命令行的方式启动.netcore web项目 进入指定的项目文件夹,比如我发布后的代码放在下面文件夹中 在此地址栏中输入“cmd”,打开命令提示符,进入到发布代码目录 命令行启动.netcore项目的命令为:  dotnet 项目启动文件.dll --urls="http://*:对外端口" --ip="本机ip" --port=项目内部端口 例: dotnet Imagine.M

怎么让1台电脑共享给7人同时流畅设计

在当今的创意设计与数字内容生产领域,图形工作站以其强大的计算能力、专业的图形处理能力和稳定的系统性能,成为了众多设计师、动画师、视频编辑师等创意工作者的必备工具。 设计团队面临资源有限,比如只有一台高性能电脑时,如何高效地让七人同时流畅地进行设计工作,便成为了一个亟待解决的问题。 一、硬件升级与配置 1.高性能处理器(CPU):选择多核、高线程的处理器,例如Intel的至强系列或AMD的Ry

基于51单片机的自动转向修复系统的设计与实现

文章目录 前言资料获取设计介绍功能介绍设计清单具体实现截图参考文献设计获取 前言 💗博主介绍:✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对象是咱们电子相关专业的大学生,希望您们都共创辉煌!✌💗 👇🏻 精彩专栏 推荐订阅👇🏻 单片机

SprinBoot+Vue网络商城海鲜市场的设计与实现

目录 1 项目介绍2 项目截图3 核心代码3.1 Controller3.2 Service3.3 Dao3.4 application.yml3.5 SpringbootApplication3.5 Vue 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍:CSDN认证博客专家,CSDN平台Java领域优质创作者,全网30w+

matlab读取NC文件(含group)

matlab读取NC文件(含group): NC文件数据结构: 代码: % 打开 NetCDF 文件filename = 'your_file.nc'; % 替换为你的文件名% 使用 netcdf.open 函数打开文件ncid = netcdf.open(filename, 'NC_NOWRITE');% 查看文件中的组% 假设我们想读取名为 "group1" 的组groupName

利用matlab bar函数绘制较为复杂的柱状图,并在图中进行适当标注

示例代码和结果如下:小疑问:如何自动选择合适的坐标位置对柱状图的数值大小进行标注?😂 clear; close all;x = 1:3;aa=[28.6321521955954 26.2453660695847 21.69102348512086.93747104431360 6.25442246899816 3.342835958564245.51365061796319 4.87

单片机毕业设计基于单片机的智能门禁系统的设计与实现

文章目录 前言资料获取设计介绍功能介绍程序代码部分参考 设计清单具体实现截图参考文献设计获取 前言 💗博主介绍:✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对象是咱们电子相关专业的大学生,希望您们都共创辉煌!✌💗 👇🏻 精彩专栏 推荐订

Spring的设计⽬标——《Spring技术内幕》

读《Spring技术内幕》第二版,计文柯著。 如果我们要简要地描述Spring的设计⽬标,可以这么说,Spring为开发者提供的是⼀个⼀站式的轻量级应⽤开发框架(平台)。 作为平台,Spring抽象了我们在 许多应⽤开发中遇到的共性问题;同时,作为⼀个轻量级的应⽤开发框架,Spring和传统的J2EE开发相⽐,有其⾃⾝的特点。 通过这些⾃⾝的特点,Spring充分体现了它的设计理念:在

C# double[] 和Matlab数组MWArray[]转换

C# double[] 转换成MWArray[], 直接赋值就行             MWNumericArray[] ma = new MWNumericArray[4];             double[] dT = new double[] { 0 };             double[] dT1 = new double[] { 0,2 };