【状态估计】基于粒子滤波和卡尔曼滤波的锂离子电池放电时间预测与使用特征研究(Matlab代码实现)

👨‍🎓个人主页:研学社的博客   

💥💥💞💞欢迎来到本博客❤️❤️💥💥

🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。

⛳️座右铭:行百里者,半于九十

📋📋📋本文目录如下:🎁🎁🎁

目录

💥1 概述

📚2 运行结果

2.1 kalmanFilter

2.2 basicNonlinear

2.3 battery 

🎉3 参考文献

🌈4 Matlab代码、数据、文章讲解


💥1 概述

文献来源:

摘要:我们提出了一个基于粒子滤波的预测框架的实现,该框架利用使用概况的统计特征来(i)估计充电状态(SOC), (ii)预测储能设备(锂离子电池)的放电时间。该方法采用了一种新的经验状态空间模型,该模型受到电池现象学的启发,并使用粒子滤波算法实时估计SOC和其他未知模型参数。滤波阶段采用的自适应机制提高了状态估计的收敛性,为预测阶段提供了充分的初始条件。SOC预测使用基于粒子滤波的框架来实现,该框架考虑了基于两态马尔可夫链转移概率的最大似然估计的未来放电曲线的不确定性的统计特征。所有的算法都经过了训练和验证,使用了一个锂离子26650和两个锂离子18650电池的实验数据,并考虑了不同的操作条件。

索引术语:锂离子电池,马尔可夫链,粒子滤波,充电状态预测。

原文摘要:

Abstract—We present the implementation of a particle-filtering-based prognostic framework that utilizes statistical characteriza-tion of use profiles to (i) estimate the state-of-charge (SOC), and (ii)predict the discharge time of energy storage devices (lithium-ion batteries). The proposed approach uses a novel empirical state-space model, inspired by battery phenomenology, and particle-fil-tering algorithms to estimate SOC and other unknown model pa-rameters in real-time. The adaptation mechanism used during the filtering stage improves the convergence of the state estimate, and provides adequate initial conditions for the prognosis stage. SOC prognosis is implemented using a particle-filtering-based frame-work that considers a statistical characterization of uncertainty for future discharge profiles based on maximum likelihood estimates of transition probabilities for a two-state Markov chain. All algo-rithms have been trained and validated using experimental data acquired from one Li-Ion 26650 and two Li-Ion 18650 cells, and considering different operating conditions.

Index Terms—Lithium-ion battery, Markov chain, particle fil-tering, state-of-charge prognosis.

文献下载:
链接:https://pan.quark.cn/s/00b638d79ba9
提取码:vSvu

 

 

 

 

📚2 运行结果

2.1 kalmanFilter

 

2.2 basicNonlinear

 

 

 

2.3 battery 

 

 

 

 

部分代码:

%Leer entrada de corriente
input = csvread('2015_vali1_current.csv');
i_meas = input(:,2);
L = length(i_meas);
dt = 2; %paso de tiempo en segundos
t = dt*(0:(L-1));

%Simular voltaje
v = zeros(L,1);
v_meas = zeros(L,1);
x1 = zeros(L,1);
x2 = zeros(L,1);
%Noise
sigma_1 = 1e-8;
sigma_2 = 1e-8;
sigma_n = 1e-4;
%Initial conditions
x1(1) = Zp;
x2(1) = 1;
v(1) = v0 - i_meas(1)*x1(1);
v_meas(1) = v(1) + sqrt(sigma_n)*randn;

for k = 2:L
    %State transition
    x1(k) = x1(k-1) + sqrt(sigma_1)*randn;
    x2(k) = x2(k-1) - v(k-1)*i_meas(k-1)*dt/Ecrit + sqrt(sigma_2)*randn;
    if x2(k)<0
        x2(k) = 0;
    end
    %Measurement
    v(k) = vl + (v0-vl)*exp(gamma*(x2(k)-1))...
        + alfa*vl*(x2(k)-1) + (1-alfa)*vl*( exp(-beta)-exp(-beta*sqrt(x2(k))))...
        - i_meas(k)*x1(k);
    v_meas(k) =  v(k) + sqrt(sigma_n)*randn;
end

%Mostrar los datos simulados
figure
subplot(2,2,1)
plot(t,i_meas);
grid, xlabel('Time [s]'), ylabel('Current [A]'), title('Measured Discharge Current');
subplot(2,2,2)
plot(t,v_meas);
grid, xlabel('Time [s]'), ylabel('Voltage [V]'), title('Simulated Measured Discharge Voltage');

%Mostrar los datos simulados
%figure
subplot(2,2,4)
plot(t,v);
grid, xlabel('Time [s]'), ylabel('Voltage [V]'), title('Simulated True Discharge Voltage');
subplot(2,2,3)
plot(t,x2);
grid, xlabel('Time [s]'), ylabel('SOC'), title('Simulated True SOC');

%%
%Filtrado
%--------------PF Bootstrap---------------
n_part = 100;

%Ruidos filtro
w_1 = sigma_1;
w_2 = 1e-5; %sigma_2;
Rnn = 1e-2; %sigma_n;

%Resampling
N_t = n_part;

%Inicializacion de particulas
particle = zeros(n_part,2);
particle_pred =  zeros(n_part,2);
particle(:,1) = ones(n_part,1)*Zp;
particle(:,2) = unifrnd(0.8,0.9, n_part, 1); %soc
weight = ones(n_part,1)/n_part;

%Estimadores
x1_est_mmse = zeros(L,1);
x1_est_mmse(1) = mean(particle(:,1));
x2_est_mmse = zeros(L,1); %soc
x2_est_mmse(1) = mean(particle(:,2));

v_model = zeros(n_part,1);

for k=2:L

    for i=1:n_part
        
        %Modelo de voltaje para la particula anterior (k-1)
        v_model(i) = vl + (v0-vl)*exp(gamma*(particle(i,2)-1))...
            + alfa*vl*(particle(i,2)-1) + (1-alfa)*vl*( exp(-beta)-exp(-beta*sqrt(particle(i,2))))...
            - i_meas(k-1)*particle(i,1);
        
        %Importance sampling (prediccion desde k-1 hacia k)
        r1 = sqrt(w_1)*randn;
        r2 = sqrt(w_2)*randn;
        particle_pred(i,1) = particle(i,1) + r1;
        particle_pred(i,2) = particle(i,2) - v_model(i)*i_meas(k-1)*dt/Ecrit + r2;
        if particle_pred(i,2)<0
            particle_pred(i,2) = 0;
        end
        
        %Weight update (medicion de valor en k)
        v_model(i) = vl + (v0-vl)*exp(gamma*(particle_pred(i,2)-1))...
            + alfa*vl*(particle_pred(i,2)-1) + (1-alfa)*vl*( exp(-beta)-exp(-beta*sqrt(particle_pred(i,2))))...
            - i_meas(k)*particle_pred(i,1); %prediccion de medicion en k
        innov = v_meas(k) - v_model(i); %innovacion
        %weight(i) = exp( -(( innov )^2)/(2*Rnn) )/(sqrt(2*pi*Rnn));
        weight(i) = exp( -log(sqrt(2*pi*Rnn)) -(( innov )^2)/(2*Rnn) );
    end
    if sum(weight)==0
        %disp(weight);
        disp(innov);
        disp('Error');
        disp(k);
        disp(i);
    end
    %Normalizar pesos
    weight = weight/sum(weight);
    
    N_eff = 1/( sum(weight.^2) );
    if N_eff < N_t
        %Resampling
        cdf = cumsum(weight);
        %Systematic resampling
        sam = rand/n_part;
        for i=1:n_part
            samInd = sam + (i-1)/n_part;
            ind = find( samInd<=cdf ,1);
            particle(i,:) = particle_pred(ind,:);
        end
    else
        for i=1:n_part
            particle(i,:) = particle_pred(i,:);
        end
        
    end
    
    
    %Estimacion del estado
    x1_est_mmse(k) = mean(particle(:,1));
    x2_est_mmse(k) = mean(particle(:,2));
     
end

figure, plot(t,x2_est_mmse)
hold on
plot(t, x2)
grid, xlabel('Time [s]'), ylabel('SOC'), title('Particle-Filtered SOC ');
legend('Estimate','Ground Truth');


figure
subplot(2,1,1)
plot(t,x2);
hold on
plot(t,x2_est_mmse);
grid, xlabel('Time [s]'), ylabel('State'), title(sprintf('SOC Estimation with $$x^{(2)}_0=$$ %1.1f and $$P_0^{(2)}=$$ %1.0d',x2_est_mmse(1), 1e-5));
legend('True State','BPF Estimate');


subplot(2,1,2)
error = x2-x2_est_mmse;
plot(t,error);
ylim([-4e-2,4e-2]);
grid, xlabel('Time [s]'), ylabel('Error');
%title(sprintf('State Estimation Error with $$x_0=$$ %1.1f and $$P_0=$$ %1.0d',x_est(1), P_est(1)));
title('SOC Estimation Error');


%%
%Filtrado
%--------------EKF---------------

%Ruidos filtro
w_1 = sigma_1;
w_2 = sigma_2;
Rnn = sigma_n;
Rww = [w_1,0;0,w_2];

%Inicializacion de arreglos
x1_est   = zeros(L,1); %state estimate
x1_pred  = zeros(L,1); %state estimate prediction
P2_est =  zeros(L,1);
x2_est   = zeros(L,1); %state estimate soc
x2_pred  = zeros(L,1); %state estimate prediction soc
v_pred  = zeros(L,1); %measurement prediction
innov   = zeros(L,1); %innovation
R_innov = zeros(L,1); %innovation covariance

🎉3 参考文献

部分理论来源于网络,如有侵权请联系删除。

🌈4 Matlab代码、数据、文章讲解

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

荔枝科研社

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值