3. 参数辨识数学基础:最小二乘法原理、递推最小二乘法、带遗忘因子的递推最小二乘法
各位同学,咱们今天聊点硬核的。参数辨识,说白了就是给电池模型“量体裁衣”。你建了个模型,里面一堆参数,怎么知道它们准不准?靠猜肯定不行。这时候,最小二乘法就该登场了。
我个人习惯把最小二乘法看作是“找一条最贴近所有数据点的线”。你想想看,我们测了一堆电压、电流数据,总希望模型能完美复现这些曲线。但现实总有误差,最小二乘法就是让这些误差的平方和最小。嗯,这里要注意,平方是为了避免正负误差相互抵消。
3.1 最小二乘法原理
先讲最基础的。假设我们有一个线性系统:
y = θ₁ * x₁ + θ₂ * x₂ + ... + θₙ * xₙ
其中 y 是输出,x 是输入,θ 就是我们要辨识的参数。我们采集了 m 组数据(m > n),写成矩阵形式:
Y = X * Θ
这里 Y 是 m×1 的输出向量,X 是 m×n 的输入矩阵,Θ 是 n×1 的参数向量。
最小二乘法的核心思想,就是让残差 e = Y - X*Θ 的平方和最小。通过求导并令导数为零,我们得到:
Θ = (Xᵀ * X)⁻¹ * Xᵀ * Y
这就是传说中的最小二乘解。我在项目中遇到过一个问题:如果 Xᵀ*X 接近奇异(也就是行列式接近0),这个解会非常不稳定。说白了,就是你的输入数据太“相似”了,缺乏激励。
3.2 递推最小二乘法
上面那个公式有个大问题:每次有新数据,都要把历史数据全部重算一遍。这在嵌入式系统里根本跑不动。你想想看,电池管理系统每秒采集几十个点,要是每次都做矩阵求逆,MCU 早罢工了。
递推最小二乘法(RLS)就是来解决这个问题的。它的思路很简单:用上一时刻的参数估计值,加上新数据带来的修正量,得到当前时刻的参数值。
递推公式如下:
K(k) = P(k-1) * φ(k) / [1 + φᵀ(k) * P(k-1) * φ(k)]
θ̂(k) = θ̂(k-1) + K(k) * [y(k) - φᵀ(k) * θ̂(k-1)]
P(k) = [I - K(k) * φᵀ(k)] * P(k-1)
其中:
- K(k) 是增益矩阵,决定新数据对参数修正的权重
- P(k) 是协方差矩阵,反映参数估计的不确定性
- φ(k) 是当前时刻的输入向量
- θ̂(k) 是当前时刻的参数估计值
我建议初学者先理解这个递推过程:每次来一个新数据,先算预测误差(y(k) - φᵀ(k)*θ̂(k-1)),然后用增益 K 去修正参数。协方差矩阵 P 会随着数据增多而逐渐变小,说明参数越来越确定。
3.3 带遗忘因子的递推最小二乘法
标准 RLS 有个致命缺陷:所有历史数据权重相同。但电池参数是会变化的!温度变了,内阻会变;SOC 变了,开路电压曲线也会变。如果还用老数据,参数估计就会滞后。
带遗忘因子的递推最小二乘法(FFRLS)就是在 RLS 的基础上,引入一个遗忘因子 λ(0 < λ ≤ 1)。λ 越小,旧数据被遗忘得越快。我一般取 λ = 0.98 ~ 0.995。
FFRLS 的递推公式变成:
K(k) = P(k-1) * φ(k) / [λ + φᵀ(k) * P(k-1) * φ(k)]
θ̂(k) = θ̂(k-1) + K(k) * [y(k) - φᵀ(k) * θ̂(k-1)]
P(k) = [I - K(k) * φᵀ(k)] * P(k-1) / λ
你看,唯一的区别就是分母多了个 λ,P 矩阵更新时除了个 λ。这个 λ 的作用,就是让协方差矩阵不会衰减到零,始终保持对新数据的敏感度。
我曾经踩过一个坑:把 λ 设得太小(比如 0.9),结果参数估计值像过山车一样剧烈抖动。后来才明白,遗忘因子太小,系统对噪声太敏感了。嗯,这里要平衡好跟踪速度和抗噪能力。
3.4 三种方法的对比
| 方法 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
| 最小二乘法 | 离线辨识、批量处理 | 理论成熟、精度高 | 计算量大、不能在线使用 |
| 递推最小二乘法 | 在线辨识、参数缓慢变化 | 计算量小、实时性好 | 参数固定后失去跟踪能力 |
| 带遗忘因子的递推最小二乘法 | 在线辨识、参数时变 | 能跟踪参数变化、鲁棒性好 | 需要调参(λ 的选择) |
我个人在实际项目中,90% 的情况都用 FFRLS。电池模型参数辨识,说白了就是个时变系统。温度、SOC、老化程度都在变,不用遗忘因子根本跟不上节奏。
最后给个小建议:刚开始做参数辨识时,先用离线最小二乘法跑一遍数据,看看参数大概在什么范围。然后再用 FFRLS 做在线辨识,这样心里有底,不容易跑飞。
好了,这一章的内容就到这里。下一章我们会讲具体的电池模型结构,以及怎么把今天学的这些数学工具用上去。