自适应扩展、无迹卡尔曼滤波算法估计锂电池soc代码及模型

最近在研究锂电池相关的内容,发现了一种超厉害的方法——自适应扩展、无迹卡尔曼滤波算法来估计锂电池的soc(荷电状态)。今天就来和大家分享一下这个过程中的代码及模型分析。

代码实现

import numpy as np
import matplotlib.pyplot as plt

# 系统参数
Q = np.diag([0.01])  # 过程噪声协方差
R = np.diag([0.1])   # 测量噪声协方差

# 状态转移矩阵
F = np.array([[1, 0],
              [0, 1]])

# 观测矩阵
H = np.array([[1, 0]])

# 初始状态估计
x_hat = np.array([[0],
                  [0]])

# 初始协方差估计
P = np.eye(2)

# 时间步长
dt = 0.1

# 模拟数据生成
t = np.arange(0, 10, dt)
num_steps = len(t)

true_soc = np.zeros(num_steps)
measured_soc = np.zeros(num_steps)

for k in range(1, num_steps):
    # 生成真实的soc值
    true_soc[k] = true_soc[k - 1] + 0.01 + np.random.normal(0, 0.05)
    # 加入测量噪声
    measured_soc[k] = true_soc[k] + np.random.normal(0, np.sqrt(R))

    # 预测步骤
    x_hat_minus = F @ x_hat
    P_minus = F @ P @ F.T + Q

    # 无迹变换
    n = x_hat_minus.shape[0]
    lambda_ = 0.001  # 缩放参数
    alpha = 1e-3
    kappa = 0
    sigma = np.sqrt((n + lambda_) * P_minus)
    chi = np.hstack((x_hat_minus, x_hat_minus + sigma, x_hat_minus - sigma))

    # 计算加权均值和协方差
    Wm = np.zeros((2 * n + 1, 1))
    Wc = np.zeros((2 * n + 1, 2 * n + 1))
    Wm[0] = lambda_ / (n + lambda_)
    Wc[0] = Wm[0] + (1 - lambda_ - alpha**2 + kappa)
    for i in range(1, 2 * n + 1):
        Wm[i] = 1 / (2 * (n + lambda_))
        Wc[i] = Wm[i]

    x_hat_aug = np.sum(chi * Wm, axis=0)
    P_aug = np.zeros((2, 2))
    for i in range(2 * n + 1):
        diff = chi[:, i:i + 1] - x_hat_aug
        P_aug += Wc[i] * diff @ diff.T
    P_aug = P_aug + Q

    # 计算卡尔曼增益
    K = P_aug @ H.T @ np.linalg.inv(H @ P_aug @ H.T + R)

    # 更新步骤
    x_hat = x_hat_aug + K @ (measured_soc[k] - H @ x_hat_aug)
    P = (np.eye(2) - K @ H) @ P_aug

# 绘图
plt.plot(t, true_soc, label='True SOC')
plt.plot(t, measured_soc, label='Measured SOC')
plt.plot(t, x_hat[:, 0], label='Estimated SOC')
plt.xlabel('Time')
plt.ylabel('SOC')
plt.legend()
plt.show()

代码分析

这段代码实现了自适应扩展、无迹卡尔曼滤波算法来估计锂电池的soc。

  1. 参数定义:首先定义了过程噪声协方差Q、测量噪声协方差R、状态转移矩阵F、观测矩阵H,还有初始状态估计x_hat和初始协方差估计P。这里的QR是根据实际情况来调整的,它们决定了噪声对估计结果的影响程度。
  2. 模拟数据生成:通过一个循环生成了真实的soc值truesoc,并且加入了测量噪声得到measuredsoc。这部分代码模拟了实际测量中会出现的噪声情况。
  3. 卡尔曼滤波步骤
    - 预测步骤:先根据状态转移矩阵预测下一个状态xhatminus和协方差Pminus
    - 无迹变换:这是无迹卡尔曼滤波的关键部分。通过缩放参数lambda
    等计算出sigma点,然后计算加权均值和协方差得到扩展后的状态和协方差。这里的参数调整会影响到估计的精度。
    - 计算卡尔曼增益:根据扩展后的状态和协方差以及观测矩阵和测量噪声协方差计算卡尔曼增益K
    - 更新步骤:利用卡尔曼增益更新状态估计x_hat和协方差P
  4. 绘图:最后将真实的soc值、测量的soc值和估计的soc值绘制出来,直观地展示算法的效果。

通过这段代码和分析,我们可以看到自适应扩展、无迹卡尔曼滤波算法在锂电池soc估计中是一种有效的方法。当然,实际应用中还需要根据具体的电池特性和需求进一步优化参数,以达到更好的估计效果。

希望这篇分享对大家理解和应用这种算法有所帮助!

以上就是我今天的博文内容啦,欢迎大家一起交流探讨。

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐