MATLAB广义预测控制(GPC)算法仿真与性能分析系统
项目介绍
本项目是一个基于MATLAB环境深度开发的广义预测控制(GPC)算法仿真系统。该系统实现了一个完整的闭环控制流程,涵盖了被控对象的建模、在线参数辨识、多步预测、滚动优化以及反馈校正。
项目核心旨在通过仿真验证GPC算法在处理模型失配、随机噪声干扰以及设定值跟踪方面的性能。系统采用受控自回归积分滑动平均(CARIMA)模型作为预测基础,结合递归最小二乘法(RLS)进行实时模型参数更新,确保了算法对被控对象变化的适应性。
功能特性
- 高保真被控对象仿真:基于离散差分方程构建二阶被控系统,模拟真实的输入输出动态,支持叠加高斯白噪声。
- 在线参数辨识 (RLS):集成带遗忘因子的递归最小二乘法,能够从带有噪声的输入输出数据中实时在线估计模型参数,并具备处理初始模型参数失配的能力。
- 广义预测控制核心引擎:
*
柔化参考轨迹:通过一阶平滑滤波器构建参考轨迹,避免设定值突变引起的控制量剧烈波动。
*
Diophantine方程求解:实现了多项式递归算法求解丢番图方程,精确计算预测模型所需的$E_j$、$F_j$多项式及阶跃响应矩阵$G$。
*
滚动优化:基于二次型性能指标,在控制时域内求解最优控制增量序列。
- 约束处理:内置控制量限幅机制,模拟物理执行机构的饱和特性。
- 鲁棒性验证机理:代码结构中预留了阶跃扰动(Disturbance)接口,并默认开启白噪声干扰,用于测试系统的抗干扰性能。
- 性能评估:自动计算稳态误差、超调量等关键控制指标。
系统要求
- MATLAB R2016a 或更高版本
- 无需额外工具箱(Toolbox),算法完全基于基础矩阵运算实现
使用方法
- 确保MATLAB当前工作路径包含项目所在文件夹。
- 直接运行主程序脚本。
- 系统将开始200步的仿真循环,控制台会输出仿真进度。
- 仿真结束后,系统将自动计算性能指标并在控制台显示,同时调用可视化函数绘制响应曲线。
代码实现逻辑详解
主程序脚本即为系统的入口,其内部逻辑严格遵循模型预测控制(MPC)的经典“预测-优化-校正”三步曲:
1. 系统初始化与模型定义
仿真参数设定为采样时间1秒,总时长200步。被控对象设定为一个二阶离散传递函数,具有非最小相位或振荡特性(取决于系数配置)。系统同时定义了GPC的关键参数,如最小/最大预测时域(N)、控制时域(Nu)、柔化系数(lambda)等。为了模拟真实工况,初始辨识参数被人为设置了偏差(A多项式偏大10%,B多项式偏小10%),以验证RLS算法的收敛性。
2. 仿真主循环 (Main Loop)
循环从第3步开始推进至仿真结束,每一步执行以下操作:
- 对象仿真:利用真实的系统差分方程计算当前时刻输出 $y(k)$,并叠加设定强度的白噪声。代码逻辑中包含阶跃扰动的判断条件,允许在指定时刻叠加外部干扰。
- 参数辨识:构建数据向量 $phi$,利用带遗忘因子的RLS算法更新参数估计向量 $hat{theta}$。更新协方差矩阵 $P$,实现对系统动态特性的实时跟踪。
- 参考轨迹生成:基于当前时刻的实际输出和未来的目标设定值,利用平滑系数 $alpha$ 生成未来N步的柔化参考轨迹 $w$。
- Diophantine方程求解:调用内部子函数,根据当前辨识得到的模型参数,求解多步预测所需的系数矩阵。
- 滚动优化:
* 构建矩阵形式的预测模型。
* 根据二次型性能指标 $J = sum (w - hat{y})^2 + lambda sum (Delta u)^2$,通过矩阵求逆运算解出最优控制增量序列。
* 记录当前的性能指标函数值(Cost Function)。
- 实施控制:仅取最优序列的第一个分量作为当前的控制增量 $Delta u(k)$。计算实际控制量 $u(k) = u(k-1) + Delta u(k)$,并对其进行
[-5, 5] 的幅值限幅,防止控制量饱和。
3. 数据记录与后处理
系统使用数组记录全过程的输入、输出、参考轨迹、辨识参数演变及性能指标值。循环结束后,调用评估函数计算具体指标,并调用绘图函数展示结果。
关键算法与函数分析
主逻辑 (main)
这是算法的调度中心。它体现了GPC算法的
隐式自校正特性,即控制器参数直接由在线辨识得到的模型参数计算得出(Explicit Self-Tuning Control)。它通过“增量式”CARIMA模型 formulation,自然地引入了积分作用,保证了系统能够无静差地跟踪阶跃信号。
solve_diophantine
该函数是预测控制模型构建的核心。它负责将带有积分特性的CARIMA模型 $A(z^{-1})Delta y(t) = B(z^{-1})Delta u(t-1) + epsilon(t)$ 转化为多步预测形式 $y(t+j) = G_j Delta u(t+j-1) + F_j y(t) + dots$。
- 实现细节:首先将原分母多项式 A 与差分算子 $[1, -1]$ 卷积得到 $tilde{A}$。
- 预测矩阵构建:循环计算未来的阶跃响应系数,填充矩阵 $G$(控制矩阵)。
- 自由响应计算:计算向量 $f$,它代表在未来控制增量为零时,系统仅凭过去的历史输入输出数据产生的自然响应。
get_Ej_Fj
这是一个辅助函数,用于递归求解 Diophantine 方程 $1 = E_j(z)tilde{A}(z) + z^{-j}F_j(z)$。
- 算法逻辑:不依赖MATLAB的高级多项式除法函数,而是手动实现了多项式长除法的递归逻辑。通过迭代,将 $1/tilde{A}$ 分解为商多项式 $E_j$ 和余式多项式 $F_j$,分别对应预测模型中的控制历史影响项和输出历史影响项。
assess_performance
用于量化控制效果的工具函数。它计算了最后10个采样点的平均误差作为稳态误差指标,并针对仿真前段(前100步)的阶跃响应计算超调量百分比,帮助用户直观判断参数调整(如 $lambda$ 或 $N$)对系统动态性能的影响。