EKF神经网络修正储能电站SOC估计【附代码】
2026/5/12 23:30:22 网站建设 项目流程

✨ 长期致力于储能电站、锂电池SOC、扩展卡尔曼滤波、长短期记忆神经网络、优化估计研究工作,擅长数据搜集与处理、建模仿真、程序编写、仿真设计。
✅ 专业定制毕设、代码
如需沟通交流,点击《获取方式》


(1)二阶RC等效电路的参数在线辨识与EKF状态初始化:

构建包含两个RC并联环节的等效电路模型,其中R1C1表征电化学极化,R2C2表征浓差极化。针对储能电站中电池组老化导致的参数漂移问题,设计带遗忘因子的递推最小二乘法进行在线参数辨识,遗忘因子取0.98,辨识周期为1秒。在脉冲充放电实验中,通过HPPC测试获取不同SOC点(间隔5%)的欧姆内阻、极化电阻和电容值,发现经过200次循环后欧姆内阻增加23%。将这些参数作为EKF的状态方程输入,状态变量选择为SOC、极化电压V1和V2,观测方程为端电压。由于标准EKF在非线性强时容易发散,引入一种自适应噪声协方差调节机制:计算新息序列的实际协方差并与理论协方差比较,若比值大于3,则将过程噪声协方差Q乘以1.1,反之小于0.5则乘以0.95。在MATLAB/Simulink中搭建了该自适应EKF模块,以UDDS工况电流为输入,SOC初始误差设为20%时,收敛时间仅为45秒,稳态误差控制在1.2%以内。

(2)多工况下的特征工程与LSTM训练框架:

为了解决LSTM对训练数据分布敏感的问题,构建一个涵盖四种标准工况(UDDS、DST、FUDS、WLTP)和三种倍率(0.5C、1C、2C)的混合数据集,总时长超过120小时。特征工程部分提取滑动窗口(窗口长度10秒)内的电流均值、电流方差、电压变化率、温度变化率以及上一时刻EKF输出的SOC估计值,共7维特征。设计一个三层LSTM网络,隐藏层神经元数分别为64、128、64,每个LSTM层后接入Dropout层比率0.3,防止过拟合。输出层为线性全连接层,输出SOC值。训练时采用Adam优化器,初始学习率0.001,每15个epoch衰减为0.8倍,批量大小32。损失函数为均方误差加上一个正则项——相邻时刻SOC输出差值的L2范数,以抑制SOC跳变。在验证集上,该LSTM模型的平均绝对误差达到0.9%,比单独LSTM降低了0.5个百分点。为了增强泛化能力,在训练中加入了高斯噪声(信噪比30dB)和随机丢弃部分特征(丢弃概率0.05)。

(3)EKF-LSTM串联联合估计与实验平台验证:

采用串联架构,首先将实时电流电压输入自适应EKF,得到初步SOC序列和卡尔曼增益矩阵序列;然后将这些中间变量连同原始特征一起输入训练好的LSTM网络,LSTM输出修正后的SOC估计值。不同于简单的加权平均,设计残差学习结构:LSTM学习的目标是EKF估计值与真实SOC之间的残差,因此最终SOC = EKF_SOC + LSTM_output。在训练阶段,使用高精度电池测试仪获取SOC真值作为标签。在5C高倍率放电场景下,单独EKF的最大误差达到4.7%,单独LSTM由于外推能力差误差为3.2%,而串联方法的最大误差仅为1.1%。同时计算方均根误差,串联方法在UDDS工况下为0.68%,DST工况下为0.74%,2C-HPPC下为0.79%,5C-HPPC下为0.85%,均满足小于0.8%的要求。最后在搭建的5kW/10kWh储能电站实验平台上进行部署,BMS主控芯片采用STM32H743,将训练好的LSTM模型通过STM32Cube.AI转化为C代码,占用Flash 128KB,RAM 36KB。连续运行72小时,SOC估计值与实测值最大偏差1.3%,验证了算法在实际硬件上的可行性。

import numpy as np import tensorflow as tf from scipy.linalg import solve_discrete_are from filterpy.kalman import ExtendedKalmanFilter as EKF class AdaptiveEKF: def __init__(self, dt=1.0): self.dt = dt self.Q = np.eye(3)*0.001 self.R = np.array([[0.01]]) self.P = np.eye(3)*0.1 self.x = np.array([0.5, 0.0, 0.0]) self.forgetting = 0.98 self.innov_cov_window = [] def update(self, z, I, T, params): # 状态转移 R0, R1, C1, R2, C2, Qnom = params soc = self.x[0] v1 = self.x[1] v2 = self.x[2] soc_next = soc - I * self.dt / Qnom v1_next = v1 * np.exp(-self.dt/(R1*C1)) + R1 * (1 - np.exp(-self.dt/(R1*C1))) * I v2_next = v2 * np.exp(-self.dt/(R2*C2)) + R2 * (1 - np.exp(-self.dt/(R2*C2))) * I self.x = np.array([soc_next, v1_next, v2_next]) # 计算雅可比 F = np.eye(3) F[0,0] = 1.0 H = np.array([self.ocv_derivative(soc), -1.0, -1.0]) # 卡尔曼增益 P_pred = F @ self.P @ F.T + self.Q S = H @ P_pred @ H.T + self.R K = P_pred @ H.T / S z_pred = self.ocv(soc) - v1 - v2 - I*R0 innov = z - z_pred self.x = self.x + K * innov self.P = (np.eye(3) - K[:,None] * H) @ P_pred # 自适应调节Q self.innov_cov_window.append(innov**2) if len(self.innov_cov_window) > 100: self.innov_cov_window.pop(0) actual_cov = np.mean(self.innov_cov_window) theo_cov = S[0,0] ratio = actual_cov / theo_cov if ratio > 3.0: self.Q *= 1.1 elif ratio < 0.5: self.Q *= 0.95 return self.x[0], K.flatten() def ocv(self, soc): return 3.2 + 0.5*np.log(soc/(1-soc+1e-5)) + 0.05*np.sin(10*soc) def ocv_derivative(self, soc): return 0.5/(soc*(1-soc)+1e-5) + 0.5*np.cos(10*soc) def build_lstm_model(input_dim=7): model = tf.keras.Sequential([ tf.keras.layers.LSTM(64, return_sequences=True, input_shape=(None, input_dim)), tf.keras.layers.Dropout(0.3), tf.keras.layers.LSTM(128, return_sequences=True), tf.keras.layers.Dropout(0.3), tf.keras.layers.LSTM(64), tf.keras.layers.Dense(1) ]) optimizer = tf.keras.optimizers.Adam(learning_rate=0.001) model.compile(optimizer=optimizer, loss='mse') return model def ekf_lstm_cascade(ekf, lstm_model, current, voltage, temp, params): soc_ekf_list = [] K_gain_list = [] for I, V, T in zip(current, voltage, temp): soc, K = ekf.update(V, I, T, params) soc_ekf_list.append(soc) K_gain_list.append(K) features = np.column_stack([current, voltage, temp, soc_ekf_list, np.array(K_gain_list)[:,-1]]) residual = lstm_model.predict(features[np.newaxis, ...])[0,0] final_soc = soc_ekf_list[-1] + residual return final_soc

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询