💥💥💞💞欢迎来到本博客❤️❤️💥💥
🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。
⛳️座右铭:行百里者,半于九十。
📋📋📋本文目录如下:🎁🎁🎁
目录
模型预测控制(MPC)中使用二次规划模拟多输入多输出(MIMO)系统的研究
⛳️赠与读者
👨💻做科研,涉及到一个深在的思想系统,需要科研者逻辑缜密,踏实认真,但是不能只是努力,很多时候借力比努力更重要,然后还要有仰望星空的创新点和启发点。当哲学课上老师问你什么是科学,什么是电的时候,不要觉得这些问题搞笑。哲学是科学之母,哲学就是追究终极问题,寻找那些不言自明只有小孩子会问的但是你却回答不出来的问题。建议读者按目录次序逐一浏览,免得骤然跌入幽暗的迷宫找不到来时的路,它不足为你揭示全部问题的答案,但若能让人胸中升起一朵朵疑云,也未尝不会酿成晚霞斑斓的别一番景致,万一它居然给你带来了一场精神世界的苦雨,那就借机洗刷一下原来存放在那儿的“躺平”上的尘埃吧。
或许,雨过云收,神驰的天地更清朗.......🔎🔎🔎
💥1 概述
使用二次规划来模拟多输入多输出(MIMO)系统的模型预测控制。这些脚本建立并模拟了一个通用的多输入多输出(MIMO)控制系统的模型预测控制,当线性化状态空间模型(或传递函数)作为函数的输入时。然而,一般情况下,工厂模型可能是非线性的。
二次规划用于使输入和输出变量在所需的时间范围内达到其设定点。
代码的描述如下:
run_MPC.m:设置并运行模拟的主文件。
MPC_simulation.m:通过时间迭代,并实现在每次迭代中找到的当前时间输入变量。
MPC_calculation:基于工厂的线性化模型,解决了具有向前时间范围的二次问题的MPC控制器。
MPC_plant.m:在工厂中实现当前时间输入向量。一般来说,工厂模型可以是非线性的。
Addnoise.m:一个用于根据信号的数量级和噪声百分比(噪声标准差)向主要信号(工厂的输出)添加噪声的函数。
详细文档见第4部分。
模型预测控制(MPC)中使用二次规划模拟多输入多输出(MIMO)系统的研究
摘要
模型预测控制(MPC)作为一种先进的控制策略,在处理复杂的多输入多输出(MIMO)系统时表现出独特的优势。本文聚焦于使用二次规划(QP)来模拟MIMO系统的模型预测控制过程,深入探讨其原理、实现方法及其在实际应用中的意义。通过理论分析和MATLAB仿真实验,验证了基于二次规划的MPC在MIMO系统控制中的有效性和鲁棒性。
1. 引言
随着工业过程控制系统的复杂性不断增加,传统的控制策略已难以满足现代工业对控制精度和鲁棒性的要求。模型预测控制(MPC)作为一种基于模型、优化控制输入的多变量控制策略,因其能够显式处理系统约束、具有前馈控制功能以及对模型不确定性具有一定的鲁棒性等优点,在工业过程控制领域得到了广泛应用。特别是在多输入多输出(MIMO)系统中,MPC能够同时处理多个输入和输出变量,从而优化系统性能。
二次规划(QP)是一种优化技术,用于在满足一系列线性约束的条件下,最小化二次函数的目标值。在MPC中,QP方法被广泛应用于求解最优控制输入序列,以实现系统的最优控制。
2. 模型预测控制基本原理
MPC的基本思想在于利用被控对象的数学模型,在每个采样时刻预测系统在未来一段时间内的动态行为,并通过求解一个优化问题来确定当前时刻的最优控制输入。MPC的核心要素包括:
- 预测模型:用于预测系统在未来一段时间内的输出响应。常见的预测模型包括状态空间模型、传递函数模型或ARX模型等。
- 滚动优化:在每个采样时刻,MPC会求解一个基于预测模型的优化问题,旨在最小化一个性能指标(通常是跟踪误差和控制输入能量的加权和),同时满足系统的状态和控制约束。
- 滚动实现:优化问题求解后,MPC只将优化得到的第一个控制输入作用于被控对象。在下一个采样时刻,系统状态被重新测量,预测时域向前滚动,优化问题再次求解,如此循环往复。
3. MIMO系统的MPC问题描述
MIMO系统具有多个输入和多个输出,其动态行为比单输入单输出(SISO)系统复杂得多。对MIMO系统进行准确建模是实现有效MPC的关键。常见的线性MIMO系统模型可以表示为状态空间形式:
3.1 系统约束的处理
MIMO系统的MPC通常需要处理多种约束,包括:
- 控制输入约束:如输入幅值限制、输入变化率限制等。
- 状态约束:如系统状态变量的上下界限制。
- 输出约束:如系统输出变量的上下界限制。
这些约束可以表示为线性不等式形式,并在优化问题中显式考虑。
3.2 二次规划求解
将性能指标和约束结合起来,MIMO系统的MPC问题最终被建模为一个标准的二次规划问题:
4. MATLAB仿真实现
为了验证基于二次规划的MPC在MIMO系统控制中的有效性,本文使用MATLAB进行了仿真实验。仿真过程中,主要包含以下步骤:
4.1 系统建模
选择一个典型的MIMO系统作为研究对象,建立其状态空间模型。例如,考虑一个双输入双输出(DIMO)系统,其状态空间方程为:
4.2 MPC控制器设计
设计MPC控制器时,需要确定以下参数:
- 预测时域(P):预测系统未来行为的步数。
- 控制时域(M):优化控制输入的步数。
- 权重矩阵(Q, R):分别用于平衡输出跟踪误差和控制输入能量的重要性。
4.3 二次规划问题求解
在每个采样时刻,根据当前系统状态和预测模型,构建二次规划问题,并使用MATLAB中的quadprog
函数求解最优控制输入序列。
4.4 仿真结果分析
通过仿真实验,记录系统的输入、输出和状态变化,分析控制器的性能,如跟踪性能、对扰动的抑制能力、约束满足情况等。仿真结果表明,基于二次规划的MPC控制器能够有效地跟踪期望轨迹,同时满足各种约束条件,表现出良好的鲁棒性。
5. 挑战与讨论
尽管基于二次规划的MPC在MIMO系统控制中取得了显著成功,但在实际应用中仍面临一些挑战:
- 模型准确性:MPC的性能高度依赖于预测模型的准确性。对于复杂的MIMO系统,建立精确模型可能非常困难。模型失配会导致预测误差,影响控制性能甚至导致系统不稳定。
- 计算复杂度:对于高维度的MIMO系统和较长的预测时域,二次规划问题的规模会很大,求解所需的计算时间可能超过采样周期,导致无法实时实现。
- 约束可行性:在某些情况下,系统约束可能无法同时满足,导致二次规划问题无解。需要设计合适的软约束或者松弛变量来处理约束的可行性问题。
- 参数整定:MPC控制器中的参数较多,如预测时域、控制时域以及权重矩阵等,它们的整定是一个复杂且耗时的过程,需要经验和反复试验。
针对这些挑战,研究人员提出了许多改进方法,例如:
- 模型辨识与自适应控制:利用在线辨识或自适应控制技术来提高模型精度。
- 高效求解算法:开发更高效的二次规划求解算法,或者利用结构特性来简化问题。
- 显式MPC:对于某些类型的系统,可以在离线阶段将MPC律表示为一个分段仿射函数,从而在线计算量极小。
- 鲁棒MPC:考虑模型不确定性或外部扰动的影响,设计具有鲁棒性的MPC控制器。
6. 结论与展望
基于二次规划的模型预测控制为MIMO系统提供了一种强大的控制策略。通过将复杂的MIMO控制问题转化为带有约束的二次规划问题,MPC能够有效地处理系统约束,实现良好的跟踪性能和鲁棒性。随着计算能力的不断提升和优化算法的进步,基于二次规划的MPC将在MIMO系统的先进控制领域发挥越来越重要的作用。
未来的研究将继续致力于提高MPC的计算效率、鲁棒性以及处理非线性系统的能力,以满足更广泛和更复杂的工业控制需求。例如,可以探索将深度学习等先进人工智能技术与MPC相结合,以进一步提高模型的准确性和控制性能。
📚2 运行结果
部分代码:
% Weightings:
MPC_case.Qy = eye(MPC_case.ny); % Output weight -> state weight for 1<i<Np-1;
MPC_case.Sy = 10*eye(MPC_case.ny); % Terminal weight at i=Np
MPC_case.Qu = 1*eye(MPC_case.nu); % Input weight for 0<i<Np-1
% Constraints (implemented as hard here):
MPC_case.umin = -40*ones(MPC_case.nu,1);
MPC_case.umax = 40*ones(MPC_case.nu,1);
MPC_case.ymin = -50*ones(MPC_case.ny,1);
MPC_case.ymax = [50; 50];
MPC_case.delta_u_min = -5*ones(MPC_case.nu,1);
MPC_case.delta_u_max = 20*ones(MPC_case.nu,1);
MPC_case.xmin = [-1e6*ones(MPC_case.nx,1); MPC_case.umin];
MPC_case.xmax = [1e6*ones(MPC_case.nx,1); MPC_case.umax];
% References for outputs, states and inputs:
MPC_case.yref_all = @(t)[(t<20)*40+(t>=20)*10; (t<25)*10+(t>=25)*49]; % Reference for 0<i<Np-1
% Horizon is Np (both for objective function and for constraints);
MPC_case.Np = 15;
% assign x0 and t_end
MPC_case.x0 = zeros(MPC_case.nx+MPC_case.nu,1); % First state value is zero
MPC_case.t_end = 40;
% Noise
MPC_case.noise_order = 100;
MPC_case.noise_percent = 0;
%% Run MPC
[U,X,Y,Y_measured] = MPC_simulation_delta_u(MPC_case);
%% plot results
t = 0:MPC_case.Ts:MPC_case.t_end;
t = [-1 t];
y1 = [0 0 Y(1,:)];
y2 = [0 0 Y(2,:)];
yref = MPC_case.yref_all(t);
yref(:,1) = [0; 0];
🎉3 参考文献
文章中一些内容引自网络,会注明出处或引用为参考文献,难免有未尽之处,如有不妥,请随时联系删除。
🌈4 Matlab代码、文档
资料获取,更多粉丝福利,MATLAB|Simulink|Python资源获取