咋就不写长篇大论的理论知识了,直接给Matlab的代码。
说明一下,这里用的是NASA的数据,峰值持续功率的计算方法查到的文献也各有各的说法,我就简单选了一个。大家看懂代码自行设计就可。
老样子,注释写的比较明白了,就不做代码解释了。
贴两张效果图:
close all;
clear all;
load B0006
cycles1 = B0006.cycle; % 保存步骤数组到新变量
counter = 0;
counter1 = 0;
counter2 = 0;% initialize counters初始化计数器
%========= 提取数据 =========
for i = 1:length(cycles1)-1 % search through the array of step structures搜索步骤结构的数组
%========= 取出charge状态中的Voltage_measured,Current_measured均值=========
if strcmp(cycles1(i).type,'charge')
counter1 = counter1+1;
da = cycles1(i).data;
Vin(counter1) = mean(da.Voltage_measured);
tim_charge = mean(da.Time);
Iin(counter1) = mean(da.Current_measured);
soc_charge(counter1) = tim_charge * Iin(counter1) / 3600;
end
%========= 取出discharge状态中的Voltage,Current,Temperature均值=========
if strcmp(cycles1(i).type,'discharge')
counter = counter+1;
c(counter)=counter-1; % 步长坐标
da = cycles1(i).data;
capacity1(counter) = da.Capacity;
[n,in]=max(da.Voltage_measured(:)) ; % n是当前Voltage数据中最大值
n = 2.5; %截止电压
[iv,jv] = ind2sub(size(da.Voltage_measured(:)),in); % jv是最大电压的列值
iiii = 1;
while da.Voltage_measured(iiii)> n % iiii是到截止电压时的列值
iiii = iiii+1;
end
time_v(counter) = da.Time(iiii) - da.Time(jv) ;% time_v是从最大电压放电到截止电压的时间
Iout(counter) = abs(mean(da.Current_measured(jv:iiii)));%Iout是从最大电压放电到截止电压的平均电流
Vout(counter) = mean(da.Voltage_measured(jv:iiii));%Vout是从最大电压放电到截止电压的平均电压
tim_discharge = mean(da.Time);
soc_discharge(counter) = tim_discharge * -Iout(counter) / 3600;
T(counter) = mean(da.Temperature_measured);
%功率计算
p(counter)= Iout(counter) *n+(Iout(counter) ^2)*(4.2-Vout(counter))/ Iout(counter); % 数据用的锂电池最大电压为4.2V
end
%========= 取出impedance数据中的Rct =========
if strcmp(cycles1(i).type,'impedance')
counter2 = counter2+1;
da = cycles1(i).data;
R(counter2)=da.Rct;
end
end
%S=capacity1/1.8565; %计算SOH
S=p;
C1=c;
num = length(C1);
Iout = Iout(:,1:num);
Vout = Vout(:,1:num);
Iin = Iin(:,1:num);
Vin = Vin(:,1:num);
p = [C1;Iout;Vout;Iin;Vin];
%p_t= p(:,33:93);
%t_t= S(:,33:93);
p_t= p(:,33:end);
t_t= S(:,33:end);
p_t2 = p(:,94:end);
t_t2 = S(:,94:end);
%=====================================================================
% 训练
setdemorandstream(2); % 设置随机种子
[input,ps1]=mapminmax(p_t);%两行十列,mapminmax,归一化函数
[target,ps2]=mapminmax(t_t); %
%========= 定义网络对象 =========
net=newff(input,target,10,{'purelin','purelin'},'trainlm'); %前馈反向传播网络
%(输入参数矩阵,目标参数矩阵,N-1个隐含层的数目11个隐含层,
% 相关层的传递函数TF,purelin:线性传递函数,
% BP神经网络学习训练函数BTF,trainlm:)
%========= 设置网络参数和网络结构=========
net.trainParam.epochs=500; %最大训练次数
net.trainParam.goal=0.00001;%目标最小误差
LP.lr=0.000001;%学习速率
net=train(net,input,target); % net@需要训练的神经网络
% input@网络输入,测试的电流电压输入输出值
% target@网络期望输出,SOH
%========= 输入参数开始推理=========
output=net(input);
%========= 得到结果=========
prediction=mapminmax('reverse',output,ps2);
bpout=prediction;
figure(1);
plot(t_t,'*r')
hold on
plot(bpout,'-b')
legend('训练数据','BP预测训练数据')
xlabel('锂电池充放电次数');
ylabel('BP网络预测值');