Matlab:多输入多输出非线性对象的模型预测控制(MPC, Model Predictive Control)的实现

✨ 本文展示了如何在Simulink中设计多输入多输出对象的闭环模型预测控制 (MPC, Model Predictive Control),分析对象具有三个操纵变量(Manipulated Variables)与两个测量输出(Measured Output)。

一、非线性对象的线性化

1.1 线性化过程

在Matlab中使用open('mpc/mpcnonlinear')命令可以打开Simulink已经实现好的而非线性对象模型mpc_nonlinmodel,如下图所示:

使用Simulink控制设计工具箱中的线性命令,在默认操作条件下(传递函数块的初始状态均为零)对对象进行线性化:

plant = linearize('mpc_nonlinmodel');

linearize函数的作用是对Simulink模型或子系统进行线性近似。plant对象是一个 2 × 3 2 \times 3 2×3的状态空间模型(ss, State Space Model)矩阵,其中plant矩阵中的每个元素的数据结构为ss。以其中的plant(1, 1)为例,查看ss的数据结构。

  • plant的数据结构如下图所示:
  • plant(1, 1)的数据结构详细信息如下图所示:

执行完plant = linearize('mpc_nonlinmodel');后,在命令窗口输入plant可以查看其主要参数信息如下图所示,结合上面的介绍,我们可以很容易地理解每个参数的含义:

1.2 I/O变量分配名称
  • 1、为输入名称变量分配名称:

代码如下所示:

plant.InputName = {'Mass Flow';'Heat Flow';'Pressure'};

代码执行结果如下图所示:

  • 2、为输出名称变量分配名称:

代码如下所示:

plant.OutputName = {'Temperature'; 'Level'};

代码执行结果如下图所示:

经过为输入输出变量分配名称操作后,plant中输入输出变量名称则变为如下图所示的结果:

  • 3、为输入单位变量分配名称:

代码如下所示:

plant.InputUnit = {'kg/s', 'J/s', 'Pa'};
  • 4、为输出单位变量分配名称:
plant.OutputUnit = {'K', 'm'};

经过为输入输出单位变量分配名称后,plant中输入输出单位变量的结果如下图所示:

二、设计模型预测控制(MPC, Model Predictive Control)控制器

  • 1、构造MPC控制器对象

下面的指令构造MPC控制器,其中设置参数如下所示:

  • (1) 采样率(sampling period):0.2 sec;
  • (2) Prediction horizon:5 steps;
  • (3) Prediction horizon:2 moves;
mpcobj = mpc(plant, 0.2, 5, 2);

通过get命令可以获得mpcobj的类属性,每个类属性的内涵如下图所示:

  • 2、设置操纵变量的约束与权重

设置模型预测控制对象mpcobj操纵变量的指令如下所示:

mpcobj.MV = struct('Min',{-3;-2;-2},'Max',{3;2;2},'RateMin',{-1000;-1000;-1000});

设置模型预测控制对象mpcobj权重的指令如下所示:

mpcobj.Weights = struct('MV', [0 0 0], 'MVRate', [.1 .1 .1], 'OV', [1 1]);

执行完指令后,通过mpcobj命令可以查看其属性。

三、使用Simulink进行闭环仿真

通过下面的指令可以打开Matlab中的Simulink闭环仿真模型mpc_nonlinear

mdl1 = 'mpc_nonlinear';
open_system(mdl1)

打开的mpc_nonlinear模型包括如下图所示的三个部分:

通过下面的命令就可以进行仿真了:

sim(mdl1)

运行结果如下图所示:

由上图分析结果可以看出,尽管存在非线性,但是两个输出在几秒后很好地跟踪其参考值,并且操纵变量仍然保持在设置的约束内。

四、修改MPC设计跟踪斜坡信号

为了在补偿非线性的同时跟踪斜坡,将两个输出上的扰动模型定义为三积分器(没有非线性,双积分器就足够了)。

通过tf函数构造一个外部扰动模型outdistmodel

outdistmodel = tf({1 0; 0 1}, {[1 0 0 0], 1; 1, [1 0 0 0]});

构造的传递函数矩阵为:

[ 1 s 3 0 0 1 s 3 ] \begin{bmatrix} \frac{1}{s^3} & 0 \\ 0 & \frac{1}{s^3} \end{bmatrix} [s3100s31]

通过setoutdist函数将上面构造的不可观测外部扰动传递函数outdistmodel添加到MPC的model中:

setoutdist(mpcobj, 'model', outdistmodel);

打开Simulink中的闭环仿真模型mpc_nonlinear_setoutdist,它与上面的mpc_nonlinear闭环Simulink仿真模型相同,唯一不同的是参考信号,其参考信号的第一个由阶跃变为3秒以内以0.2斜率上升的斜坡信号。

打开的mpc_nonlinear_setoutdist模型包括如下图所示的三个部分:

下面的执行将mpc_nonlinear_setoutdist模型仿真12s:

sim(mdl2, 12)

仿真结果如下图所示:

  • 9
    点赞
  • 74
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
可以使用TensorFlow的Functional API实现多输入多输出模型。使用Functional API可以轻松地创建具有多个输入和输出的模型,只需定义每个输入和输出的形状和类型即可。 例如,下面的代码演示了如何创建一个具有两个输入(一个是文本输入,一个是数值输入)和两个输出(一个是二分类输出,一个是回归输出)的模型: ```python import tensorflow as tf # 文本输入 text_input = tf.keras.Input(shape=(None,), dtype='int32', name='text_input') embedded_text = tf.keras.layers.Embedding(input_dim=1000, output_dim=64)(text_input) encoded_text = tf.keras.layers.LSTM(32)(embedded_text) # 数值输入 numeric_input = tf.keras.Input(shape=(None,), dtype='float32', name='numeric_input') concatenated_inputs = tf.keras.layers.concatenate([encoded_text, numeric_input]) # 二分类输出 classification_output = tf.keras.layers.Dense(1, activation='sigmoid', name='classification')(concatenated_inputs) # 回归输出 regression_output = tf.keras.layers.Dense(1, name='regression')(concatenated_inputs) # 定义模型 model = tf.keras.Model(inputs=[text_input, numeric_input], outputs=[classification_output, regression_output]) ``` 在这个例子中,我们首先定义了文本输入和数值输入,并将它们传输到一个LSTM层中。然后我们将LSTM层的输出和数值输入合并起来,并将它们传输到两个不同的输出层中,一个是二分类输出,另一个是回归输出。最后,我们使用Functional API将所有输入和输出组装成一个模型。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌入式技术

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值