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

简介: 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);


目录
相关文章
|
1月前
|
数据建模 Python
MATLAB - mpcobj = mpc(model,ts,P,M,W,MV,OV,DV) 函数(上)
MATLAB - mpcobj = mpc(model,ts,P,M,W,MV,OV,DV) 函数
30 7
|
1月前
|
算法
MATLAB - MPC - QP Solvers
MATLAB - MPC - QP Solvers
45 4
|
1月前
|
算法 数据建模 Python
MATLAB - mpcobj = mpc(model,ts,P,M,W,MV,OV,DV) 函数(下)
MATLAB - mpcobj = mpc(model,ts,P,M,W,MV,OV,DV) 函数
37 3
|
1月前
|
存储
MATLAB - 使用 MPC Designer 线性化 Simulink 模型
MATLAB - 使用 MPC Designer 线性化 Simulink 模型
31 1
|
1月前
|
自然语言处理 并行计算 自动驾驶
MATLAB - 模型预测控制(MPC)控制入门 —— 设计并仿真 MPC 控制器
MATLAB - 模型预测控制(MPC)控制入门 —— 设计并仿真 MPC 控制器
139 1
|
1月前
|
机器学习/深度学习 存储 数据可视化
MATLAB - 比较 DDPG Agent 和 LQR 控制器
MATLAB - 比较 DDPG Agent 和 LQR 控制器
15 0
|
1月前
|
数据可视化
MATLAB - 利用非线性模型预测控制(Nonlinear MPC)来控制四旋翼飞行器
MATLAB - 利用非线性模型预测控制(Nonlinear MPC)来控制四旋翼飞行器
42 0
|
1月前
|
自然语言处理
一级倒立摆控制 - 非线性 MPC 控制及 MATLAB 实现
一级倒立摆控制 - 非线性 MPC 控制及 MATLAB 实现
27 0
|
1月前
|
机器学习/深度学习 数据建模 调度
MATLAB - 自适应 MPC(Adaptive MPC)
MATLAB - 自适应 MPC(Adaptive MPC)
29 0
|
1月前
MATLAB - MPC - 优化问题(Optimization Problem)
MATLAB - MPC - 优化问题(Optimization Problem)
58 0