4、系统辨识入门:最小二乘法、递推最小二乘法、阶跃响应法辨识系统模型
各位工程师朋友,大家好。今天我们来聊聊系统辨识。
说白了,系统辨识就是给一个未知的“黑箱子”建模。你给它输入信号,它给你输出响应。我们通过观察输入输出数据,反推出这个箱子里面到底是个什么数学模型。这在运动控制中太常见了——比如你拿到一台新电机,厂家只给了几个粗略参数,但你要做高精度控制,就得自己把它的传递函数摸清楚。
我个人习惯,先讲最经典、最实用的三种方法:最小二乘法、递推最小二乘法和阶跃响应法。这三种方法覆盖了离线辨识、在线辨识和工程快速辨识三大场景。
核心观点:没有完美的辨识方法,只有最适合当前工况的方法。离线数据充足用最小二乘,在线实时更新用递推最小二乘,现场快速调试用阶跃响应法。
4.1 最小二乘法:最朴素的离线辨识
最小二乘法的思想其实很简单。你想想看,我们有一堆测量数据点,想找一条曲线去拟合它们。什么叫“拟合得好”?就是让所有数据点到这条曲线的误差的平方和最小。这就是“最小二乘”名字的由来。
在运动系统里,我们通常把系统写成差分方程形式:
y(k) = -a1*y(k-1) - a2*y(k-2) + b1*u(k-1) + b2*u(k-2) + e(k)
其中 y 是输出(比如位置、速度),u 是输入(比如电压指令),e 是噪声。我们要估计的参数就是 a1, a2, b1, b2。
写成矩阵形式更清爽:
Y = Φ * θ + E
其中:
Y = [y(3), y(4), ..., y(N)]^T
Φ = [φ(3), φ(4), ..., φ(N)]^T
φ(k) = [-y(k-1), -y(k-2), u(k-1), u(k-2)]
θ = [a1, a2, b1, b2]^T
最小二乘解就是:
θ_hat = (Φ^T * Φ)^(-1) * Φ^T * Y
我的经验:我在调试一个直流伺服系统时,用最小二乘法辨识电机参数。采集了5000个数据点,算出来参数和厂家标称值差了不到5%。但要注意——输入信号一定要足够“丰富”。如果一直给恒定电压,你永远辨识不出动态参数。我习惯用伪随机二进制序列(PRBS)作为激励信号。
避坑指南:我曾经遇到过一个问题——矩阵 Φ^T*Φ 接近奇异,求逆时数值不稳定。原因是我采集的数据中,连续多个采样点的值几乎一样。解决办法:增加数据长度,或者加入少量噪声让数据更“丰富”。
4.2 递推最小二乘法:在线实时更新
最小二乘法有个缺点——它需要全部历史数据。如果系统参数随时间变化(比如电机温度升高导致电阻变化),离线方法就不好使了。
递推最小二乘法(RLS)就是为了解决这个问题。它的核心思想是:每来一个新数据,就在旧参数基础上做一次修正,不需要重新计算全部历史数据。
递推公式如下:
K(k) = P(k-1) * φ(k) / (λ + φ(k)^T * P(k-1) * φ(k))
θ(k) = θ(k-1) + K(k) * [y(k) - φ(k)^T * θ(k-1)]
P(k) = [I - K(k) * φ(k)^T] * P(k-1) / λ
其中 λ 是遗忘因子,取值范围通常在 0.95~0.99 之间。λ 越小,算法对最新数据越敏感,但估计方差也越大。
| 遗忘因子 λ | 特点 | 适用场景 |
|---|---|---|
| λ = 1 | 所有数据权重相同,退化为普通最小二乘 | 参数不随时间变化 |
| λ = 0.98~0.99 | 缓慢遗忘旧数据,估计稳定 | 参数缓慢变化(如温度漂移) |
| λ = 0.95~0.97 | 快速跟踪参数变化 | 参数快速变化(如负载突变) |
实际应用:我在做机器人关节的摩擦补偿时,用了RLS在线辨识摩擦参数。机器人运行过程中,摩擦会随温度、磨损而变化。RLS每10ms更新一次参数,补偿效果比固定参数模型好了30%以上。
嗯,这里要注意一个细节——初始值怎么设?我一般把 θ(0) 设为零向量,P(0) 设为一个较大的对角矩阵(比如 1000*I)。这样算法一开始会快速收敛,然后逐渐稳定。
4.3 阶跃响应法:工程师的“土办法”
说实话,有时候我们不需要那么复杂的数学。在现场调试时,阶跃响应法是最直观、最快速的辨识方法。
做法很简单:给系统一个阶跃输入,记录输出响应曲线。然后从曲线上读出几个关键特征量:
- 稳态增益 K:输出稳态值 / 输入阶跃幅值
- 时间常数 T:输出达到稳态值63.2%所需的时间
- 延迟时间 τ:从输入阶跃到输出开始变化的时间
- 上升时间 Tr:输出从10%上升到90%所需的时间
对于一阶惯性系统,传递函数可以写成:
G(s) = K / (T*s + 1) * e^(-τ*s)
对于二阶系统,还需要根据超调量计算阻尼比和自然频率。
我的习惯:在现场调试伺服驱动器时,我会先给一个小的阶跃信号(比如5%额定电压),观察响应曲线。如果曲线平滑,说明系统线性度好;如果曲线有抖动或非线性,就要小心了——可能是摩擦、间隙或者饱和在作怪。
阶跃响应法虽然简单,但有几个坑要注意:
- 阶跃幅值不能太大,否则系统进入非线性区(比如饱和)
- 阶跃幅值也不能太小,否则信噪比太低,曲线被噪声淹没
- 系统必须是稳定的——不稳定的系统做阶跃响应会发散
我曾经踩过的坑:有一次给一个液压伺服系统做阶跃响应,我给了10%的阶跃指令,结果系统振荡了好几次才稳定。我以为是系统不稳定,后来发现是液压油里有气泡,导致响应有延迟和振荡。换了油之后,阶跃响应就正常了。所以,阶跃响应法也能帮你发现系统本身的“健康问题”。
4.4 三种方法怎么选?
最后,我给大家一个简单的选择指南:
- 实验室离线分析:用最小二乘法,精度最高,可以处理大量数据
- 在线自适应控制:用递推最小二乘法,实时更新模型参数
- 现场快速调试:用阶跃响应法,10分钟就能摸清系统大概特性
我个人建议,三种方法都掌握。实际项目中,我经常先用阶跃响应法快速估算参数,然后用最小二乘法做精细辨识,最后用RLS做在线微调。这样既快又准。
好了,系统辨识入门就讲到这里。记住一句话:模型是控制的基础,辨识是建模的手段。把辨识搞扎实了,后面的自适应控制才能有的放矢。