您现在的位置是:首页 > 正文

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

2024-02-01 06:37:52阅读 2

✨ 本文展示了如何在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)

仿真结果如下图所示:

网站文章

  • cuda 排序算法笔记

    Thrust是cuda自带的c++库,cuda安装好之后,这个库也默认安装好了。 这个库基本是采用类似STL的接口方式,因此对于开发者非常友好,开发者不再需要关注内存与显存相关的问题了。 排序入门例子 #include #include #include #include #incl..

    2024-02-01 06:37:19
  • OkHttp完全解析

    OkHttp完全解析

    网上关于OkHttp的使用教程已经有很多了,先来贴一片网上的使用教程: http://blog.csdn.net/chenzujie/article/details/46994073然后直接进入正题。 看完上面这篇文章,主要理解的几个点:外部通过构造Request,初始化OkHttpClient,并由两者共同构造出Call。访问网络通过Call,Call支持两种模式:同步和异步。同步使用exe

    2024-02-01 06:37:13
  • 一份两百亿阅读的 Git 教程!

    一份两百亿阅读的 Git 教程!

    公众号关注“GitHubPorn”设为 “星标”,每天带你逛 GitHub!大家好,我是小 G。如果你用搜索引擎搜索关键字「Git教程」的话,排在第一的肯定是廖雪峰的网站,毕竟这个教程...

    2024-02-01 06:36:44
  • 松下电视机服务器未响应,松下等离子电视机通病有哪些 教你如何解决

    松下电视机服务器未响应,松下等离子电视机通病有哪些 教你如何解决

    松下品牌也算是一个老牌子了,它以的产品优势打动了无数国人的心,多年来一直销量很好。然而由于技术的限制,松下品牌的等离子电视机通常都会有一些小毛病,那么松下等离子电视机通病有哪些?接下来小编就把这些问题...

    2024-02-01 06:36:37
  • 算法基础篇-07-排序-希尔排序(Shell Sort)

    算法基础篇-07-排序-希尔排序(Shell Sort)

    希尔排序

    2024-02-01 06:36:29
  • [极客大挑战 2020]Roamphp1-Welcome 请求方式不对

    [极客大挑战 2020]Roamphp1-Welcome 请求方式不对

    进入后我没仔细看,发现网页无法正常运行,以为没网了,后面仔细一看报错的状态是405百度安全验证原来是请求方式有问题,便抓包改一下请求方式<?phperror_reporting(0);if ($_SE...

    2024-02-01 06:36:23
  • java操作hdfs报错java.io.IOException Failed to replace a bad datanode on the existing pipeline due to no ...

    java操作hdfs报错java.io.IOException Failed to replace a bad datanode on the existing pipeline due to no ...

    错误原因:   执行追加的文件中有3个datanode,备份数量设置的是3。在写操作时,它会在pipeline中写3个机器。默认replace-datanode-on-failure.policy是DEFAULT,如果系统中的datanode大于等于3,它会找另外一个datanode来拷贝。目前机器只有3台,因此只要一台datanode出问题,就一直无法写入成功。 解决方法:   ...

    2024-02-01 06:35:54
  • 计算机二级基础知识简单汇总

    计算机二级相关知识,必考,看看你学会了没

    2024-02-01 06:35:48
  • 对Numpy库ndarray对象(矩阵)中的数据元素的访问、选取操作示例

    对Numpy库ndarray对象(矩阵)中的数据元素的访问、选取操作示例

    为了说明这个问题,选初始化一个矩阵B,其尺寸为两行四列三通道。 代码如下: # !/usr/bin/env python # -*- coding: utf-8 -*- import numpy as np B = np.array([[[11, 12, 13, 14], [15, 16, 17, 18]], [[19, 20, 21, 22], [23, 24, 25, 26]], [[2

    2024-02-01 06:35:43
  • GPT带我学-设计模式-模板模式

    GPT带我学-设计模式-模板模式

    GPT教我学习模板模式

    2024-02-01 06:00:20