☰
系统辨识与建模实战:M序列试验设计与最小二乘参数估计
2026/11/3 10:53:59 网站建设 项目流程

简介:这份系统辨识教案面向自动化及相关专业的本科生、研究生与自学者,围绕“从输入输出数据中建立可描述系统行为的模型”这一核心问题展开,适合作为课程配套教材或期末复习、课题入门参考。压缩包内为1个doc文档,体积约1.42MB,内容以讲义形式串联起实体与模型的概念辨析、直觉模型、物理模型与数学模型的分类,以及由Zadeh提出的数据、模型类、准则三要素,并列出徐南荣《系统辨识》、方崇智与萧德云《过程辨识》、Ljung与Soderstrom《递归辨识理论与实践》等参考书目及期刊来源。文档还完整梳理了辨识的一般流程:明确目的、收集先验知识、设计试验、现场准备与数据采集、预处理、模型类选择、结构辨识与参数估计、模型检验与转换,并以长网造纸过程中定量与水份的质量控制为贯穿案例,配以伪随机序列激励、采样频率设定等试验细节和考核办法说明。目前已有151人学习,便于读者按课时节奏自学理论并完成编程辨识报告。

1. 从一份 40 学时教案说起:先搞清楚它到底在解决什么

拿到这份《系统辨识与建模》教案,我先翻的是最后那栏考核办法——给一个数据文件,自己编程辨识,写报告。这个安排把课程性质说透了:它不指望你背熟 Zadeh 的定义,而是要求你拿着一堆带噪声的输入输出序列,最终交出一个能用于控制、预测或故障诊断的模型。40 学时、十一 步流程、造纸定量与水份的例子、M 序列的谱线密度,一条完整的工程路径已经摆在那儿。所以这份系统辨识教案的价值不在理论推导有多深,而在于它把“从现场到模型”这件事拆成了可执行的动作。适合自动化、过程控制方向要动手建模的人,也适合被“给一组数据、辨识个模型”这类任务卡住过的从业者。

2. 三要素先立住:目的、模型类、准则怎么互相倒推

2.1 为什么“哪个算法更好”这句话在辨识里不成立

Zadeh 在 1962 年给的定义是:辨识就是在输入和输出数据的基础上,从一组给定的模型类中,确定一个与所观测系统等价的模型。这句话本身没多少信息量,真正有用的是它拆出来的三要素——数据、模型类、准则。

数据来自对实体的观测,不唯一,受观测时间、观测目的、观测手段影响;模型类规定模型的形式,不唯一,受辨识目的和方法影响;准则规定“等价”的评判标准,同样不唯一。三要素里任何一项变了,方法优劣的结论都会翻转。

这句话的实际含义是:脱离三要素去比较算法毫无意义。最小二乘在方程误差准则下是线性闭式解,换成输出误差准则立刻变成非线性优化;同一批数据,把采样间隔改一倍,最优阶次就变了。所以教案里那句话要在动手前反复默念——只有在相同的三要素下,才可区分数据拟合方法的优劣。

顺着这个逻辑往下,辨识目的就成了第一决策点,因为它同时约束了三件事:怎么观测数据、选什么模型类、用哪套准则。教案里给了一张对应关系,我把它整理成可以直接查的表:

模型用途必须准确的量模型类倾向准则倾向
验证理论模型零极点、阶次、时延、参数与理论模型同结构参数误差
常规控制器设计动态响应、零极点、时延便于频域分析的传递函数输出误差
数字控制器设计动态响应、时延便于计算机运算的差分方程方程误差
仿真/训练系统动态响应便于模拟实现的模型输出误差
预报预测动态响应、时延便于在线运算的模型输出误差
过程监视、故障诊断参数本身能直观对应物理量的模型参数误差
定量与定性分析静态关系结构简单、便于人脑判断静态拟合误差

这张表最容易踩的地方是“故障诊断”那一行。做诊断的人经常顺手拿一个高阶 ARX 去拟合,拟合度刷到 0.99,但参数和任何物理量都对不上,模型等于白建。诊断要的是参数可解释,宁可降阶、宁可牺牲一点拟合度,也要让每个系数能指回一个具体的工艺量。

2.2 模型分类不是背概念,是选型表

教案从实体与模型的关系讲起:模型是对实体的简化描述,保留一部分特征,忽略或变化其余特征,不同的简化方法得到不同的模型。接着分三层——直觉模型(地图、照片、软件演示文档)、物理模型(风洞、水力学模型、电力系统动态模拟)、数学模型。

数学模型再往下分四类:图表模型(阶跃响应、脉冲响应、频率响应、温度与热电偶输出关系表)、解析模型(代数方程、微分方程、差分方程、状态方程)、程序模型(神经网络仿真程序)、语言模型(模糊关系模型)。获得方式有经验总结法、机理分析法、实验法、数据拟合法——用数据拟合法得到解析模型,这就是系统辨识。

真正影响动手的是对象特性这一层。我把教案里散落的分类整理成一张对照表,建模前先在这张表上打勾,比直接开写脚本省事得多:

维度分类建模含义
时间静态 / 动态静态只看输入输出关系;动态模型的有效性会随时间变化,需要经常修订
空间集中参数 / 分布参数前者反映变量与时间的关系,用常微分方程;后者反映时空关系,用偏微分方程
描述序列(权函数)/ 方程序列给出标准输入下的响应;方程给定输入能算出输出
叠加线性 / 非线性线性满足 ay1+by2=f(au1+bu2);非线性要上 Volterra 级数,参数量爆炸
参数时变 / 时不变时变要上遗忘因子或在线跟踪,否则模型很快失效
扰动确定型 / 随机型实际系统几乎都含随机扰动,强度用噪信比 σW/σX 度量
变量数单变量 / 多变量多变量要处理耦合,试验时要做正交化
时间域离散 / 连续计算机采样辨识一般直接建离散模型
延迟有时延 / 无时延时延要单独估,估错了整个动态全歪

教案里的造纸例子正好把这套表用了一遍。质量控制要控制成品纸的定量 G 与水份 W,二者与纸浆浓度 D、流量 F、车速 V、蒸汽压力 P 有关:G=f(D,F,V,P),W=g(D,F,V,P)。现场调查拿到的先验知识有四条:车速调整存在同步困难,不同步会引起断纸,所以车速设为恒定;流量到定量的延迟约 60 秒、响应过程约 2 秒;浓度到定量的延迟约 120 秒、响应过程约 80 秒;蒸汽压力到水份的延迟约 45 秒、响应过程约 60 秒。

这四条信息直接决定了模型边界:车速从输入里划掉,作为边界外的稳定量;流量和浓度的过渡过程差了两个数量级,不能塞进同一个采样间隔里建;蒸汽压力只影响水份,可以单独分块。所谓“建模”,一大半功夫花在这张表怎么填上。

2.3 十一步流程拆成可执行的动作与交付物

教案给的流程是十一步,看着长,但如果每一步都落一个交付物,其实是一条很干净的流水线。我按自己的习惯把它重排成“动作 + 交付物”的形式:

步骤动作交付物
1 明确辨识目的确定模型最终拿去干什么一句话目的 + 精度要求
2 收集先验知识现场调查,划清系统边界输入输出清单、时延估计、噪信比
3 设计辨识试验分块、选激励、定采样试验方案:信号类型/幅值/步宽/采样间隔/时长
4 现场准备接线、限幅、滤波、标定接线记录、零点与放大倍数
5 数据采集采集并存盘数据文件 + 数据说明文件
6 数据预处理校正、滤波、重抽样、标准化可直接进算法的数据矩阵
7 选择模型类应用模型 + 参考模型结构候选集合
8 结构辨识与参数估计编程拟合阶次、时延、参数
9 模型检验按准则检验检验结论,不通过则回退
10 模型转换参考模型转应用模型可直接投用的模型
11 应用评价从应用角度再评一次评价结论

这里有两个容易被跳过的点。第一个是第 5 步的“数据说明文件”——采样间隔、量程、零点、每列的含义、哪段时间有异常。少了这份文件,三个月后连自己都看不懂那堆 CSV。第二个是第 9 步的回退机制:模型检验不通过,要能说清是回到第 3 步重做试验,还是回到第 6 步重做预处理,还是只需回第 8 步换阶次。分不清回退到哪一步,就只能一次次重跑,这就是返工的开始。

提示:第 7 步里“应用模型”和“参考模型”是两个东西。应用模型按用途选(比如控制器设计要传递函数),参考模型按便于做结构辨识和参数估计选(比如 ARX 差分方程)。先建参考模型,再转成应用模型,顺序不能反。

第 3 步的试验设计是整条链上性价比最高的一环,下一章单独拆。

3. 激励信号与试验设计:M 序列的阶次、步宽与采样间隔怎么算

3.1 白噪声、有色噪声和那个谱密度关系

教案在“数据”这一节花了很多篇幅讲随机过程,原因是激励信号的设计完全建立在谱密度之上。几个定义要理清:随机过程 X(t) 在每个时间点都是随机变量,概率密度函数随时间变化;平稳随机过程的概率分布不随时间变;各态遍历平稳随机过程再加一条——时间平均等于集合平均,实际工程里能算的只有时间平均,所以默认对象是各态遍历的。

白噪声的定义是零均值、平稳、谱密度为常数的随机过程。它有三条性质直接决定用途:自相关函数是 σ²δ(τ),只有 τ=0 处非零;频谱宽度无限;无记忆性,不同时刻的取值互不相关。

关键在维纳—辛钦关系式:随机过程的谱密度与自相关函数构成一对傅立叶变换。由此可以推出线性系统在随机输入下的输出谱密度 S_y = |G|² S_u。这条式子说明一件事:要把系统激励充分,输入信号的频谱必须比系统频谱更宽。输入谱窄于系统带宽,高频段的信息根本没进数据,再怎么调算法也补不回来。

白噪声在辨识里有五个用途,前三个是激励,后两个是判据:作为系统输入时互相关序列等于脉冲响应;作为输入能激发所有模态;能防止数据病态、保证辨识精度;用输出估计误差是否具有白色性来判断方法优劣和结构是否合适;还可以作为成形滤波器的输入来产生有色噪声。

物理上不存在理想白噪声,工业现场常见的是有色噪声。教案给的表示定理很有用:设平稳噪声序列 {e(k)} 的谱密度是 ω 的实函数,必定存在一个渐近稳定的线性环节 H(z⁻¹),在白噪声输入下输出就是 {e(k)}。这个环节叫成形滤波器。它的实际含义是:遇到有色噪声不要硬扛,把它建模成“白噪声过某个滤波器”,噪声模型就变成了几个待估参数。

3.2 M 序列的谱特性与逆重复 M 序列

白噪声幅值不可控,现场不敢用。工程上的替代品是二位式最大长度伪随机序列,也就是 M 序列。

它的构造是 n 级移位寄存器加反馈,周期 N=2ⁿ-1,是 n 个寄存器能表示的最多非零状态数。几个性质要记住:一个周期内有 2ⁿ⁻¹ 个游程,长度 1 的有 2ⁿ⁻² 个,长度 2 的有 2ⁿ⁻³ 个,依次类推,最后长度为 n 的游程只有 1 个;一个周期中 1 的个数比 0 多 1。若把 0 换成 -1,自相关函数为 R_M(τ)=1(τ=iN)和 R_M(τ)=-1/N(其余)。

看频谱的话有三条结论:谱线是离散线条谱而不是光滑曲线;直流分量与 N² 成正比,加大 N 可以压低直流;带宽约为 1/Δt(Δt 是一步的持续时间),减小 Δt 可以增加带宽;谱线密度与 N 成正比。

拿它当扰动信号有三个好处:幅值只取 ±a,容易按安全工况选,N 足够大时均值接近 0;一个周期内自相关近似 δ 函数,所以以 M 序列为输入时,互相关序列就等于脉冲响应序列,前提是 N 大于过渡过程长度;多输入单输出时,同一条 M 序列的不同移位序列之间近似正交,只要输出对各输入的过渡过程都小于移位间隔 J。

逆重复 M 序列是把 M 序列与方波序列相乘得到的,周期变成 2N,一个周期里 1 和 -1 的个数相等。它的自相关在 τ=0 处是 1,在 τ=N 处是 -1,其余为 0。相比普通 M 序列,它多了一个好处:没有直流分量,长时间施加不会把工况整体推偏。

生成一条 M 序列不难,难的是初值和抽头选对。下面这段代码直接可用,n 阶配本原多项式的抽头:

import numpy as np def mls(n, taps, periods=1, amp=1.0): """生成 n 阶 M 序列(二位式最大长度伪随机序列) n : 阶次,周期 N = 2**n - 1 taps : 反馈抽头(1 基),需对应本原多项式,例如 4 阶用 (4, 3) periods: 输出多少个完整周期 amp : 幅值 a,输出为 +a / -a """ N = 2 ** n - 1 state = [1] * n # 初值不能全 0,否则反馈恒为 0,寄存器锁死 bits = [] for _ in range(N * periods): bits.append(state[-1]) # 取末级作为输出 fb = 0 for t in taps: # 抽头异或得到反馈位 fb ^= state[t - 1] state = [fb] + state[:-1] # 右移一位,反馈位进最高位 bits = np.array(bits) return np.where(bits == 1, amp, -amp) def acf_norm(x, max_lag): """归一化自相关,用于验证 M 序列的自相关形状""" x = x - x.mean() N = len(x) r = np.array([np.dot(x[:N - k], x[k:]) / N for k in range(max_lag)]) return r / r[0] x = mls(4, (4, 3), periods=3, amp=1.0) r = acf_norm(x, 20) print("周期应为", 2**4 - 1, ",长度", len(x)) print("R(0)=%.3f R(1)=%.3f 理论非零延迟约 %.3f" % (r[0], r[1], -1/15))

代码里taps必须对应本原多项式,选错了周期会退化。4 阶对应 x⁴+x³+1,抽头写 (4,3);5 阶常用 x⁵+x³+1,写 (5,3);6 阶用 x⁶+x⁵+1,写 (6,5)。打印出来的 R(1) 应该非常接近 -1/N,偏离太多说明抽头不对或周期没取满。多输入场景还可以再验一次移位正交性:把x和np.roll(x, J)做互相关,J 大于各输入过渡过程的最大值时,互相关应该在 0 附近抖。

3.3 n、Ts、T0 的设计算例与试验报告要素

教案给了两套设计方法。第一套从过渡过程时间 T 出发:

先确认系统过渡过程时间 T;最高工作频率按 fmax=(3~15)/T 取,记 fmax=k/T;由 1/Ts>3·fmax 得 Ts=T/(3k);再代入 1.5T<(2ⁿ-1)Ts,得到 4.5k=2ⁿ-1,解出阶次 n。

第二套更省事:确认 T 后先选 n,再由 nTs=(0.1~0.8)T 反算 Ts。

举个例子。设某回路过渡过程 T=60 秒,取 k=5,则 fmax=5/60≈0.083 Hz,Ts=60/(3×5)=4 秒。代入 4.5k=22.5,需要 2ⁿ-1≥22.5,n=5 时周期 31 满足。整周期时长 31×4=124 秒,按 3~5 个周期取数据,试验时长 372~620 秒。

多输入单输出还要加一条约束:(2ⁿ-1-1)·Ts>1.5·Σ(输出对各输入的过渡过程时间)。假设两个输入的过渡过程分别是 60 秒和 80 秒,Σ=140,要求 (2ⁿ-1-1)×4>210,即 2ⁿ-1>53.5,n=6 时周期 63,(63-1)×4=248 秒满足。注意这里用的是 N-1 而不是 N,因为要留出一个移位间隔 J 做正交化。

采样间隔单独定:满足香农定理 1/T0>2·fmax;有扰动信号时还要 T0<Ts,且 Ts 必须是 T0 的整数倍。这一条是硬约束,后面第 5 章会看到不遵守它会有多麻烦。

试验报告要写清的东西,教案列了:上述全部参数,加上人员组织,报批。我一般还会补三样:扰动信号发生器的预发验证记录、现场干扰测试结论、模数转换的零点与放大倍数。这三样在现场准备阶段做完,写进报告,后面出问题能直接对照。

4. 从原始数据到参数:预处理、最小二乘与残差检验

4.1 预处理四件事与标准化反演公式

采集回来的原始数据不能直接进算法,教案列了四件事。

传感器非线性校正是按厂家给的静态非线性曲线编制程序,对相应采样数据逐点校正。这一步容易被省,但当传感器工作在量程边缘时,非线性误差会直接污染参数。

滤波要注意的是:对输入输出加相同的滤波器,输入输出关系不变。这句话是救命条款,滤波器加错边,模型必歪。如果只滤输出不滤输入,等于给系统额外串了一个环节,辨识出来的传递函数会多出零点。

重抽样针对过渡过程较长的子系统,重新选采样间隔,目的是降低模型阶次。采样间隔增大一倍,模型阶次大致减少一半,这个经验关系在阶次搜索时很有用。

标准化是零均值、单位方差,目的是降低舍入误差、防止病态方程、提高计算精度。这一步的数学细节值得写清,因为反演时最容易算错。

原始方程写成 y(k)+a·y(k-1)=b·u(k-1)+c·u(k-2)+d。先减均值:由于各变量的均值满足同一关系,常数项 d 被吸收掉,得到 Y(k)+a·Y(k-1)=b·U(k-1)+c·U(k-2)。再除以标准差,得 Yσ(k)+a·Yσ(k-1)=B·Uσ(k-1)+C·Uσ(k-2),其中 B=b·σu/σy,C=c·σu/σy。

反演公式是 b=B·σy/σu,c=C·σy/σu。注意极点和时延不受标准化影响,所以先在标准化数据上估出 a,再反演增益,顺序不能乱。下面的函数把这两步封在一起:

import numpy as np def standardize(u, y): """零均值、单位方差标准化,返回标准化数据与反演所需统计量""" mu_u, mu_y = u.mean(), y.mean() sd_u, sd_y = u.std(ddof=0), y.std(ddof=0) return (u - mu_u) / sd_u, (y - mu_y) / sd_y, (mu_u, mu_y, sd_u, sd_y) def inv_gain(B, C, stats): """把标准化下的 B、C 反演回物理量纲下的 b、c""" _, _, sd_u, sd_y = stats return B * sd_y / sd_u, C * sd_y / sd_u # 示例:两输入两输出的差分方程,先标准化再反演,避免量纲差 3 个数量级时方程病态

标准差用ddof=0还是ddof=1影响很小,但全流程要统一,否则反演出来的增益会有零点几个百分点的偏移。数据量少于 200 点时建议用ddof=1。

4.2 方程误差、输出误差与批处理最小二乘

准则这一节,教案分了四种误差定义,实际动手只要分清两类。

参数误差 J=Σ(θ̂-θ)²/n 只适合算法研究,因为真值从来不知道。

方程误差 J=Σe(k)²/N,其中 e(k)=y(k)+a·y(k-1)-b·u(k-1)-c·u(k-2)。它的关键性质是 J 是参数的线性函数,只能作一步预测,对应 ARX 模型结构。线性意味着有闭式解,算得快。

输出误差 J=Σe(k)²/N,其中 e(k)=y(k)-ŷ(k),ŷ 由模型仿真递推得到。J 是参数的非线性函数,能作多步预测,对应 OE 结构,要用迭代优化。

白化误差加权准则是 J=Σe(k)ᵀW e(k)/N,多变量时用。

对刚上手的情况,我一般建议先跑 ARX 把量级摸清,再考虑 OE。ARX 的批处理最小二乘写起来很短:

import numpy as np def build_arx(u, y, na, nb, d): """构造 ARX 回归矩阵 na: 输出滞后阶数 nb: 输入滞后项数 d: 纯时延(采样周期数) 模型: y(k) + a1*y(k-1) + ... = b1*u(k-d) + ... + bnb*u(k-d-nb+1) + e(k) """ start = max(na, nb + d) Phi, Y = [], [] for k in range(start, len(y)): row = [-y[k - i] for i in range(1, na + 1)] row += [u[k - d - i] for i in range(nb)] Phi.append(row) Y.append(y[k]) return np.array(Phi), np.array(Y) def ls_arx(u, y, na, nb, d=1): """批处理最小二乘,返回参数、残差与拟合度""" Phi, Y = build_arx(u, y, na, nb, d) theta, *_ = np.linalg.lstsq(Phi, Y, rcond=None) res = Y - Phi @ theta fit = 1 - res.var() / Y.var() return theta, res, fit # theta 的前 na 个是 a1..ana(符号与模型式一致),后 nb 个是 b1..bnb

start取max(na, nb+d)是为了保证每一行的回归量都取得到真实数据,不补零。补零会让前几行带上虚假信息,阶次一高就明显。np.linalg.lstsq比手写正规方程稳,条件数大时不会直接崩。返回的fit是 1 减去残差方差比输出方差,取值在 0 到 1 之间,负数说明模型还不如直接拿均值预测。

4.3 递推最小二乘与遗忘因子

在线场景要的是递推形式。公式三行:

θ(k)=θ(k-1)+K(k)[y(k)-φ(k)ᵀθ(k-1)] K(k)=P(k-1)φ(k)/[λ+φ(k)ᵀP(k-1)φ(k)] P(k)=[I-K(k)φ(k)ᵀ]P(k-1)/λ

λ 是遗忘因子。λ=1 是无限记忆,参数收敛后基本不动;λ 取 0.95~0.99 时旧数据权重指数衰减,能跟踪慢时变参数。P0 一般取 αI,α 在 10⁴~10⁶。

def rls <p> <a href="https://download.csdn.net/download/poleonton/860671" style="color:#ec7500;font-size:14px;"> 本文还有配套的精品资源,点击获取 </a> <img alt="menu-r.4af5f7ec.gif" src="https://csdnimg.cn/release/wenkucmsfe/public/img/menu-r.4af5f7ec.gif" style="width:16px;margin-left:4px;vertical-align:text-bottom;cursor:text;"> </p>

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询