MIMO系统迭代学习控制 (ILC) MATLAB仿真
项目介绍
本项目是一个基于MATLAB的仿真程序,专门用于演示针对多输入多输出(MIMO)线性离散系统的迭代学习控制(Iterative Learning Control, ILC)算法。该项目旨在展示如何通过重复的控制尝试,利用历史误差信息不断修正控制输入,从而使系统输出能够高精度地跟踪期望轨迹。
该代码构建了一个具有2个输入和2个输出的线性离散状态空间模型,并采用PD型(比例-微分)迭代学习律,实现了对正弦和余弦时变信号的无静差跟踪。通过直观的图表,项目展示了随着迭代次数增加,系统误差单调收敛的过程。
功能特性
- MIMO系统建模:建立了一个3阶状态、2输入、2输出的离散时间线性状态空间模型,且系统矩阵经过设计保证了开环稳定性。
- PD型迭代学习控制:实现了基于误差及其差分的PD型更新律,利用下一时刻的误差信息(超前校正)来计算当前的控制修正量。
- 自动增益设计:基于系统耦合矩阵(CB)的伪逆来计算最优学习增益矩阵,以确保收敛速度。
- 复杂轨迹跟踪:设定了非恒定的期望轨迹(输出1跟踪正弦波,输出2跟踪余弦波),验证算法的动态跟踪能力。
- 收敛性分析与可视化:自动计算并记录每次迭代的误差范数,并在仿真结束后绘制误差收敛曲线、多轮迭代的输出跟踪对比图以及控制输入信号的演变图。
使用方法
- 确保计算机上已安装 MATLAB 软件(建议版本 R2016b 及以上)。
- 将项目代码保存为
main.m 文件。 - 在 MATLAB 命令行窗口或编辑器中直接运行
main 函数。 - 程序将自动执行50次迭代仿真,并在运行结束后弹出4个图形窗口展示结果。
系统要求
- MATLAB (基础版即可,无需特殊工具箱,代码仅使用基础矩阵运算)
代码实现逻辑详解
代码完全包含在
main.m 文件中,其内部逻辑流程严格按照以下步骤执行:
1. 系统参数初始化
代码首先定义了离散系统的核心矩阵:
- 状态矩阵 A (3x3):特征值位于单位圆内,确保系统本身是稳定的。
- 输入矩阵 B (3x2) 和 输出矩阵 C (2x3):构成了2输入2输出的系统结构。
- 初始状态 x0:初始化为零向量。
2. 仿真参数与期望轨迹设置
- 设定单次运行的时间步长 N=100。
- 设定最大迭代次数 MaxIter=50。
- 构造期望输出矩阵 Yd:第一通道为正弦波,第二通道为余弦波,作为系统需要学习的参考目标。
- 相对阶检查:计算 $CB$ 矩阵的秩,以验证系统输入输出之间的直接耦合关系,确保学习律设计的合理性。
3. ILC 控制器参数设计
采用PD型学习律,其增益设计策略如下:
- 学习率因子 Lambda:设定为 0.6,用于调节整体收敛速度。
- 比例增益 Kp:计算 $CB$ 的伪逆并乘以学习率,近似逆模型以解耦系统。
- 微分增益 Kd:设定为 $Kp$ 的 10%,用于增加对误差变化率的响应。
- 此类设计针对相对阶为1的系统,利用 $e(k+1)$ 进行控制量更新。
4. 迭代主循环
程序执行的核心部分,包含50次循环,每次循环代表一次完整的实验过程:
- 系统演化:
* 重置状态 $x$ 到初始值。
* 在时域 $k=1$ 到 $N$ 能够使用当前的控制律 $u_current$ 驱动系统。
* 记录全过程的实际输出 $y$。
- 误差计算:
* 计算期望轨迹 $Yd$ 与实际输出 $y$ 之间的差值。
* 计算误差矩阵的 Frobenius 范数,作为当前迭代的性能指标并存入
Error_Norm_History。
- 数据记录:
* 判断当前迭代次数是否为预设的关键节点(第1、10、20、50次)。如果是,则保存当前的输出曲线和控制输入曲线,用于后续绘图对比。
- 控制律更新 (Update Law):
* 遍历时间步 $k=1$ 到 $N-1$。
*
取样误差:提取下一时刻误差 $e(k+1)$ 和当前时刻误差 $e(k)$。这里选取 $k+1$ 时刻误差是因为对于该离散系统,$u(k)$ 能够直接影响 $y(k+1)$。
*
计算修正量:根据公式 $Delta u = Kp cdot e(k+1) + Kd cdot (e(k+1) - e(k))$ 计算增量。
*
叠加更新:将修正量叠加到当前控制律上,生成下一次迭代的控制律 $u_next$。
5. 结果可视化
代码最后部分负责生成图表:
- 图1:绘制误差范数的对数收敛曲线,展示学习过程的收敛速度。
- 图2 & 图3:分别展示输出通道1和通道2在不同迭代次数下的跟踪效果,清晰可见输出曲线如何逐渐逼近期望轨迹。
- 图4:展示控制输入信号随迭代次数的演变,反映控制器学习到的输入波形。
关键算法说明
PD型迭代学习更新律
代码中实现的核心算法公式如下:
$u_{i+1}(k) = u_i(k) + K_p e_i(k+1) + K_d [e_i(k+1) - e_i(k)]$
- 这里 $i$ 表示迭代次数,$k$ 表示时间步。
- 该算法利用了离散系统的因果特性,通过引入 $e(k+1)$(通常称为超前学习)来补偿系统的相对阶滞后。
- $K_p$ 项负责消除主要的跟踪误差,$K_d$ 项(差分项)提供类似于微分控制的作用,有助于抑制振荡并改善瞬态响应。
- $CB$ 矩阵的伪逆用于处理MIMO系统的耦合问题,使得两个输入能够独立地解耦控制两个输出。