
简介这份系统辨识教案面向自动化专业学生与相关工程技术人员围绕从输入输出数据中建立系统模型这一核心问题展开帮助读者掌握辨识理论、实验设计与编程计算能力。内容涵盖实体与模型的分类、Zadeh 辨识定义的三要素、辨识目的与模型类选择以及从明确目的、收集先验知识、设计试验到结构辨识、参数估计、模型检验与转换的完整步骤并以长网造纸过程定量与水份控制为例贯穿讲解。资源包为1个doc文档约1.42MB结构紧凑适合作为课程自学与复习的主线材料。已有148人学习下载。读者可据此梳理最小二乘等数据拟合方法的适用条件理解辨识实验设计与报告撰写的考核要求并借助参考书目与期刊线索进一步深入递归辨识、过程辨识等方向为后续控制算法设计与预测分析打下基础。1. 系统辨识教案从“黑匣子”到可交付讲义的落地路径带过自动化专业课程的人多半有过这种体验课上讲最小二乘学生点头一布置作业数据一换全翻车。问题不在数学在于教材里的例子太干净而真实系统永远带着噪声、时延和量纲不统一。系统辨识教案要解决的正是这个断层——它把“怎么从输入输出数据里反推一个能用的模型”拆成可讲、可练、可验收的教学单元。适合两类人一是要给自动化专业备一门 32 到 48 学时课的教师二是想自学系统辨识但被推导劝退的工程师。这篇笔记按“先立框架、再跑最小例子、最后避坑”的顺序把一份能直接上课的教案结构讲清楚。2. 教案骨架怎么搭从课时分配到模型族选择一份系统辨识教案最容易犯的错是把它写成《系统辨识与自适应控制》那本专著的缩水版。学生还没搞懂什么叫持续激励就被灌了一堆递推算法。我的做法是先定课时骨架再往每个格子里填模型族最后才补数学推导。2.1 32 学时与 48 学时的两种排法自动化专业本科阶段系统辨识通常作为独立选修或嵌在“自动控制原理”之后的专题。32 学时适合只讲经典辨识48 学时可以把子空间法和闭环辨识带进来。下面这张表是我实际用过的分配按“理论—实验—讲评”三段切模块32 学时48 学时核心产出辨识问题定义与数据预处理46能判断一段数据是否可辨识非参数辨识脉冲/阶跃/相关分析68会做阶跃响应法估一阶纯滞后最小二乘族LS/RLS/广义LS812能推导并实现 RLS模型阶次与结构选择46会用 AIC/F 检验定阶闭环与多变量辨识入门48理解闭环可辨识条件综合实验与讲评68提交一份完整辨识报告32 学时里最小二乘族占 8 学时是底线因为它是后面所有算法的母语。48 学时多出来的 16 学时我一般把 4 学时给子空间法N4SID 的直观解释4 学时给闭环辨识的可辨识性条件剩下 8 学时全部投进实验讲评——学生自己跑出来的数据讲评一次比讲三遍理论管用。2.2 模型族选择先离散还是先连续这是教案里第一个要拍板的事。教材习惯从连续传递函数讲起但学生上机跑的是离散数据。我的经验是先离散后连续。理由有三条。第一计算机采集到的就是离散序列最小二乘的矩阵形式天然是离散的。第二离散模型可以直接递推RLS 的推导不用碰微分方程。第三连续模型可以通过零阶保持器离散化得到反过来做要解微分方程教学成本高。具体到模型族教案里至少要覆盖这四类按引入顺序排ARX结构最简单$A(z^{-1})y(k)B(z^{-1})u(k)e(k)$适合第一次讲最小二乘。ARMAX把噪声也建模成滑动平均$A y B u C e$用来讲有色噪声下的偏差问题。OE输出误差$y(k)\frac{B(z^{-1})}{F(z^{-1})}u(k)e(k)$适合讲迭代辨识。状态空间为子空间法铺路$x(k1)Ax(k)Bu(k)$。教案里不必把每个模型的推导都写全但每个模型至少要配一个“什么时候用它”的判断句。比如 ARX 在信噪比高、噪声白的情况下够用一旦残差自相关图出现明显拖尾就得换 ARMAX 或 OE。2.3 实验平台用仿真数据还是真实装置这是教案落地时最现实的问题。真实装置比如温控箱、直流电机有仪式感但调试周期长一个班 30 人轮不过来。我的折中方案是仿真数据打底真实装置做拔高。仿真数据用 Python 或 MATLAB 生成学生可以任意改信噪比、改采样周期、改输入信号类型。下面这段代码是我教案里第一个实验的生成脚本学生拿到就能跑import numpy as np # 生成二阶系统离散模型y(k) 1.5y(k-1) - 0.7y(k-2) 0.5u(k-1) 0.2u(k-2) np.random.seed(42) N 500 u np.random.randn(N) # 白噪声输入满足持续激励 y np.zeros(N) for k in range(2, N): y[k] 1.5*y[k-1] - 0.7*y[k-2] 0.5*u[k-1] 0.2*u[k-2] y[k] 0.05 * np.random.randn() # 加 5% 观测噪声 # 保存为教案实验数据 np.savez(sysid_exp1.npz, uu, yy) print(数据已生成输入方差:, np.var(u), 输出方差:, np.var(y))这段代码的关键参数有三个。np.random.seed(42)保证每次生成的数据一致方便讲评时对照。u用白噪声而不是正弦是因为白噪声的频谱覆盖全频段满足持续激励条件学生用最小二乘估出来的参数才唯一。噪声幅度0.05对应大约 5% 的信噪比这个水平下 ARX 还能估准再大就得引入辅助变量法。真实装置则放在课程后半段用一套直流电机调速平台让学生自己设计阶跃和伪随机输入对比仿真和实测的差异。3. 最小二乘怎么讲才不劝退从矩阵形式到 RLS 递推最小二乘是系统辨识教案里最硬的一块骨头。学生卡住的地方通常不是公式本身而是不知道这个公式在干什么。我的讲法是先把它还原成一个“找一条直线让误差平方和最小”的问题再推广到矩阵。3.1 从一次函数拟合到 ARX 模型先给一组散点让学生用肉眼找一条直线。然后写出误差平方和 $J\sum(y_i - ax_i - b)^2$对 $a$ 和 $b$ 求偏导令其为零。这一步学生都熟。接着把 $x_i$ 换成 $u(k-1)$把 $y_i$ 换成 $y(k)$把 $a$ 和 $b$ 换成模型参数就得到了 ARX 的最小二乘形式$$\hat{\theta} (\Phi^T\Phi)^{-1}\Phi^T Y$$其中 $\Phi$ 是回归矩阵每一行是 $[-y(k-1), \dots, -y(k-na), u(k-1), \dots, u(k-nb)]$。这个“换元”过程要慢讲因为它是从拟合到辨识的认知跳跃。3.2 批量最小二乘的 Python 实现与参数说明教案里必须有一个学生能自己敲一遍的批量 LS 实现。下面这段代码对应 2.3 节生成的数据import numpy as np data np.load(sysid_exp1.npz) u, y data[u], data[y] na, nb 2, 2 # 模型阶次对应 y(k-1),y(k-2) 和 u(k-1),u(k-2) N len(y) # 构造回归矩阵从第 max(na,nb) 个点开始 start max(na, nb) Phi np.zeros((N - start, na nb)) Y y[start:] for i in range(N - start): k start i Phi[i, :na] -y[k-1:k-na-1:-1] # 注意负号和倒序 Phi[i, na:] u[k-1:k-nb-1:-1] # 批量最小二乘 theta np.linalg.inv(Phi.T Phi) Phi.T Y print(估计参数:, theta) print(真值: [1.5, -0.7, 0.5, 0.2])这段代码有三个容易翻车的点。第一Phi的构造里-y[k-1:k-na-1:-1]这个切片步长-1表示倒序学生经常写成正序导致参数对不上。第二start max(na, nb)是为了保证每个回归向量都有完整的历史数据如果从 0 开始会引入零填充估计结果有偏。第三np.linalg.inv在矩阵接近奇异时会报错或给出巨大数值实际教案里我会让学生改用np.linalg.lstsq并对比两者的差异引出条件数的概念。3.3 RLS 递推从批量到在线批量 LS 讲完紧接着上 RLS因为这是“在线辨识”的入口。RLS 的核心是把矩阵求逆换成递推更新避免每来一个新数据就重算一遍逆矩阵。教案里的推导可以简化但三个公式必须写清楚$$K(k) \frac{P(k-1)\phi(k)}{\lambda \phi^T(k)P(k-1)\phi(k)}$$ $$\hat{\theta}(k) \hat{\theta}(k-1) K(k)[y(k) - \phi^T(k)\hat{\theta}(k-1)]$$ $$P(k) \frac{1}{\lambda}[I - K(k)\phi^T(k)]P(k-1)$$其中 $\lambda$ 是遗忘因子取 1 时退化为标准 RLS取 0.95 到 0.99 之间时对新数据加权适合时变系统。教案里要强调$P$ 的初值一般取 $10^4 I$ 到 $10^6 I$太小会导致初期收敛慢太大会导致初期参数跳变。这个参数没有理论最优靠实验试。4. 模型阶次与结构选择AIC 准则和残差检验怎么用参数估出来了阶次选错了模型照样不能用。这一章讲教案里怎么教学生定阶和验模。4.1 AIC 与 F 检验的实操对比AIC 的定义是 $\text{AIC} N\ln(\hat{\sigma}^2) 2p$其中 $p$ 是参数个数。教案里让学生对 $na$ 和 $nb$ 从 1 到 5 遍历算 AIC取最小值。但 AIC 在样本量小时容易过拟合所以我会同时教 F 检验比较两个嵌套模型的残差平方和看增加阶次是否显著降低残差。下面这段代码把两种方法放在一起import numpy as np def compute_aic(y, y_hat, p): N len(y) sigma2 np.mean((y - y_hat)**2) return N * np.log(sigma2) 2 * p # 假设已对 na,nb 从 1 到 5 遍历得到残差平方和 RSS 列表 # 这里用模拟数据演示 F 检验 RSS1, p1 0.85, 4 # 低阶模型 RSS2, p2 0.62, 6 # 高阶模型 N 500 F ((RSS1 - RSS2) / (p2 - p1)) / (RSS2 / (N - p2)) print(F 统计量:, F, 查表临界值约 3.0α0.05)AIC 的坑在于它假设噪声是白的如果残差有色AIC 会偏向高阶。F 检验的坑在于它只适用于嵌套模型ARX 和 ARMAX 之间不能直接比。教案里要让学生两种都跑然后讨论不一致时怎么取舍。4.2 残差白噪声检验自相关图和置信区间模型验模最直观的方法是看残差的自相关函数。如果残差是白噪声自相关图应该在零附近波动且大部分落在 $\pm 1.96/\sqrt{N}$ 的置信区间内。教案里让学生用 matplotlib 画出来比看数字直观得多。import numpy as np import matplotlib.pyplot as plt residual np.random.randn(500) # 这里用白噪声演示实际用模型残差 N len(residual) lags range(0, 21) acf [np.corrcoef(residual[:-k], residual[k:])[0,1] if k0 else 1.0 for k in lags] conf 1.96 / np.sqrt(N) plt.stem(lags, acf) plt.axhline(conf, colorr, linestyle--) plt.axhline(-conf, colorr, linestyle--) plt.title(残差自相关函数) plt.show()如果自相关图在某个滞后阶明显超出置信区间说明模型结构没抓住那部分动态需要升阶或换模型族。这个判断过程要让学生自己动手教案里只给步骤不给结论。5. 避坑与常见问题教案落地时最容易翻车的五件事这一章是我带过几轮课后攒下来的血泪经验每一条都对应一个具体的翻车现场。现象一学生用阶跃响应估一阶模型估出来的时间常数和真值差一倍。原因阶跃响应的初始段受噪声影响大学生取 63.2% 点的时候取错了位置。 解决教案里明确要求用多点拟合而不是单点取 63.2%。具体做法是在 10% 到 90% 上升区间取 20 个点做最小二乘拟合。现象二RLS 跑着跑着参数发散输出 NaN。原因$P$ 矩阵初值给得太大或者遗忘因子 $\lambda$ 取太小导致协方差矩阵失去正定性。 解决教案里规定 $P(0)10^4 I$$\lambda$ 不低于 0.95。如果还发散加一个协方差重置机制每 100 步把 $P$ 重置为 $10^4 I$。现象三仿真数据估得准一换真实电机数据就偏。原因真实数据有量化误差和未建模的动态比如电机的死区。 解决教案里在真实装置实验前先让学生对实测数据做差分预处理去掉直流分量再跑辨识。同时把评价指标从“参数误差”改成“输出预测误差”更贴近工程实际。现象四AIC 选出来的阶次比真实阶次高两阶。原因噪声不是白的AIC 的似然项被有色噪声抬高了。 解决教案里要求同时看残差自相关图如果残差有色先用 ARMAX 或 OE 结构再定阶。现象五学生把输入输出数据直接丢进最小二乘结果参数完全不对。原因数据没有去均值回归矩阵里混入了直流偏置。 解决教案第一步就强制要求u u - np.mean(u)和y y - np.mean(y)并在报告里写明这一步。6. 从教案到学生报告一份可复现的评分量规最后一章讲怎么把教案变成可验收的学生产出。我带课的习惯是教案里每讲一个算法就配一个“最小可交付报告”模板。学生不用写长篇大论但必须包含四样东西数据来源与预处理、模型结构与阶次选择依据、参数估计结果与真值对比、残差检验图。评分量规我一般按下面这张表给权重可以根据课时调整评分项权重合格标准加分项数据预处理20%去均值、去趋势、说明采样周期做了异常值剔除模型结构选择25%给出阶次选择依据AIC 或 F 检验对比了两种以上结构参数估计30%参数误差小于 10%用了 RLS 并展示收敛曲线残差检验25%自相关图在置信区间内做了交叉验证这个量规的好处是把“玄学”变成了可打分的项。学生知道残差检验占 25%就不会只贴一个参数结果就交差。进阶用法上我会让学有余力的学生做一件事把辨识出来的模型拿去做预测控制仿真看控制效果对辨识误差有多敏感。这一步能把系统辨识和后续课程串起来学生也更有动力。具体做法是用辨识得到的 ARX 模型设计一个广义预测控制器GPC然后人为把模型参数偏置 5%、10%、20%观察闭环响应的超调量和调节时间变化。下面这段伪代码展示了思路# 用辨识模型设计 GPC并测试参数失配的影响 theta_hat np.array([1.5, -0.7, 0.5, 0.2]) # 辨识结果 for bias in [0.05, 0.10, 0.20]: theta_test theta_hat * (1 bias) # 人为偏置 # 用 theta_test 构造预测模型跑闭环仿真 # 记录超调量和调节时间 print(f偏置 {bias*100:.0f}%: 超调量变化待记录)这个练习的教训是辨识精度不是越高越好而是要和控制器鲁棒性匹配。我见过学生花大力气把参数误差压到 1%结果控制器对 5% 的失配毫无容忍度反而不好用。所以教案最后要留一句话先问模型拿来干什么再决定辨识做到什么精度。希望帮到你。本文还有配套的精品资源点击获取