1 生活中的启示

情景如下:你们团队每天早晨开一次例会,主要会议内容是你汇报工作进度,领导根据工作目标和工作进度,制定当天的工作计划,你领到工作计划后开始工作。每天都这样周而复始,从领导的角度看,这件工作实现了“闭环”,工作进度“可控”,这就是闭环控制系统。

图1 闭环控制系统

不同的领导(控制器)水平有高又低,按照介绍控制器先踩一脚PID的国际惯例,设:

则PID控制器的控制律为:

从该控制律中我们可以看到PID的两个问题:

1, PID控制器不具有“前瞻性”:参与计算的各个量,有当前的  ,上个控制周期的  ,以及之前所有的  累计和,偏偏没有未来的  。这个“领导”目光过于短浅,只求今天能完成任务,哪怕第二天公司就倒闭了,那也是第二天要解决的麻烦,今天该干啥干啥。

2, PID属于无模型控制。作为一个“领导”,PID仅仅通过工作目标和工作进度上的差距,以及三个近乎魔法般的数字,就制定了工作计划,完全不考虑你的工作能力和这项工作的难度,这是非常失职的。

为了提高工作的的可行性,经过思考,我们还可以有另一种方案:

  • 领导听完你的汇报后,根据工作进度(系统状态)、工作目标(参考值)、你的工作能力和任务难度(系统模型),制定了未来10天的工作计划,每一天要干什么都写得清清楚楚明明白白。
  • 领导将这十天计划里面第一天的计划交给你,剩下九天的计划销毁。
  • 第二天重复上述过程。

显然第二种方案更具有可行性,它能根据任务的完成情况及时调整工作计划,同时兼顾了未来的工作计划、你的工作能力和任务的难度,更符合我们的认知。

当然这种方案还有一点小缺陷,比如“剩下九天计划销毁”,领导看了这个方案肯定心里不舒服,辛辛苦苦做的计划凭什么销毁呢?为了弥补这个缺陷,我们提出了“控制时域”和“预测时域”的概念。控制时域是指领导做多少天的计划,预测时域是指领导思考多长远的进度。比如,领导考虑到计划跟不上变化,想太长远没意义,就先做了五天的计划(控制时域是五天),然后第6-10天的计划和第5天的计划一模一样,领导预测了下按照这样的十天计划,十天后进度完成的还算可以(预测时域是十天)。这样依然给你第一天的计划,销毁剩下九天的计划,领导的工作量却少了许多。

模型预测控制的基本思想就蕴含在上述过程中,它利用一个已有的模型、系统当前的状态和未来的控制量,来预测系统未来的输出,然后与我们期望的系统输出做比较,得到一个损失函数,即:

由于上式中模型、当前状态、期望输出都是已知的,因此只有未来控制量一个自变量。采用二次规划的方法求解出某个未来控制量,使得损失函数最小,这个未来控制量的第一个元素就是当前控制周期的控制量。

2 实际控制的例子

2.1 问题描述

在无限光滑的一维水平直线上有一个质量为  的滑块,初始位置与初始速度都为0,现需要设计控制器,在传感器测得滑块位置  的基础上,为滑块提供外力  ,使其跟随参考点 

图2 例图

2.2 预测模型

首先建立动力学方程:

选取状态向量  (除非特殊说明,后文中x表示状态向量,而不是滑块位置),构建系统状态方程为:

其中  。

2.3 预测模型离散化

采用前向欧拉法将状态方程离散化:

其中  ,T为控制周期。

2.4 预测

MPC方法的一个独特之处就是需要对未来系统状态进行预测,我们记未来  个控制周期内预测的系统状态为:

 称为预测时域,括号中  表示在当前  时刻预测  时刻的系统状态,以此类推。另外,预测动态系统未来状态时,还需要知道预测时域内的控制量  :

这是我们接下来将要求解的优化问题的独立变量。

现在,我们可以通过离散化状态方程依次对未来  个控制周期的系统状态进行预测:

整合成矩阵形式:

其中,psi :     ,             theta :  

上式中的下三角形式,直接反映了系统在时间上的因果关系,即  时刻的输入对  时刻的输出没有影响,  时刻的输入对  和  时刻没有影响,等等。

2.5 优化

这一节我们将求解预测时域内的控制输出  ,在求解优化问题之前,我们首先明确优化问题的数学描述。

我们的控制目标是使系统的状态跟踪期望的一条轨迹,通常称为参考值,定义预测时域内的参考值序列:

注意,在  时刻进行控制的时候,控制器就必须已经得到了  时刻到  时刻的参考值,而PID就不需要这么多信息,这是MPC的一个缺点。

我们希望寻找最佳的控制量  ,使得预测时域内的状态向量与参考值越接近越好,这是一个开环最优控制问题。为此,我们用预测状态向量与参考值之间的累计误差定义一个简单的优化目标函数:

经常地,我们不希望控制动作太大,优化目标函数再添加一项对控制量的约束:

因此,该优化问题可以描述如下:

我们将优化函数  展开后合并同类项:

注意::::::::

  在这里如果你仔细去化简上面的公式,会发现一个问题 2 ET* Q * thita * U是怎么来的,化简的结果应该是ET* Q * thita * UUT*thitaT*Q*E,为什么上面的结果是 2 ET* Q * thita * U,难道说ET* Q * thita * UUT*thitaT*Q*E相等不成,是的,这两个式子确实相等,但这两个是各自的转置后的形式啊(Q是对角矩阵,转置和原来一样这个应该没啥疑问),怎么相等呢,这和我们认知的矩阵转置一般不等于原矩阵不符啊,等等因为这个特殊呗,特殊形式中对角矩阵算一个,那这个是什么特殊情况呢?别急,我推导一遍你就清楚了。

上式中  是常数项,对“  为何值时  取得最小值”这一问题没有影响,因此直接舍去。

如图3,matlab输入 “help quadprog”查看二次型优化函数quadprog的说明文档,令:

可得最终优化目标函数,至此可直接调用matlab quadprog函数求解  ,将  的第一个元素提取出来,作为本控制周期的控制量。

图3 matlab quadprog函数

2.6 仿真

对于2.1中例子的动力学方程:

两边同时拉普拉斯变换:

可得传递函数:

在simulink中搭建仿真环境如图4,并编写MPC控制器(2.2—2.5):

图4 simulink中仿真

 1 function u = MPCcontroller(pos_ref, pos, vel)
2 %参数设置
3 m = 1.05; %滑块质量,增加了5%作为建模误差
4 T = 0.01; %控制周期10ms //采样时间
5 p = 45; %控制时域(预测时域)
6 Q = 10*eye(2*p); %状态误差权重 //因为Xk中有两个状态变量所以P乘以2以下道理相同
7 W = 0.0001*eye(p); %控制输出权重
8 umax = 100; %控制量限制,即最大的力
9 Rk = zeros(2*p,1); %参考值序列
10 Rk(1:2:end) = pos_ref;%参考位置由函数参数指定
11 Rk(2:2:end) = vel; %参考速度跟随实际速度
12 %构建中间变量
13 xk = [pos;vel]; %xk
14 A_ = [1 T;0 1]; %离散化预测模型参数A
15 B_ = [0;T/m]; %离散化预测模型参数B
16 psi = zeros(2*p,2); %psi
  %构建psi
17 for i=1:1:p
18 psi(i*2-1:i*2,1:2)=A_^i;
19 end
  %构建theta
20 theta = zeros(2*p,p); %theta
21 for i=1:1:p
22 for j=1:1:i
23 theta(i*2-1:i*2,j)=A_^(i-j)*B_;
24 end
25 end
26 E = psi*xk-Rk; %E
27 H = 2*(theta'*Q*theta+W); %H
28 f = (2*E'*Q*theta)'; %f
29 %优化求解
30 coder.extrinsic('quadprog');
31 Uk=quadprog(H,f,[],[],[],[],-umax,umax);
32 %返回控制量序列第一个值
33 u = 0.0; %指定u的类型
34 u = Uk(1); %提取控制序列第一项

p=40,仿真结果

p=60,仿真结果

参考文献

陈虹. 模型预测控制[M]. 科学出版社, 2013.

龚建伟, 姜岩, 徐威. 无人驾驶车辆模型预测控制[M]. 北京理工大学出版社, 2014.

转自:https://zhuanlan.zhihu.com/p/141871796?utm_source=wechat_session

一个模型预测控制(MPC)的简单实现的更多相关文章

  1. 【控制】模型预测控制 MPC 【合集】Model Predictive Control

    1.模型预测控制--运动学模型 2.模型预测控制--模型线性化 3.模型预测控制--模型离散化 4.模型预测控制--预测 5.模型预测控制--控制律优化二次型优化 6.模型预测控制--反馈控制 7.模 ...

  2. 模型预测控制 MPC

    使用MPC的原因:

  3. MATLAB模型预测控制(MPC,Model Predictive Control)

    模型预测控制是一种基于模型的闭环优化控制策略. 预测控制算法的三要素:内部(预测)模型.参考轨迹.控制算法.现在一般则更清楚地表述为内部(预测)模型.滚动优化.反馈控制. 大量的预测控制权威性文献都无 ...

  4. 无人驾驶——4.控制之MPC模型预测控制

    源自:<无人驾驶无人驾驶车辆模型预测控制>——龚建伟 参考:https://wenku.baidu.com/view/8e4633d519e8b8f67c1cb9fa.html 0.车辆模 ...

  5. Entity Framework 6 Recipes 2nd Edition(11-4)译 -> 在”模型定义”函数里调用另一个”模型定义”函数

    11-4.在”模型定义”函数里调用另一个”模型定义”函数 问题 想要用一个”模型定义”函数去实现另一个”模型定义”函数 解决方案 假设我们已有一个公司合伙人关系连同它们的结构模型,如Figure 11 ...

  6. ASP.NET MVC 5 - 添加一个模型

    在本节中,您将添加一些类,这些类用于管理数据库中的电影.这些类是ASP.NET MVC 应用程序中的"模型(Model)". 您将使用.NET Framework 数据访问技术En ...

  7. Asp.Net MVC4.0 官方教程 入门指南之四--添加一个模型

    Asp.Net MVC4.0 官方教程 入门指南之四--添加一个模型 在这一节中,你将添加用于管理数据库中电影的类.这些类是ASP.NET MVC应用程序的模型部分. 你将使用.NET Framewo ...

  8. Rails 增加一个模型(model)

      之前我们已经看到用脚手架运行的model程序.现在是时候第二个model了. 第二个model用来处理post的评论. 7.1 新建一个模型 Rails模型使用一个单一的的名称,其相应的数据库表使 ...

  9. [转]ASP.NET MVC 5 - 添加一个模型

    在本节中,您将添加一些类,这些类用于管理数据库中的电影.这些类是ASP.NET MVC 应用程序中的"模型(Model)". 您将使用.NET Framework 数据访问技术En ...

随机推荐

  1. Zookeeper集群搭建及原理

    1 概述 1.1 简介 ZooKeeper 是 Apache 的一个顶级项目,为分布式应用提供高效.高可用的分布式协调服务,提供了诸如数据发布/订阅.负载均衡.命名服务.分布式协调/通知和分布式锁等分 ...

  2. springMVC 调查问卷系统 record

    Maven下的依赖包有两个 spring-web和springWebMVC springwebMVC包含spring-web依赖, 但是spring-web的等级大于Spring-webmvc 没有 ...

  3. JZ-045-扑克牌顺子

    扑克牌顺子 题目描述 LL今天心情特别好,因为他去买了一副扑克牌,发现里面居然有2个大王,2个小王(一副牌原本是54张_)...他随机从中抽出了5张牌,想测测自己的手气,看看能不能抽到顺子,如果抽到的 ...

  4. VirtualBox虚拟机-安装增强功能

    virtualbox中win10虚拟机怎么安装增强功能 安装VBoxGuestAdditions增强功能后,可增加以下功能: 鼠标集成: 可以无缝的在宿主机与虚拟机之间移动鼠标. 自适应窗口:可以任意 ...

  5. Bugku CTF_web3

    1.打开网页,得到信息如下 2.在hackbar里构造url如下 3.得到flag 4.本题的考点在于读的懂PHP代码,并且学会构造get参数.

  6. Triple Shift

    来源:Atcoder ARC 136 B - Triple Shift (atcoder.jp) 题解:这道题我们不可能去硬模拟(大多数这种题都不能这样去模拟的),然后我们就要去发现特性, 发现把 a ...

  7. C#+SQL Server的数据库管理系统常用的代码

    数据库管理系统 数据库管理系统(Database Management System)是一种操纵和管理数据库的大型软件,用于建立.使用和维护数据库,简称DBMS.它对数据库进行统一的管理和控制,以保证 ...

  8. vite2 打包的时候vendor-xxx.js文件过大的解决方法

    vite2是一个非常好用的工具,只是随着代码的增多,打包的时候 vendor-xxxxxx.js 文件也越来越大,这就郁闷了. 打包时遇到警告 输出文件名字/static/vendor.9b5698e ...

  9. BUU [GKCTF 2021]签到

    BUU [GKCTF 2021]签到 1.题目概述 2.解题过程 追踪HTTP流 在下面发现了一串可疑字符 Base16转base64 放到010里看看 复制下来,去转字符 好像不是,再回去找找其他的 ...

  10. IEAD关于git配置以及拉代码和提交代码

    1.提前安装git客户端,注册码云帐号 注册地址:https://gitee.com/signup 2.新建仓库 3.修改仓库信息 4.从IDEA拉git项目,下面两个地方都可以配置 首次创建需要输入 ...