简单入门--无约束线性模型预测控制

2023-11-27 23:20

本文主要是介绍简单入门--无约束线性模型预测控制,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

简单入门--无约束模型预测控制

  • 一、模型预测控制是什么?
    • 1. 引言
    • 2. 模型预测控制基础
    • 3. MPC数学模型
  • 二、无约束线性模型预测控制
    • 1. 无约束线性模型预测控制问题-----标准型
    • 2. 无约束线性模型预测控制问题-----紧凑型
    • 3. 无约束线性模型预测控制问题-----解析解
    • 4. MATLAB 代码示例


导读:下棋有高手和菜鸟,高手往往预测未来多步棋局发展,提前布局,而菜鸟只根据当前棋局做选择,显然前瞻不够。模型预测控制有相似的思想。根据当前棋局形势(即系统当前状态)和可能的棋局走势(基于模型预测未来发展),为赢得棋局(根据期望目标),根据自己的经验得出未来多步最优的下棋方案(根据优化方法得出多步最优策略),选择得出的多步最优策略的第一步作为当前步最优决策。并且每次下棋之前都重复上步骤做出最优决策。


一、模型预测控制是什么?

1. 引言

模型预测控制(Model Predictive Control,MPC)是一种先进的控制策略,广泛应用于工业过程、自动驾驶、机器人控制等领域。MPC通过数学模型预测未来系统行为,并优化控制输入,以最优化某些性能指标。

2. 模型预测控制基础

MPC的五要素:

在这里插入图片描述

  1. 系统建模:将被控制系统建模成离散或连续时间的状态空间模型,通常表示为状态方程和输出方程。

  2. 性能指标定义:确定性能指标,例如最小化误差、能耗或最大化系统效率等,以评估控制器的性能。

  3. 未来预测:使用系统模型进行未来状态和输出的预测,通常通过数值求解器进行。

  4. 优化问题:在每个控制步骤中,通过求解优化问题来选择控制输入,以最小化性能指标。这是MPC的关键步骤。

  5. 应用控制输入:将最优控制输入应用于系统,然后重复上述步骤。

模型预测控制具体应用步骤:
1)基于当前系统状态及模型预测系统未来走向
2)根据期望目标,通过优化的方法得出当前及未来多步最优策略
3)将得出的多步最优策略中的第一步作为当前最优决策。
4)每步决策之前,重复上述方案,随时间逐步推进。
因此模型预测控制也成后退时域控制。

3. MPC数学模型

min ⁡ u J ≜ F ( x N ) + ∑ i = 0 N − 1 L ( x k + i ∣ k , u k + i ∣ k ) 目标函数 s.t.: x k + i + 1 ∣ k = f ( x k + i ∣ k , u k + i ∣ k ) 系统模型 x k + i ∣ k ∈ X 状态约束 u k + i ∣ k ∈ U 控制约束 x k ∣ k = x k 当前系统状态 u = [ u k ∣ k , … , u k + i ∣ k , … , u k + N − 1 ∣ k ] ⊤ 待优化的控制策略 \begin{aligned} &\mathop{\min}_{u}&& \begin{aligned}J\triangleq F(x_N)+\sum_{i=0}^{N-1}L(x_{k+i|k},u_{k+i|k})\end{aligned} &&目标函数 \\ &\text{s.t.:}&& x_{k+i+1|k}=f(x_{k+i|k},u_{k+i|k}) &&系统模型\\ &&&x_{k+i|k}\in\mathcal{X}&&状态约束\\ &&&u_{k+i|k}\in\mathcal{U}&&控制约束\\ &&& x_{k|k}=x_{k}&&当前系统状态\\ &&& u = \left [ u_{k|k},\dots,u_{k+i|k},\dots,u_{k+N-1|k} \right ] ^\top&&待优化的控制策略 \end{aligned} minus.t.:JF(xN)+i=0N1L(xk+ik,uk+ik)xk+i+1∣k=f(xk+ik,uk+ik)xk+ikXuk+ikUxkk=xku=[ukk,,uk+ik,,uk+N1∣k]目标函数系统模型状态约束控制约束当前系统状态待优化的控制策略


二、无约束线性模型预测控制

当系统模型为线性,即 x k + 1 = A x k + B u k x_{k+1}=Ax_{k}+Bu_{k} xk+1=Axk+Buk, 且无状态约束和控制约束的模型预测控制为无约束线性模型预测控制。

1. 无约束线性模型预测控制问题-----标准型

标准式 P1:
min ⁡ U ˉ J ≜ F ( x N ) + ∑ i = 0 N − 1 L ( x k + i ∣ k , u k + i ∣ k ) 目标函数 s.t.: x k + i + 1 ∣ k = A x k + i ∣ k + B u k + i ∣ k 系统模型 x k ∣ k = x k 当前系统状态 U ˉ = [ u k ∣ k , … , u k + i ∣ k , … , u k + N − 1 ∣ k ] ⊤ 待优化的控制策略 \begin{aligned} &\mathop{\min}_{\bar U}&& \begin{aligned}J\triangleq F(x_N)+\sum_{i=0}^{N-1}L(x_{k+i|k},u_{k+i|k})\end{aligned} &&目标函数 \\ &\text{s.t.:}&& x_{k+i+1|k}=Ax_{k+i|k}+Bu_{k+i|k} &&系统模型\\ &&& x_{k|k}=x_{k}&&当前系统状态\\ &&& \bar U = \left [ u_{k|k},\dots,u_{k+i|k},\dots,u_{k+N-1|k} \right ] ^\top&&待优化的控制策略 \end{aligned} minUˉs.t.:JF(xN)+i=0N1L(xk+ik,uk+ik)xk+i+1∣k=Axk+ik+Buk+ikxkk=xkUˉ=[ukk,,uk+ik,,uk+N1∣k]目标函数系统模型当前系统状态待优化的控制策略
这里目标函数通常选为 J ≜ x k + N ∣ k ⊤ Q N x k + N ∣ k + ∑ i = 0 N − 1 ( x k + i ∣ k ⊤ Q x k + i ∣ k + u k + i ∣ k ⊤ R u k + i ∣ k ) J\triangleq x_{k+N|k}^\top{Q}_Nx_{k+N|k}+\sum_{i=0}^{N-1}\left(x_{k+i|k}^\top{Q}x_{k+i|k}+u_{k+i|k}^\top{R}u_{k+i|k}\right) Jxk+NkQNxk+Nk+i=0N1(xk+ikQxk+ik+uk+ikRuk+ik), 跟踪目标为系统原点; x k + N ∣ k ⊤ Q N x k + N ∣ k x_{k+N|k}^\top{Q}_Nx_{k+N|k} xk+NkQNxk+Nk终端误差指标,确保系统稳定性; x k + i ∣ k ⊤ Q x k + i ∣ k x_{k+i|k}^\top{Q}x_{k+i|k} xk+ikQxk+ik 误差积分指标,越小表示误差积分越小; u k + i ∣ k ⊤ R u k + i ∣ k u_{k+i|k}^\top{R}u_{k+i|k} uk+ikRuk+ik对控制量的指标,越小代表能量消耗越少;这里跟踪目标为系统原点。

2. 无约束线性模型预测控制问题-----紧凑型

1、动态方程转换

a) 根据系统的状态方程 x k + i + 1 ∣ k = A x k + i ∣ k + B u k + i ∣ k x_{k+i+1|k}=Ax_{k+i|k}+Bu_{k+i|k} xk+i+1∣k=Axk+ik+Buk+ik以及初值 x k ∣ k = x k x_{k|k}=x_{k} xkk=xk,递归推导得
x k + 1 ∣ k = A x k ∣ k + B u k ∣ k x k + 2 ∣ k = A x k + 1 ∣ k + B u k + 1 ∣ k = A 2 x k ∣ k + A B u k ∣ k + B u k + 1 … x k + N ∣ k = A x k + N − 1 ∣ k + B u k + N − 1 = A N x k + A N − 1 B u k + … … + A B u k + N − 2 + B u k + N − 1 \begin{aligned}&{x_{k+1|k}=Ax_{k|k}+Bu_{k|k}}\\ &{x_{k+2|k}=Ax_{k+1|k}+Bu_{k+1|k}=A^2x_{k|k}+ABu_{k|k}+Bu_{k+1}}\\ &\dots\\ &x_{k+N|k}={Ax_{k+N-1|k}+Bu_{k+N_-1}=A^{N}x_k+A^{N-1}Bu_k+\ldots\ldots+ABu_{k+N-2}+Bu_{k+N-1}}\end{aligned} xk+1∣k=Axkk+Bukkxk+2∣k=Axk+1∣k+Buk+1∣k=A2xkk+ABukk+Buk+1xk+Nk=Axk+N1∣k+Buk+N1=ANxk+AN1Buk+……+ABuk+N2+Buk+N1

b) 上述方程可以重写为以下紧凑形式
[ x k ∣ k x k + 1 ∣ k x k + 2 ∣ k ⋯ x k + N ∣ k ] ⏟ X ˉ = [ I A A 2 ⋯ A N ] ⏟ A ˉ x k + [ 0 0 . . . 0 B 0 . . . 0 A B B . . . 0 ⋯ . . . . . . . . . A N − 1 B A N − 2 B . . . B ] ⏟ B ˉ [ u k u k + 1 ⋯ ⋯ u k + N − 1 ] ⏟ U ˉ \underbrace{\begin{bmatrix}{x_{k|k}}\\{x_{k+1|k}}\\{x_{k+2|k}}\\\cdots\\{x_{k+N|k}}\end{bmatrix}}_{\bar{{X}}}=\underbrace{\begin{bmatrix}{I}\\{A}\\{A^2}\\\cdots\\A^{N}\end{bmatrix}}_{\bar{A}}{x_k}+\underbrace{\begin{bmatrix}{0}&0&...&0\\{B}&0&...&0\\{AB}&{B}&...&0\\\cdots&...&...&...\\{A^{N-1B}}&{A^{N-2}B}&...&{B}\end{bmatrix}}_{\bar B}\underbrace{\begin{bmatrix}{u_k}\\{u_{k+1}}\\\cdots\\\cdots\\{u_{k+N-1}}\end{bmatrix}}_{\bar U} Xˉ xkkxk+1∣kxk+2∣kxk+Nk =Aˉ IAA2AN xk+Bˉ 0BABAN1B00B...AN2B...............000...B Uˉ ukuk+1uk+N1
即:
X ˉ = A ˉ x k + B ˉ U ˉ \begin{align} {\bar X} = {\bar A}x_{k}+ {\bar B} {\bar U} \end{align} Xˉ=Aˉxk+BˉUˉ
2. 目标函数转换
J = X ˉ ⊤ [ Q ⋱ Q Q N ] ⏟ Q ˉ ( N + 1 ) × ( N + 1 ) X ˉ + U ˉ ⊤ [ R ⋱ R ] ⏟ R ˉ N × N U ˉ = X ˉ ⊤ Q ˉ X ˉ + U ˉ ⊤ R ˉ U ˉ \begin{align} J =& {\bar X}^\top\underbrace{\begin{bmatrix} Q& & & \\ & \ddots & & \\ & & Q& \\ & & &Q_N \end{bmatrix} }_{\bar Q_{(N+1) \times (N+1)}}{\bar X}+{\bar U}^\top\underbrace{\begin{bmatrix} R& & \\ & \ddots& \\ & &R \end{bmatrix}}_{\bar R_{N\times N}} {\bar U} \notag\\ =& {\bar X}^\top{\bar Q}{\bar X}+{\bar U}^\top{\bar R}{\bar U} \end{align} J==XˉQˉ(N+1)×(N+1) QQQN Xˉ+UˉRˉN×N RR UˉXˉQˉXˉ+UˉRˉUˉ

根据标准式 P1,(1)和(2),可以得到无约束线性模型预测控制问题----紧凑型:
min ⁡ U ˉ J = 1 2 U ˉ ⊤ H U ˉ + f ⊤ U ˉ + c 目标函数 s.t.: X ˉ = A ˉ x k + B ˉ U ˉ 系统模型 U ˉ = [ u k ∣ k , … , u k + i ∣ k , … , u k + N − 1 ∣ k ] ⊤ 待优化的控制策略 \begin{aligned} &\mathop{\min}_{\bar U}&& \begin{aligned}J=\frac{1}{2}{\bar U}^\top H{\bar U}+{f^\top}{\bar U}+c\end{aligned} &&目标函数 \\ &\text{s.t.:}&&{\bar X} = {\bar A}x_{k}+ {\bar B} {\bar U} &&系统模型\\ &&& \bar U = \left [ u_{k|k},\dots,u_{k+i|k},\dots,u_{k+N-1|k} \right ] ^\top&&待优化的控制策略 \end{aligned} minUˉs.t.:J=21UˉHUˉ+fUˉ+cXˉ=Aˉxk+BˉUˉUˉ=[ukk,,uk+ik,,uk+N1∣k]目标函数系统模型待优化的控制策略

3. 无约束线性模型预测控制问题-----解析解

将等式约束(1)带入目标函数, 将含等式约束的QP问题转换为无约束的QP问题
J = X ˉ ⊤ Q ˉ X ˉ + U ˉ ⊤ R ˉ U ˉ = x k ⊤ A ˉ ⊤ Q ˉ A ˉ x k + 2 x k ⊤ A ˉ ⊤ Q ˉ B ˉ U ˉ + U ˉ ⊤ B ˉ ⊤ Q ˉ B ˉ U ˉ + U ˉ ⊤ R ˉ U ˉ = 1 2 U ˉ ⊤ 2 ( B ˉ ⊤ Q ˉ B ˉ + R ˉ ) ⏟ H U ˉ + 2 x k ⊤ A ˉ ⊤ Q ˉ B ˉ ⏟ f ⊤ U ˉ + x k ⊤ A ˉ ⊤ Q ˉ A ˉ x k ⏟ c = 1 2 U ˉ ⊤ H U ˉ + f ⊤ U ˉ + c \begin{align} J =& {\bar X}^\top{\bar Q}{\bar X}+{\bar U}^\top{\bar R}{\bar U}\notag\\ =&{x}_k^\top{\bar A}^\top{\bar Q}{\bar A}{x}_k+2{x}_k^\top{\bar A}^\top{\bar Q}{\bar B}{\bar U}+{\bar U}^\top{\bar B}^\top{\bar Q}{\bar B}{\bar U}+{\bar U}^\top{\bar R}{\bar U}\notag\\ =&\frac{1}{2}{\bar U}^\top \underbrace{2\left({\bar B}^\top{\bar Q}{\bar B}+{\bar R}\right)}_{H} {\bar U}+ \underbrace{2{x}_k^\top{\bar A}^\top{\bar Q}{\bar B}}_{f^\top}{\bar U}+ \underbrace{{x}_k^\top{\bar A}^\top{\bar Q}{\bar A}{x}_k}_{c}\notag\\ =&\frac{1}{2}{\bar U}^\top H{\bar U}+{f^\top}{\bar U}+c\notag \end{align} J====XˉQˉXˉ+UˉRˉUˉxkAˉQˉAˉxk+2xkAˉQˉBˉUˉ+UˉBˉQˉBˉUˉ+UˉRˉUˉ21UˉH 2(BˉQˉBˉ+Rˉ)Uˉ+f 2xkAˉQˉBˉUˉ+c xkAˉQˉAˉxk21UˉHUˉ+fUˉ+c
其中
H = 2 ( B ˉ ⊤ Q ˉ B ˉ + R ˉ ) , f = B ˉ ⊤ Q ˉ A ˉ x k = G x k H=2\left({\bar B}^\top{\bar Q}{\bar B}+{\bar R}\right),f={\bar B}^\top{\bar Q}{\bar A}{x}_k=G{x}_k H=2(BˉQˉBˉ+Rˉ),f=BˉQˉAˉxk=Gxk
根据函数的极值条件, U ˉ ∗ {\bar U}^* Uˉ ∇ J ( U ˉ ∗ ) = 0 \nabla{J}({\bar U}*)=0 J(Uˉ)=0;目标函数为二次函数(凸函数), U ˉ ∗ {\bar U}^* Uˉ为最优解。
根据目标函数 J J J的表达式以及极值条件,我们得出 无约束线性模型预测控制问题-----解析解
U ˉ ∗ = − H − 1 f = − H − 1 G x k {\bar U}^* =- H^{-1}f=- H^{-1}G{x}_k Uˉ=H1f=H1Gxk

4. MATLAB 代码示例

代码如下(示例):

clear; clc; close all;
% 线性系统系数矩阵
A=[1 0 1 0; 0 1 0 1;0 0 1 0; 0 0 0 1]; 
B=[0 0;0 0;1 0;0 1];
% 初始状态量-如果不能在下一步回到约束范围内,则会造成无解
x0=[8; -4; -0.2;-0.1];
% 预测步长
N=5;
% 优化目标参数,加权矩阵
Q=[10 0  0 0;0 20 0 0; 0 0  100 0 ;0 0  0 100 ];
R=eye(size(B,2));% 紧凑形式矩阵
At=zeros(size(A,1)*N,size(A,1));
Bt = zeros(size(A,1)*N,size(B,2)*N);    
for i=1:1:NAt(size(A,1)*(i-1)+1:size(A,1)*i,:) = A^i;for j=1:1:iBt(size(A,1)*(i-1)+1:size(A,1)*i,size(B,2)*(j-1)+1:size(B,2)*j)=A^(i-j)*B;end
endQ_bar = kron(eye(N),Q);
R_bar = kron(eye(N),R);H=2*(Bt'*Q_bar*Bt + R_bar);
G = Bt'*Q_bar*At;%初始值
x=x0;
xk=x0;for k=1:100%最优解U = -H\G*xk;% 采用优化得到的控制量的第一个元素作为实际作用的控制量,代入到原系统中得到下一个时刻的状态量u(:,k) = U(1:size(B,2));%动态方程更新x(:, k+1) = A*x(:, k) + B*u(:,k);xk = x(:, k+1);
end%状态图
figure('Color','w');
plot(x(1,:),'c-','LineWidth',1.5);hold on
plot(x(2,:),'g-','LineWidth',1.5);hold on
plot(x(3,:),'b-','LineWidth',1.5);hold on
plot(x(4,:),'m-','LineWidth',1.5);hold on
legend('$x_1$','$x_2$','$x_3$','$x_4$','Interpreter','latex');
set(gca,'FontSize',20,'FontName','Times New Roman');%控制量图
figure('Color','w');
plot(u(1,:),'c-','LineWidth',1.5);hold on
plot(u(2,:),'g-','LineWidth',1.5);hold on
legend('$u_1$','$u_2$','Interpreter','latex');
set(gca,'FontSize',20,'FontName','Times New Roman');

这篇关于简单入门--无约束线性模型预测控制的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:https://blog.csdn.net/weixin_41146894/article/details/132655218
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/428655

相关文章

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

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

Spring Boot + MyBatis Plus 高效开发实战从入门到进阶优化(推荐)

《SpringBoot+MyBatisPlus高效开发实战从入门到进阶优化(推荐)》本文将详细介绍SpringBoot+MyBatisPlus的完整开发流程,并深入剖析分页查询、批量操作、动... 目录Spring Boot + MyBATis Plus 高效开发实战:从入门到进阶优化1. MyBatis

Mysql表的简单操作(基本技能)

《Mysql表的简单操作(基本技能)》在数据库中,表的操作主要包括表的创建、查看、修改、删除等,了解如何操作这些表是数据库管理和开发的基本技能,本文给大家介绍Mysql表的简单操作,感兴趣的朋友一起看... 目录3.1 创建表 3.2 查看表结构3.3 修改表3.4 实践案例:修改表在数据库中,表的操作主要

springboot简单集成Security配置的教程

《springboot简单集成Security配置的教程》:本文主要介绍springboot简单集成Security配置的教程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录集成Security安全框架引入依赖编写配置类WebSecurityConfig(自定义资源权限规则

Java的IO模型、Netty原理解析

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

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

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

如何使用Python实现一个简单的window任务管理器

《如何使用Python实现一个简单的window任务管理器》这篇文章主要为大家详细介绍了如何使用Python实现一个简单的window任务管理器,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起... 任务管理器效果图完整代码import tkinter as tkfrom tkinter i

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

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

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

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

C++中函数模板与类模板的简单使用及区别介绍

《C++中函数模板与类模板的简单使用及区别介绍》这篇文章介绍了C++中的模板机制,包括函数模板和类模板的概念、语法和实际应用,函数模板通过类型参数实现泛型操作,而类模板允许创建可处理多种数据类型的类,... 目录一、函数模板定义语法真实示例二、类模板三、关键区别四、注意事项 ‌在C++中,模板是实现泛型编程