MPC模型预测控制理论与实践

2023-12-05 20:44

本文主要是介绍MPC模型预测控制理论与实践,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、基本概念

最有控制的动机是在约束条件下达到最优的系统表现。

模型预测控制(MPC,Model Predictive Control)是通过模型来预测系统在某一未来时间段内的表现来进行优化控制,多用于数位控制,通常用离散型状态空间表达。主要有三个主要部分构成,1模型;2预测;3控制(做决策)。模型,模型可以是机理模型,也可以是一个基于数据的模型。(例如深度学习训练得到的模型)预测,建立一个模型目的主要是用来做预测。控制(做决策),控制就是需要做出动作了,控制就是采取行动执行动作。

MPC主要有三步:

在k时刻:

1、估计/测量读取当前系统状态;

2、基于u_k,u_{k+1},...,u_{k+N}来进行最优化,离散系统代价函数为

J=\sum_k^{N-1}(E_k^TQE_k+u_k^TRu_k)+E_N^TFE_N

3、只取u_k作为控制输入施加在系统上。

在下一时刻重复以上三步,在下一步进行预测时使用的就是下一步的状态值,即滚动优化控制。

二、理论原理

1、二次规划的一般形式:

\begin{aligned}\min_x&&q(x)=z^TQz+C^Tz\\s.t.&&a_i^Tz\geq b_i,\quad i\in\tau\end{aligned}

二次规划问题目前的优化理论提供了较完整的求解方法,可以利用诸多工具进行求解。这里的MPC问题最后能够归结为求解一个二次规划问题,即最小化代价函数。

2、MPC代价函数

对于一个离散系统

x(k+1)=Ax(k)+Bu(k)

在k时刻进行观测,预测从k到N时刻的状态X_k为:

X_k=\begin{pmatrix}x(k|k)\\x(k+1|k)\\x(k+2|k)\\\cdots\\x(k+N|k)\end{pmatrix}

输入U_k为:

U_k=\begin{pmatrix}u(k|k)\\u(k+1|k)\\u(k+2|k)\\\cdots\\u(k+N-1|k)\end{pmatrix}

离散系统的代价函数为:

J=\sum_{i=0}^{N1}\left(x(k+i|k)\right.^TQx(k+i|k)+u(k+i|k)^TRu(k+i|k))\\ +x(k+N)^TFx(k+N)

我们需要求解的是系统的输入u(k+i|k),这就需要我们把状态项x(k+i|k)给消除掉。可以通过传感器或者状态估计得到系统当前的状态值,利用系统初始条件x(k|k)=x_k,以及上述离散状态方程,可以得到所有状态量用输入和初始值表达的形式:

X_k=\begin{pmatrix}I\\A\\A^2\\\cdots\\A^N\end{pmatrix}x(k)+\begin{pmatrix}0&0&\ldots&0\\B&0&\ldots&0\\AB&B&\ldots&0\\\ldots&\ldots&\ldots&\ldots\\A^{N-1}B&A^{N-2}B&\ldots&B\end{pmatrix}U_k

M=\begin{bmatrix} I_{​{n\times n}} \\A_{​{n\times n}} \\A_{​{n\times n}}^2 \\. \\. \\A^N\ \end{bmatrix}$C=\begin{bmatrix}0&0&...&0\\\vdots&\vdots&...&\vdots\\0&0&&0\\B&0&...&0\\AB&B&...&0\\\vdots&\vdots&\ddots&0\\A^{N-1}B&A^{N-2}B&...&B\end{bmatrix}$,则有

{X_k}={Mx_k}+{CU_k}

代价函数可以化简为:

$\begin{aligned} &J=\sum_{i=0}^{N-1}\left(x(k+i|k)^TQx(k+i|k)\right.+u(k+i|k)^TRu(k+i|k)+x(k+N)^TFx(k+N)) \\ &\left.=\left(\begin{array}{c}x(k|k)\\x(k+1|k)\\x(k+2|k)\\\cdots\\x(k+N|k)\end{array}\right.\right)\left(\begin{array}{ccccc}Q&&&\\&Q&&\\&&Q&\\&&\cdots&\cdots&\cdots\\\cdots&\cdots&\cdots&\cdots&\cdots\\&&&&F\end{array}\right)\left(\begin{array}{c}x(k|k)\\x(k+1|k)\\x(k+2|k)\\\cdots\\\cdots\\x(k+N|k)\end{array}\right)^T \\ &\left.+U_k^T\left(\begin{array}{rrrrr}R&&&&\\&R&&&\\&&R&&\\\cdots&\cdots&\cdots&\cdots&\cdots\\&&&&R\end{array}\right.\right)U_k \end{aligned}$

$J=X_k^T\overline{Q}X_k+U_k^T\overline{R}U_k$

进一步可以化简为

J=x{_k}^TGx{_k}+U_k^THU_k+2x{_k}^TEU_k

其中$M^T\overline{Q}M=G,M^T\overline{Q}C=E,C^T\overline{Q}C+\overline{R}=H$

该代价函数可以利用二次规划进行优化。

三、代码实践

问题:

1、MPC_Test.m

%% 清屏clear ; close all; clc;%% 加载 optim package,若使用matlab,则注释掉此行pkg load optim;%%%%%%%%%%%%%%%%%%%%%%%%%%%% 第一步,定义状态空间矩阵%% 定义状态矩阵 A, n x n 矩阵A = [1 0.1; -1 2];n= size (A,1);%% 定义输入矩阵 B, n x p 矩阵B = [ 0.2 1; 0.5 2];p = size(B,2);%% 定义Q矩阵,n x n 矩阵Q=[100 0;0 1];%% 定义F矩阵,n x n 矩阵F=[100 0;0 1];%% 定义R矩阵,p x p 矩阵R=[1 0 ;0 .1];%% 定义step数量kk_steps=100; %% 定义矩阵 X_K, n x k 矩 阵X_K = zeros(n,k_steps);%% 初始状态变量值, n x 1 向量X_K(:,1) =[20;-20];%% 定义输入矩阵 U_K, p x k 矩阵U_K=zeros(p,k_steps);%% 定义预测区间KN=5;%% Call MPC_Matrices 函数 求得 E,H矩阵 [E,H]=MPC_Matrices(A,B,Q,R,F,N);%% 计算每一步的状态变量的值for k = 1 : k_steps %% 求得U_K(:,k)U_K(:,k) = Prediction(X_K(:,k),E,H,N,p);%% 计算第k+1步时状态变量的值X_K(:,k+1)=(A*X_K(:,k)+B*U_K(:,k));end%% 绘制状态变量和输入的变化subplot  (2, 1, 1);hold;for i =1 :size (X_K,1)plot (X_K(i,:));endlegend("x1","x2")hold off;subplot (2, 1, 2);hold;for i =1 : size (U_K,1)plot (U_K(i,:));endlegend("u1","u2")

2、MPC_Matrices.m


function  [E , H]=MPC_Matrices(A,B,Q,R,F,N)n=size(A,1);   % A 是 n x n 矩阵, 得到 np=size(B,2);   % B 是 n x p 矩阵, 得到 p%%%%%%%%%%%%M=[eye(n);zeros(N*n,n)]; % 初始化 M 矩阵. M 矩阵是 (N+1)n x n的, % 它上面是 n x n 个 "I", 这一步先把下半部% 分写成 0 C=zeros((N+1)*n,N*p); % 初始化 C 矩阵, 这一步令它有 (N+1)n x NP 个 0% 定义M 和 C tmp=eye(n);  %定义一个n x n 的 I 矩阵% 更新M和Cfor i=1:N % 循环,i 从 1到 Nrows =i*n+(1:n); %定义当前行数,从i x n开始,共n行 C(rows,:)=[tmp*B,C(rows-n, 1:end-p)]; %将c矩阵填满tmp= A*tmp; %每一次将tmp左乘一次AM(rows,:)=tmp; %将M矩阵写满end % 定义Q_bar和R_barQ_bar = kron(eye(N),Q);Q_bar = blkdiag(Q_bar,F);R_bar = kron(eye(N),R); % 计算G, E, HG=M'*Q_bar*M; % G: n x nE=C'*Q_bar*M; % E: NP x nH=C'*Q_bar*C+R_bar; % NP x NP end

3、Prediction.m


function u_k= Prediction(x_k,E,H,N,p)U_k = zeros(N*p,1); % NP x 1U_k = quadprog(H,E*x_k);u_k = U_k(1:p,1); % 取第一个结果end

四、应用总结

模型预测控制(Model Predictive Control, MPC)是一种先进的闭环控制算法,它通过建立系统的数学模型,预测未来一定时间内的系统状态,并基于优化算法计算出最优控制信号。MPC具有以下优缺点:

优点:

  1. 高精度控制:除了考虑当前系统状态外,还能预测未来一段时间的系统状态,因此可以更精确地控制系统;

  2. 鲁棒性强:MPC可以通过修改控制器优化问题的约束来应对外部干扰和不确定性,提高控制系统的鲁棒性;

  3. 可处理复杂系统:MPC可以建立各种复杂系统的数学模型,并通过计算机算法进行优化,适用于多变量、非线性系统等;

  4. 可满足控制要求:MPC可以将多个控制要求统一优化,因此可以满足多个控制目标同时达到。

缺点:

  1. 计算复杂:MPC优化问题通常是一个非凸、非线性的问题,要求大量的计算资源和高效的算法,导致计算复杂度很高;

  2. 运行速度慢:由于计算复杂度高,MPC的运行速度相比其他控制算法要慢很多,因此只能应用于响应速度要求不高的稳态控制系统;

  3. 受模型误差影响:MPC算法是基于系统模型来进行优化的,因此系统模型误差会直接影响算法控制效果。因此,建立准确的系统模型是MPC算法应用的关键。

MPC主要还是应用在控制领域,在自动驾驶、无人机飞行控制、平衡车的控制、四足控制中有着广泛的应用。MPC这种将优化与控制结合的思想也许可以用在更多领域

参考资料:

【【MPC模型预测控制器】1_最优化控制和基本概念】 https://www.bilibili.com/video/BV1cL411n7KV/?share_source=copy_web&vd_source=24db73a73cddacddda48febd1ffc28ef

网络资料等。

这篇关于MPC模型预测控制理论与实践的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

用js控制视频播放进度基本示例代码

《用js控制视频播放进度基本示例代码》写前端的时候,很多的时候是需要支持要网页视频播放的功能,下面这篇文章主要给大家介绍了关于用js控制视频播放进度的相关资料,文中通过代码介绍的非常详细,需要的朋友可... 目录前言html部分:JavaScript部分:注意:总结前言在javascript中控制视频播放

Spring Boot 配置文件之类型、加载顺序与最佳实践记录

《SpringBoot配置文件之类型、加载顺序与最佳实践记录》SpringBoot的配置文件是灵活且强大的工具,通过合理的配置管理,可以让应用开发和部署更加高效,无论是简单的属性配置,还是复杂... 目录Spring Boot 配置文件详解一、Spring Boot 配置文件类型1.1 applicatio

Java的IO模型、Netty原理解析

《Java的IO模型、Netty原理解析》Java的I/O是以流的方式进行数据输入输出的,Java的类库涉及很多领域的IO内容:标准的输入输出,文件的操作、网络上的数据传输流、字符串流、对象流等,这篇... 目录1.什么是IO2.同步与异步、阻塞与非阻塞3.三种IO模型BIO(blocking I/O)NI

tomcat多实例部署的项目实践

《tomcat多实例部署的项目实践》Tomcat多实例是指在一台设备上运行多个Tomcat服务,这些Tomcat相互独立,本文主要介绍了tomcat多实例部署的项目实践,具有一定的参考价值,感兴趣的可... 目录1.创建项目目录,测试文China编程件2js.创建实例的安装目录3.准备实例的配置文件4.编辑实例的

Python 中的异步与同步深度解析(实践记录)

《Python中的异步与同步深度解析(实践记录)》在Python编程世界里,异步和同步的概念是理解程序执行流程和性能优化的关键,这篇文章将带你深入了解它们的差异,以及阻塞和非阻塞的特性,同时通过实际... 目录python中的异步与同步:深度解析与实践异步与同步的定义异步同步阻塞与非阻塞的概念阻塞非阻塞同步

Python Dash框架在数据可视化仪表板中的应用与实践记录

《PythonDash框架在数据可视化仪表板中的应用与实践记录》Python的PlotlyDash库提供了一种简便且强大的方式来构建和展示互动式数据仪表板,本篇文章将深入探讨如何使用Dash设计一... 目录python Dash框架在数据可视化仪表板中的应用与实践1. 什么是Plotly Dash?1.1

基于Flask框架添加多个AI模型的API并进行交互

《基于Flask框架添加多个AI模型的API并进行交互》:本文主要介绍如何基于Flask框架开发AI模型API管理系统,允许用户添加、删除不同AI模型的API密钥,感兴趣的可以了解下... 目录1. 概述2. 后端代码说明2.1 依赖库导入2.2 应用初始化2.3 API 存储字典2.4 路由函数2.5 应

springboot集成Deepseek4j的项目实践

《springboot集成Deepseek4j的项目实践》本文主要介绍了springboot集成Deepseek4j的项目实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价... 目录Deepseek4j快速开始Maven 依js赖基础配置基础使用示例1. 流式返回示例2. 进阶

Python异步编程中asyncio.gather的并发控制详解

《Python异步编程中asyncio.gather的并发控制详解》在Python异步编程生态中,asyncio.gather是并发任务调度的核心工具,本文将通过实际场景和代码示例,展示如何结合信号量... 目录一、asyncio.gather的原始行为解析二、信号量控制法:给并发装上"节流阀"三、进阶控制

使用DrissionPage控制360浏览器的完美解决方案

《使用DrissionPage控制360浏览器的完美解决方案》在网页自动化领域,经常遇到需要保持登录状态、保留Cookie等场景,今天要分享的方案可以完美解决这个问题:使用DrissionPage直接... 目录完整代码引言为什么要使用已有用户数据?核心代码实现1. 导入必要模块2. 关键配置(重点!)3.