基于
RNN算法的电池SOC估算
循环神经网络(Recurrent Neural Networks,RNN)是一种深度学习的神经网络框架,其与普通神经网络最本质上的区别在于,RNN可以保留上一时刻的隐藏层的状态。因此,RNN具有十分强大的学习能力。RNN网络的递推公式如下所示:
式中,ot表示RNN在t时刻的输出值,V表示输出层和隐含层之间的权重矩阵,st表示RNN在t时刻隐含层的数值,xt表示RNN在t时刻的输入值,U表示输入层和隐含层之间的权重矩阵,W表示st和st-1之间的权重矩阵,f表示隐含层的激活函数。将两式合并一下:
式中,ot(输出值)与输入量x1,x2,…,xt均有关系。由此可见,循环神经网络根据前期的输入量递推出当前时刻的最佳输出。
基于循环神经网络的电池SOC估算包含3个输入层、1个隐含层、1个输出层。
(1)输入层:t时刻的电压Vt、电流It,温度Tt作为模型的输入。
(2)隐含层:t时刻的隐含层节点为St。
式中,tanh表示隐含层的激活函数。
(3)输出层:t时刻的SOC作为模型的输出。
基于循环神经网络的电池SOC估算方法的原理即通过当前时刻及历史时刻的Vt、It和Tt映射出电池SOC的数值。具体代码如下所示:
clc
clear
%% 数据读取
M = readmatrix('电池测试数据.xlsx');
% 第一列为电池SOC 第二列→第四列依次为电压,电流,温度
M = shuffle(M);
Y = M(:,1);
X = M(:,2:4);
% 训练
test_size = 0.2;
[train_X,train_Y,test_X,test_Y] = test_train_split(X,Y,test_size);
%% RNN启动
% 训练数据,测试数据
norm_train_X = normalize(train_X);
norm_train_Y = train_Y/100;
norm_test_X = normalize(test_X);
norm_test_Y = test_Y/100;
% 定义网络结构
numResponses = size(norm_train_Y,2);
featureDimension = size(norm_train_X,2);
numHiddenUnits = 1;
layers = [ ...
sequenceInputLayer(featureDimension)
lstmLayer(numHiddenUnits,'OutputMode','sequence')
dropoutLayer(0.4)
fullyConnectedLayer(numResponses)
regressionLayer];
maxEpochs = 100;
miniBatchSize = 10;
options = trainingOptions('adam', ...
'MaxEpochs',maxEpochs, ...
'MiniBatchSize',miniBatchSize, ...
'InitialLearnRate',0.01, ...
'GradientThreshold',0.01, ...
'Plots','training-progress',...
'Verbose',0);
% 训练网络
net = trainNetwork(norm_train_X',norm_train_Y',layers,options);
% 测试网络
pred_y = predict(net, norm_test_X');
%% 评估
pred_y = pred_y';
residual=zeros(size(test_Y));
for i=1:length(test_Y)
residual(i)=norm_test_Y(i)-pred_y(i);
end
% 均方根误差
rmse = sqrt(mean((pred_y - norm_test_Y).^2));
MAE = mae(residual);
Rsq = 1 - sum((norm_test_Y - pred_y).^2)/sum((norm_test_Y - mean(norm_test_Y)).^2);
figure()
plot(test_Y)
hold on
plot(pred_y*100)
xlabel('observations')
ylabel('SOC')
legend('True','Prediction')
从结果可以看出,误差精度满足要求,证明了基于循环神经网络的电池SOC估算方法的有效性。
想了解更过相关仿真,可以关注我的微信公众号。