3. 最小二乘法基础:从数学原理到工程实战

说实话,我在做电机参数辨识的头两年,踩过最大的坑就是——模型建得花里胡哨,但辨识出来的参数根本没法用。后来我才明白,不管算法多高级,最小二乘法才是那个最底层的基石。今天我们就把它彻底讲透。

3.1 最小二乘法的数学原理

先问个问题:给你一堆散点,怎么画一条最合适的直线?

你可能会说「让所有点到直线的距离之和最小」。没错,这就是最小二乘法的核心思想。不过我们用的是误差的平方和,而不是绝对值。为什么用平方?两个原因:一是平方能放大大误差,让模型更在意那些偏离大的点;二是平方函数可导,方便我们求极值。

数学上,我们通常这样描述:

给定观测数据 (x₁, y₁), (x₂, y₂), ..., (xₙ, yₙ)
假设模型为 y = θ₁x + θ₀
定义损失函数 J = Σ(yᵢ - (θ₁xᵢ + θ₀))²
求 J 最小时的 θ₀, θ₁

写成矩阵形式会更简洁。令:

Y = [y₁, y₂, ..., yₙ]ᵀ
Φ = [[1, x₁], [1, x₂], ..., [1, xₙ]]
θ = [θ₀, θ₁]ᵀ

则 J = (Y - Φθ)ᵀ(Y - Φθ)
对 θ 求导并令其为零:
∂J/∂θ = -2Φᵀ(Y - Φθ) = 0
解得:θ = (ΦᵀΦ)⁻¹ΦᵀY

这个公式就是最小二乘法的闭式解。你想想看,只要 ΦᵀΦ 可逆,一次矩阵运算就能得到最优参数。我在早期做离线辨识时,用的就是这个方法。

关键点:ΦᵀΦ 可逆的前提是输入信号必须充分激励。如果电机一直匀速转,你永远辨识不出电感参数。这就是为什么做参数辨识时,一定要注入伪随机二进制序列(PRBS)或 chirp 信号。

3.2 递推最小二乘法(RLS)推导

离线最小二乘法有个硬伤——数据必须全部存下来,每次有新数据都要重新算一遍。在嵌入式系统里,这显然不现实。我做过一个项目,采样率 10kHz,跑一次离线辨识要攒 10 秒数据,算完矩阵求逆,CPU 直接卡死。

所以我们需要递推最小二乘法(RLS)。它的核心思想是:用上一时刻的参数估计值,加上新数据带来的修正量,得到当前时刻的参数。

推导过程其实不复杂,我们一步步来:

  1. 定义递推关系:设第 k 步的参数估计为 θ̂(k),新观测为 y(k),新输入向量为 φ(k)。
  2. 引入增益矩阵:K(k) = P(k-1)φ(k) / (λ + φᵀ(k)P(k-1)φ(k)),其中 λ 是遗忘因子。
  3. 更新参数:θ̂(k) = θ̂(k-1) + K(k)[y(k) - φᵀ(k)θ̂(k-1)]
  4. 更新协方差矩阵:P(k) = [I - K(k)φᵀ(k)]P(k-1) / λ

你看,整个过程只需要保存上一时刻的 θ̂ 和 P 矩阵,不需要存历史数据。每次新数据来了,算一个增益 K,然后修正参数。这就是 RLS 能在嵌入式系统里跑得飞起的原因。

我的经验:初始化 P(0) 时,我习惯设成 P(0) = αI,α 取 100~1000。α 越大,初始收敛越快,但初期波动也大。如果系统对参数突变敏感,α 可以设小一点。

3.3 遗忘因子对辨识效果的影响

RLS 里有个关键参数——遗忘因子 λ(通常取 0.95~1.0)。它的作用是控制算法对历史数据的「记忆长度」。

λ 的含义很直观:

  • λ = 1:所有历史数据权重相同,相当于无限记忆。适合时不变系统。
  • λ < 1:越老的数据权重越小,指数衰减。λ 越小,衰减越快,算法对参数变化越敏感。

我整理了一个对比表,方便你理解:

遗忘因子 λ 等效记忆长度 适用场景 风险
1.0 ∞ 参数恒定的系统 参数变化时无法跟踪
0.99 约 100 个采样点 缓慢时变系统(如温度漂移) 对噪声敏感度适中
0.95 约 20 个采样点 快速时变系统(如负载突变) 噪声放大,参数抖动大
0.90 约 10 个采样点 极端快速变化 极易发散,慎用

我曾经踩过的坑:有一次做 PMSM 在线参数辨识,我把 λ 设成 0.95,结果辨识出的电阻值像心电图一样上下跳。后来发现是电流采样噪声太大,λ 太小导致算法把噪声当成了参数变化。最后我把 λ 调到 0.995,同时加了低通滤波,才稳定下来。

所以我的建议是:先大后小。先用 λ=0.999 跑通,确认算法没问题,再逐步减小 λ 来提升跟踪速度。

3.4 知识体系总览

下面这张图把本章的核心逻辑串起来了。你可以把它当作一个快速索引:

最小二乘法知识体系 最小二乘法知识体系 最小二乘法 数学原理 递推最小二乘法 遗忘因子 λ 损失函数 J 闭式解 θ 增益矩阵 K 协方差更新 P 参数修正 λ=1 无限记忆 λ<1 指数衰减 核心逻辑 离线辨识用闭式解 → 在线辨识用 RLS → RLS 性能由 λ 控制 λ 越大越稳定,λ 越小跟踪越快,但噪声也越大

3.5 工程实战要点

最后,我总结几条实战经验,希望能帮你少走弯路:

  • 数据预处理:做辨识之前,一定要对电流、电压信号做滤波。我习惯用二阶巴特沃斯低通,截止频率设为 PWM 开关频率的 1/10。
  • 激励信号设计:PRBS 信号是首选,频率成分丰富。幅值控制在额定电流的 5%~10%,太小信噪比不够,太大影响正常运行。
  • RLS 初始化:P(0) 设大一点(100~1000),θ̂(0) 可以用离线辨识的结果,或者直接给 0。给 0 的话,前几十步会有一个收敛过程,别慌。
  • 遗忘因子调参:从 λ=0.999 开始,观察参数曲线。如果曲线平滑但响应慢,逐步减小到 0.99、0.98。如果曲线抖动,说明 λ 太小了。

一个小技巧:如果你不确定 λ 该取多少,可以试试「变遗忘因子」——参数变化剧烈时自动减小 λ,平稳时增大 λ。我做过一个自适应 λ 的 RLS,效果比固定 λ 好很多。不过那是进阶内容了,先把基础打牢再说。