EKF神经网络修正储能电站SOC估计【附代码】
✨ 长期致力于储能电站、锂电池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。3EKF-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 128KBRAM 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, dt1.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-soc1e-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_dim7): model tf.keras.Sequential([ tf.keras.layers.LSTM(64, return_sequencesTrue, input_shape(None, input_dim)), tf.keras.layers.Dropout(0.3), tf.keras.layers.LSTM(128, return_sequencesTrue), tf.keras.layers.Dropout(0.3), tf.keras.layers.LSTM(64), tf.keras.layers.Dense(1) ]) optimizer tf.keras.optimizers.Adam(learning_rate0.001) model.compile(optimizeroptimizer, lossmse) 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