锂离子电池(三)基于BP神经网络的峰值功率估计【Matlab代码】

咋就不写长篇大论的理论知识了,直接给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网络预测值');

猜你喜欢

转载自blog.csdn.net/weixin_47407066/article/details/127424953