4. 最小二乘法基础:递推最小二乘法(RLS)原理、遗忘因子、协方差矩阵更新

各位工程师朋友,大家好。今天我们聊一个在电机参数辨识里绕不开的话题——递推最小二乘法,也就是RLS。

说实话,我刚入行那会儿,对最小二乘法的理解还停留在“解个超定方程”的层面。直到有一次做PMSM的在线电感辨识,发现每次采样都要重新算一遍矩阵求逆,DSP直接卡死……嗯,从那以后我才真正意识到,递推版本有多重要。

4.1 从批处理到递推:为什么要“递推”?

先说说传统的最小二乘法。你有一堆数据点,想拟合出一条直线或者曲线,让误差平方和最小。这就是批处理最小二乘法(Batch LS)。

它的公式长这样:

θ = (Φ^T Φ)^(-1) Φ^T Y

其中θ是待辨识的参数向量,Φ是观测矩阵,Y是输出向量。

问题在哪?每次有新数据进来,你都得把历史数据全部重新算一遍。如果数据量是1000组,矩阵Φ就是1000×n维,求逆的计算量是O(n³)。

我做过一个实验:在STM32F4上,每来一个采样点就做一次批处理计算,结果采样频率只能跑到200Hz,而电机控制环路通常需要10kHz以上。这显然不行。

递推最小二乘法(RLS)就是为了解决这个问题诞生的。它的核心思想是:

  • 保留上一次的估计结果
  • 用新数据做“增量修正”
  • 不需要重新计算历史数据

说白了,就是让算法“边学边用”,每次只更新一点点。

4.2 RLS的数学推导(我会尽量说人话)

RLS的递推公式其实不复杂,我直接给出来,然后逐条解释:

1. 计算增益向量:
   K(k) = P(k-1) φ(k) / [λ + φ^T(k) P(k-1) φ(k)]

2. 更新参数估计:
   θ(k) = θ(k-1) + K(k) [y(k) - φ^T(k) θ(k-1)]

3. 更新协方差矩阵:
   P(k) = [I - K(k) φ^T(k)] P(k-1) / λ

这里:

  • θ(k) 是第k步的参数估计值
  • φ(k) 是第k步的观测向量(比如电流、转速)
  • y(k) 是第k步的实际输出(比如电压)
  • P(k) 是协方差矩阵,代表估计的不确定性
  • λ 是遗忘因子,0 < λ ≤ 1

你可能会问:这个K(k)是干嘛的?

你可以把它理解成一个“信任度分配器”。如果新数据的信息量很大(比如电流突然变化),K(k)就大,参数更新幅度就大。如果新数据跟历史数据差不多,K(k)就小,参数基本不动。

4.3 遗忘因子λ:给旧数据“打折”

遗忘因子是RLS里最关键的参数之一。我个人习惯把它叫做“记忆衰减系数”。

λ的取值范围是(0, 1]:

λ取值 含义 适用场景
λ = 1 永不遗忘,所有数据权重相同 系统参数恒定不变
λ = 0.95 ~ 0.99 缓慢遗忘,近期数据权重更大 参数缓慢变化(如温度引起的电阻漂移)
λ = 0.8 ~ 0.9 快速遗忘,适应快速变化 参数突变(如电感饱和)

我在做PMSM电感辨识时遇到过一个问题:电机刚启动时温度低,电阻小;运行几分钟后温度升高,电阻变了。如果λ=1,算法会“记住”初始的冷态电阻,导致后续辨识偏差越来越大。

后来我把λ设为0.98,效果就好多了。但注意,λ太小也不行——参数会跟着噪声乱跳。

我的经验:λ的选取可以遵循“3倍时间常数”原则。如果你想遗忘掉90%的旧数据,需要的步数大约是 N ≈ 3/(1-λ)。比如λ=0.99,大约300步后旧数据的影响就很小了。

4.4 协方差矩阵P(k):估计的“信心指数”

协方差矩阵P(k)是RLS里另一个核心。它反映了你对当前参数估计的置信程度。

初始值P(0)怎么设?

  • 如果你对初始参数很有信心(比如来自铭牌数据),P(0)可以设小一点,比如10³·I
  • 如果你完全不知道参数,P(0)设大一点,比如10⁶·I,让算法快速收敛

我刚开始做的时候,把P(0)设成了单位矩阵,结果收敛速度慢得让人抓狂。后来改成P(0)=1000·I,几毫秒就收敛了。

协方差矩阵的更新公式里有个除法——除以λ。这意味着:

  • λ越小,P(k)增长越快,算法对新数据越敏感
  • λ=1时,P(k)单调递减,算法越来越“固执”

这里有个坑:如果P(k)变得太小,算法会失去跟踪能力,这叫“协方差崩溃”。我曾经在仿真里遇到过,参数突然变化时,RLS完全反应不过来,因为P(k)已经小到增益K(k)几乎为零了。

避坑指南:如果系统参数可能突变,建议给P(k)设置一个下限,或者定期重置。我常用的做法是:当检测到残差突然增大时,手动将P(k)乘以一个大于1的系数。

4.5 RLS的完整实现流程

下面我给出一段C语言风格的伪代码,这是我在实际项目中用过的框架:

// RLS初始化
float theta[N] = {0};      // 参数向量
float P[N][N] = {0};       // 协方差矩阵
float lambda = 0.98;       // 遗忘因子

// 初始化P矩阵
for(i=0; i<N; i++)
    P[i][i] = 1000.0;      // 大初始值

// 主循环(每个采样周期执行一次)
void RLS_Step(float phi[], float y) {
    // 1. 计算中间变量
    float P_phi[N];         // P * phi
    for(i=0; i<N; i++) {
        P_phi[i] = 0;
        for(j=0; j<N; j++)
            P_phi[i] += P[i][j] * phi[j];
    }
    
    // 2. 计算分母:lambda + phi^T * P * phi
    float denom = lambda;
    for(i=0; i<N; i++)
        denom += phi[i] * P_phi[i];
    
    // 3. 计算增益K
    float K[N];
    for(i=0; i<N; i++)
        K[i] = P_phi[i] / denom;
    
    // 4. 计算预测误差
    float error = y;
    for(i=0; i<N; i++)
        error -= phi[i] * theta[i];
    
    // 5. 更新参数
    for(i=0; i<N; i++)
        theta[i] += K[i] * error;
    
    // 6. 更新协方差矩阵
    float temp[N][N];
    for(i=0; i<N; i++)
        for(j=0; j<N; j++)
            temp[i][j] = P[i][j] - K[i] * P_phi[j];
    
    for(i=0; i<N; i++)
        for(j=0; j<N; j++)
            P[i][j] = temp[i][j] / lambda;
}

这段代码看起来有点长,但核心逻辑就三步:算增益、更新参数、更新协方差。实际工程中,我一般会用定点数或者浮点DSP库来加速矩阵运算。

4.6 RLS在PMSM参数辨识中的应用框架

最后,我用一张流程图来总结RLS在电机参数辨识中的位置:

RLS在PMSM参数辨识中的应用框架 采样电流、电压、转速 构建观测向量 φ(k) RLS递推计算 ① 计算增益 K(k) ② 更新参数 θ(k) ③ 更新协方差 P(k) 输出 Rs, Ld, Lq, ψf 下一采样周期 图:RLS参数辨识的闭环流程,每个采样周期执行一次 关键参数设置 • 遗忘因子 λ = 0.95~0.99 • 初始协方差 P(0)=1000·I • 初始参数 θ(0)=0 • 采样频率 ≥ 10kHz • 数据需低通滤波预处理

这张图展示的是RLS在PMSM参数辨识中的完整闭环流程。每个采样周期,我们从电机控制器中读取电流、电压和转速数据,构建观测向量φ(k),然后送入RLS核心进行递推计算,最后输出电阻、电感和磁链等参数。这些参数又可以反馈给控制器,实现自适应控制。

嗯,关于RLS的基础原理就讲到这里。下一节我们会具体讨论如何把RLS应用到PMSM的电阻和电感辨识中,包括观测矩阵怎么构造、数据预处理要注意什么。到时候我会拿一个实际项目的代码来拆解,大家记得带上脑子来就行。


专注资料整理