锂离子电池健康状态估计(二)基于粒子滤波算法的锂电池剩余使用寿命预测,python+Matlab

相关源码和数据文件已经更新在github:https://github.com/Wuito/Estimation-of-residual-life-of-particle-filter-lithium-ion-battery

粒子滤波采样

粒子滤波算法的完整建立在Gordon,Salmond和Smith提出的重采样技术上,并且一种新的采样算法(采样-重要性重采样)的发现和不断改良也对粒子滤波算法进行了丰富。
在这里插入图片描述

粒子滤波重采样

常用的重采样方法可以分为四类:最临近值重采样法,双线性重采样法,双立方重采样法,插值重采样法。
1)最邻近值重采样法:指的是比较目标图像与原图像的宽或者高,并且以此将原图像相对位置的像素点作为目标图像像素点的值。
2)双线性重采样法:指的是参考原图像对应像素周围四个点的值,并且由相对位置为每个点取权值来获得目标图像。
3)双立方重采样法:参考原像素点周围4*4个像素的值,并且根据这来获得目标图像。
4)插值重采样法:相比上述算法,这种方法参考更多原图像数据信息,可被用于求解对称矩阵方程组的求解以及特征值问题,重采样效果一般更好。
重采样算法是按概率进行复制和淘汰步骤,权重高的可能会被多次复制,这就保证了整体粒子数基本不变,然后进行归一化,将所有的粒子的权重都变为 1/n,继续进行下一步的预测更新步骤。虽然重采样的应用不会彻底根除粒子退化问题,但也会大大改善了粒子退化问题。
虽然重采样方法能够一定程度上减弱粒子退化问题,但是也必然会导致例子多样性的丧失,即N=1/(∑▒W_K^i ),N越小粒子退化问题也就越严重,就更加需要重采样,这样多次的重采样当然也会减慢粒子滤波的速度。

电池容量衰减模型

根据电池容量计算公式:Q=∫_tc^td▒〖I(t)dt〗,其中tc表示的是充电时间,td表示的是电池放电时间,I(t)表示的是电流,Q为锂离子电池的实时容量,而经过时间t则是记录了电池从循环开始到实验结束的时间。经过Matlab曲线拟合工具箱对四种电池容量数据进行指数拟合,能够得到比较准确的指数衰退模型。
在这里插入图片描述
根据电池衰减模型,我们选用双指数经验模型。
在这里插入图片描述
Q表示的是k时刻的电池容量,其中,k为循环次数,a,b,c,d均与锂离子电池本身有关,所以当a,b,c,d估算越准确,那么对于电池本身的模拟也就越真实,也就越能准确预测电池寿命。

算法流程

总结粒子滤波算法方法,有流程图:
在这里插入图片描述
使用Python3.8、Numpy1.23、matplotlib3.6软件环境对上述算法进行设计。运行Python程序可以得到CS2电池的容量预测图,在实验中以CS2_36为样本集,对样本的前600个数据进行10:1随机抽样后使用Matlab拟合工具箱对双指数模型进行拟合。

曲线拟合

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
有了拟合的参数和算法方程,那就开始滤波了:
注意这里python加载的数据先前就已经计算好保存下来的数据
在这里插入图片描述
这是我工程的文件结构。你需要在上一篇博客里下载好马里兰大学的数据,处理好数据后保存为npy格式的文件,然后在这里应用。

先上粒子滤波的效果图:
在这里插入图片描述
蓝色是观测值,黄色是滤波计算值,从红色线开始,绿色是没有滤波的自然观测计算值。

# 基于粒子滤波的锂离子电池RUL预测
# From: SWUST IPC14 Dai
import numpy as np
import matplotlib.pyplot as plt
from scipy.linalg import sqrtm
# Python3.8、Numpy1.23、matplotlib3.6
# 除去数据异常的较大值和较小值点
def drop_outlier(array, count, bins):
    index = []
    range_ = np.arange(1, count, bins)
    for i in range_[:-1]:
        array_lim = array[i:i + bins]
        sigma = np.std(array_lim)
        mean = np.mean(array_lim)
        th_max, th_min = mean + sigma * 2, mean - sigma * 2
        idx = np.where((array_lim < th_max) & (array_lim > th_min))
        idx = idx[0] + i
        index.extend(list(idx))
    return np.array(index)

# 剩余容量双指数方程,状态方程
def hfun(X, k):
    Q = X[0] * np.exp(X[1] * k) + X[2] * np.exp(X[3] * k)
    return Q

# 重采样步骤:
# 预测:抽取新粒子
# 更新:更新粒子权值
# 状态估计
# 多项式重采样

# 重采样
def randomR(inIndex, q):
    outIndex = np.zeros(np.shape(inIndex))
    num = np.shape(q)
    u = np.random.rand(num[0], 1)
    u = np.sort(u, axis = 0)
    u = np.array(u)
    l = np.cumsum(q, axis=0)
    i = 0
    for j in np.arange(0, num[0]):
        while (i <= (num[0]-1)) and (u[i] <= l[j]):
            outIndex[i] = j
            i = i + 1
    return outIndex

# capacity:阶段放电容量
# resistance:放电阶段电池的的内阻平均值
# CCCT:恒定电流充电时间
# CVCT: 恒定电压充电时间
if __name__ == "__main__":

    # ========================================
    #                加载数据
    # ========================================
    Battery_name = 'CS2_38'
    Battery = np.load('dataset/' + Battery_name + '.npy', allow_pickle=True)
    Battery = Battery.item()
    battery = Battery[Battery_name]

    names = ['capacity', 'resistance', 'CCCT', 'CVCT']
    # battery[1] = battery[1] /(battery[1] + 1.1)

	# 粒子滤波步骤
    # 初始化
    # 更新粒子状态
    # 权值计算和归一化
    # 重采样
    # 判断程序是否结束,迭代

    # ========================================
    #           预估数据为电池容量
    # ========================================
    N = len(battery['cycle'])
    pf_Number = 200                # 粒子数
    Prediction_Interval = 300      # 未来趋势值,预测区间的大小
    cita = 1e-4
    wa = 0.000001                  # 设定状态初始值
    wb = 0.01
    wc = 0.1
    wd = 0.0001
    Q = cita * np.diag([wa, wb, wc, wd])  # Q为过程噪声方差矩阵,diag()创建指定对角矩阵

    F = np.eye(4)   # F为驱动计算矩阵,eye()单位对角矩阵
    R = 0.001       # 观测噪声的协方差
    # ========= 状态方程赋初值 ==============
    a = -0.0000083499
    b = 0.055237
    c = 0.90097
    d = -0.00088543
    X0 = np.mat([a, b, c, d]).T  # 矩阵转置

    # ========= 滤波器状态初始化 ==============
    Xpf = np.zeros([4, N])
    Xpf[:, 0:1] = X0  # 对齐数组

    # ========= 粒子集初始化 ==============
    Xm = np.zeros([4, pf_Number, N])
    for i in np.arange(0, pf_Number - 1):
        sqr1 = np.array(sqrtm(Q))
        sqr2 = sqr1.dot(np.random.randn(4, 1))  # 矩阵乘法,直接用*是矩阵点乘
        Xm[:, i:i + 1, 0] = X0 + sqr2  # 对齐数组,需要将矩阵对齐后才能相加

    # ========= 从数据集读取观测量 =============
    capacity = battery[names[0]]
    Z = np.array(capacity)
    # ========= Zm为滤波器预测观测值,Zm与Xm对应 =============
    Zm = np.zeros([1, pf_Number, N])
    # ========= Zpf与Xpf对应 =============
    Zpf = np.zeros([1, N])         # 计算中得到的Zpf为滤波器更新得到的容量值
    # ========= 权值初始化 =============
    Weight = np.zeros([N, pf_Number])    # 计算中得到的W为更新的粒子权重

    # 粒子滤波算法
    for k in np.arange(1, N - 1):
        # 重要性采样
        for i in np.arange(0, pf_Number - 1):
            sqr1 = np.array(sqrtm(Q))       # 观测噪声
            sqr2 = sqr1.dot(np.random.randn(4, 1))  # 矩阵乘法,直接用*是矩阵点乘
            Xm[:, i:i + 1, k] = F.dot(Xm[:, i:i + 1, k - 1]) + sqr2
        # 权值重要性计算
        for i in np.arange(0, pf_Number - 1):
            Zm[0, i:i + 1, k] = hfun(Xm[:, i:i + 1, k], k)      # 观测预测
            Weight[k, i] = np.exp(-(Z[k] - Zm[0, i:i + 1, k:k + 1]) ** 2 / 2 / R) + 1e-99  # 重要性权值计算,乘方用 **
        Weight[k, :] = Weight[k, :] / sum(Weight[k, :])    # 权值归一化
        # 重采样
        # 这里的重采样以权值为传入值,返回值为采样后的索引
        outlndex = randomR(np.arange(0, pf_Number), Weight[k, :])
        # 得到新的样本
        for i in np.arange(0, len(outlndex)):
            Xm[:, i, k] = Xm[:, int(outlndex[i]), k]
        # 滤波后的状态更新,更新参数[a,b,c,d]
        Xpf[:, k] = [np.mean(Xm[0, :, k]),
                     np.mean(Xm[1, :, k]),
                     np.mean(Xm[2, :, k]),
                     np.mean(Xm[3, :, k])]
        # 更新后的状态计算预测的容量值
        Zpf[0, k] = hfun(Xpf[:, k], k)

    # ========================================
    #         计算自然条件下的预测值
    # ========================================
    start = N - Prediction_Interval    # 预测的区间
    Zf = np.zeros(Prediction_Interval)  # 自然预测值
    Xf = np.zeros(Prediction_Interval)
    for k in np.arange(start-1, N-1):
        Zf[k-start] = hfun(Xpf[:, start], k)
        Xf[k-start] = k

    # 画线
    nax = [start, start]
    nay = [0, 1]
    plt.figure(figsize=(12, 9))
    plt.title('Particle filter  '+ Battery_name)  # 折线图标题
    plt.xlabel('Number of Cycles', fontsize=14)
    plt.ylim((0, 1.1))
    plt.ylabel(names[0], fontsize=14)
    plt.plot(battery['cycle'],  Z,          markersize=3)
    plt.plot(battery['cycle'],  Zpf[0, :],  markersize=3)
    plt.plot(Xf,                Zf,         markersize=3)
    plt.plot(nax,               nay,        linewidth=4)
    plt.legend(['Measured value', 'pf Predictive value', 'Natural predicted value'])
    plt.show()

Matlab的粒子滤波

main.m

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 版权声明:
%     本程序的详细中文注释请参考
%     黄小平,王岩,缪鹏程.粒子滤波原理及应用[M].电子工业出版社,2017.4
%     书中有原理介绍+例子+程序+中文注释
%     如果此程序有错误,请对提示修改
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%  函数功能:粒子滤波用于电源寿命预测
% function main
 

load Battery_Capacity
%%load Battery_Capacity
N=length(A5Cycle);
% error('下面的参数M请参考书中的值设置,然后删除本行代码')
M=200;   %%粒子数
Future_Cycle=100;  % 未来趋势
if N>260
    N=260;   % 过滤大于260的数字
end
 %过程噪声协方差Q
cita=1e-4;
wa=0.000001;wb=0.01;wc=0.1;wd=0.0001;
Q=cita*diag([wa,wb,wc,wd]);
 %驱动矩阵
F=eye(4);
 %观测噪声协方差
R=0.001;
 
a=-0.0000083499;b=0.055237;c=0.90097;d=-0.00088543;
X0=[a,b,c,d]';
 %滤波器状态初始化
Xpf=zeros(4,N);
Xpf(:,1)=X0;
 
% 粒子集初始化
Xm=zeros(4,M,N);
for i=1:M
    Xm(:,i,1)=X0+sqrtm(Q)*randn(4,1);
end
 
% 观测量
Z(1,1:N)=A12Capacity(1:N,:)';
 
Zm=zeros(1,M,N);
 
Zpf=zeros(1,N);
 
W=zeros(N,M);
 %粒子滤波算法
for k=2:N
    %  采样
    for i=1:M
        Xm(:,i,k)=F*Xm(:,i,k-1)+sqrtm(Q)*randn(4,1);
    end
        
    % 权值重要性计算
    for i=1:M
   
        Zm(1,i,k)=feval('hfun',Xm(:,i,k),k);
       
        W(k,i)=exp(-(Z(1,k)-Zm(1,i,k))^2/2/R)+1e-99;
    end,
 
    W(k,:)=W(k,:)./sum(W(k,:));
  
    % 重采样
    outIndex = randomR(1:M,W(k,:)');      % 调用外部函数
     % 得到新样本
    Xm( :,  :,  k)=Xm(  :,  outIndex,  k);
    % 滤波后的状态更新
    Xpf(:,k)=[mean(Xm(1,:,k));mean(Xm(2,:,k));mean(Xm(3,:,k));mean(Xm(4,:,k))];
    % 更新后的状态计算
    Zpf(1,k)=feval('hfun',Xpf(:,k),k);
end
 %预测未来电容的趋势
start=N-Future_Cycle;
for k=start:N
    Zf(1,k-start+1)=feval('hfun',Xpf(:,start),k);
    Xf(1,k-start+1)=k;
end

Xreal=[a*ones(1,M);b*ones(1,M);c*ones(1,M);d*ones(1,M)];
figure
subplot(2,2,1);
hold on;box on;
plot(Xpf(1,:),'-r.');plot(Xreal(1,:),'-b.')
legend('粒子滤波后的a','平均值a')
subplot(2,2,2);
hold on;box on;
plot(Xpf(2,:),'-r.');plot(Xreal(2,:),'-b.')
legend('粒子滤波后的b','平均值b')
subplot(2,2,3);
hold on;box on;
plot(Xpf(3,:),'-r.');plot(Xreal(3,:),'-b.')
legend('粒子滤波后的c','平均值c')
subplot(2,2,4);
hold on;box on;
plot(Xpf(4,:),'-r.');plot(Xreal(4,:),'-b.')
legend('粒子滤波后的d','平均值d')

figure
hold on;box on;
plot(Z,'-b.') 
plot(Zpf,'-r.')
plot(Xf,Zf,'-g.') 
bar(start,1,'y')
legend('实验测量数据','滤波估计数据','自然预测数据')
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

hfun.m

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 版权声明:
%     本程序的详细中文注释请参考
%     黄小平,王岩,缪鹏程.粒子滤波原理及应用[M].电子工业出版社,2017.4
%     书中有原理介绍+例子+程序+中文注释
%     如果此程序有错误,请对提示修改
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 函数名称:电容的观测函数
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function Q=hfun(X,k)
Q=X(1)*exp(X(2)*k)+X(3)*exp(X(4)*k);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

randomR.m

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 版权声明:
%     本程序的详细中文注释请参考
%     黄小平,王岩,缪鹏程.粒子滤波原理及应用[M].电子工业出版社,2017.4
%     书中有原理介绍+例子+程序+中文注释
%     如果此程序有错误,请对提示修改 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function outIndex = randomR(inIndex,q);
if nargin < 2
    error('Not enough input arguments.'); 
end
outIndex=zeros(size(inIndex));
[num,col]=size(q);
u=rand(num,1);
u=sort(u);
l=cumsum(q);
i=1;
for j=1:num
    while (i<=num)&(u(i)<=l(j))
        outIndex(i)=j;
        i=i+1;
    end
end

粒子滤波在单目标跟踪多目标跟踪电池寿命预测中的应用-粒子滤波原理及应用仿真.doc 本帖最后由 huangxu_love 于 2013-7-26 12:50 编辑 推荐一本学习粒子滤波原理的好资料《粒子滤波原理及应用仿真》,本手册主要介绍粒子滤波的基本原理和其在非线性系统的应用。同时本手册最大的优点是介绍原理和应用的同时,给出实现例子的matlab代码程序,方便读者对照公式,理解代码。因此,它是相关方面的研究者快速上手和进入研究领域的快捷工具。同时,对于有一定基础的研究者,可以在本手册提供代码的基础上,做算法进一步改进和深入研究。 如果你有编程或者原理咨询,可以联系我的QQ345194112. 目  录第一部分 原理篇                                                                1第一章 概述                                                                  11.1 粒子滤波的发展历史                                                        11.2 粒子滤波的优缺点                                                         21.3 粒子滤波的应用领域                                                        3第章 蒙特卡洛方法                                                          42.1 概念和定义                                                                42.2 蒙特卡洛模拟仿真程序                                                     52.2.1硬币投掷实验(1)                                                        52.2.2硬币投掷实验(2)                                                      52.2.3古典概率实验                                                              64.2.4几何概率模拟实验                                                         72.2.5复杂概率模拟实验                                                          72.3 蒙特卡洛理论基础                                                           102.3.1大数定律                                                                  102.3.2中心极限定律                                                              102.3.3蒙特卡洛的要点                                                           112.4 蒙特卡洛方法的应用                                                        132.4.1 Buffon实验及仿真程序                                                      132.4.2 蒙特卡洛方法计算定积分的仿真程序                                          14第三章 粒子滤波                                                              193.1 粒子滤波概述                                                              193.1.1 蒙特卡洛采样原理                                                         193.1.2 贝叶斯重要性采样                                                         203.1.3 序列重要性抽样(SIS)滤波器                                                   203.1.4 Bootstrap/SIR滤波器                                                       223.2 粒子滤波重采样方法实现程序                                                233.2.1 随机重采样程序                                                            243.2.2 多项式重采样程序                                                         253.2.3 系统重采样程序                                                          263.2.4 残差重采样程序                                                            273.3 粒子滤波原理                                                             283.3.1 高斯模型下粒子滤波的实例程序                                              28第部分 应用篇                                                                33第四章 粒子滤波在单目标跟踪中的应用                                          334.1 目标跟踪过程描述                                                         334.2 单站单目标跟踪系统建模                                                    344.3 单站单目标观测距离的系统及仿真程序                                        374.3.1 基于距离的系统模型                                                      374.3.2 基于距离的跟踪系统仿真程序                                             384.4 单站单目标纯方位角度观测系统及仿真程序                                    434.4.1 纯方位目标跟踪系统模型                                                  434.4.2 纯方位跟踪系统仿真程序                                                  444.5 多站单目标纯方位角度观测系统及仿真程序                                     474.5.1 多站纯方位目标跟踪系统模型                                               474.5.2 多站纯方位跟踪系统仿真程序                                              48第五章 粒子滤波在多目标跟踪中的应用                                          545.1 多目标跟踪系统建模                                                        545.1.1 单站多目标跟踪系统建模                                                  545.1.2 多站多目标跟踪系统建模                                                  555.1.3 单站多目标线性跟踪系统的建模仿真程序                                     555.1.4 多站多目标非线性跟踪系统的建模仿真程序                                  575.2 多目标跟踪分类算法                                                        615.2.1 多目标数据融合概述                                                       615.2.2 近邻法分类算法程序                                                     625.2.3 近邻法用于目标跟踪中的航迹关联及算法程序                                665.2.4 K-近邻法分类算法                                                          695.3 粒子滤波用于多目标跟算法中的状态估计                                     705.3.1 原理介绍                                                                 705.3.2 基于近邻法的多目标跟踪粒子滤波程序                                      71第六章 粒子滤波电池寿命预测中的应用                                         766.1 概述                                                                     766.2 电池寿命预测的模型                                                        786.3 基于粒子滤波电池寿命预测仿真程序                                        81
评论 54
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

絮沫

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

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

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

打赏作者

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

抵扣说明:

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

余额充值