• 大小: 23KB
    文件类型: .rar
    金币: 1
    下载: 0 次
    发布日期: 2021-06-02
  • 语言: Matlab
  • 标签: MATLAB  EKF  SOC估计  

资源简介

基于EKF滤波的二阶RC电池模型的Soc估计仿真,附带实验数据(MATLAB仿真)

资源截图

代码片段和文件信息

clear;clc;
Cn=2228*3.6;%电池容量,单位mAh
delta_t=1;%采样时间
ro=0.13/1.76;%电池内阻
rp1=0.0118;cp1=1.567;
rp2=0.0170;cp2=80.65;%RC环节的内阻和电容值,单位欧姆和法拟合数据1
% rp1=0.000206;cp1=89.958;
% rp2=0.0161;cp2=85.17;%RC环节的内阻和电容值,单位欧姆和法,拟合数据2
nita=2200/2228;%放电系数
i=zeros(13648);
for k=2:3648
    i(k)=2.2;
end
i(1)=0;%放电电流矩阵
fn=@(x) 78.86*x^7-297*x^6+459.5*x^5-381.6*x^4+187.3*x^3-54.08*x^2+...
    9.074*x+10.57;%拟合soc-ocv表达式
syms t1;
g=fn(t1);
g=matlabFunction(diff(g));%fn对soc的偏导

A=[1 0 0;0 rp1*cp1/(delta_t+rp1*cp1) 0;0 0 rp2*cp2/(delta_t+rp2*cp2)];
B=[-nita*delta_t/Cn;delta_t*rp1/(delta_t+rp1);delta_t*rp2/(delta_t+rp2)];%A,B矩阵
t=0:delta_t:3647;%仿真序列时间
N=length(t);
size=[3N];%数组大小
Q=4e-9*eye(3);%状态方程中的误差
R=1e-2; %观测方程中的误差

X=zeros(size);%状态变量
Soc=zeros(1N);%soc
Up1=zeros(1N);
Up2=zeros(1N);%RC回路的电压
E=zeros(1N);%电池电压
Uoc=zeros(1N);%电池端电压
X(:1)=[1;0;0];%状态变量初值

for k=2:N
    X(:k)=A*X(:k-1)+B*i(k)+sqrtm(Q)*randn(31);
end
for k=1:N
    Soc(k)=X(1k);
    Up1(k)=X(2k);
    Up2(k)=X(3k);
    E(k)=fn(Soc(k));
    Uoc(k)=E(k)-i(k)*ro-Up1(k)-Up2(k)+R*randn(1);
end%求取仿真所用的真值

Xekf=zeros(size);%EKF下的状态变量
P0=eye(3);%协方差矩阵初值
Xekf(:1)=[1;0;0];%EKF状态变量初值,可更改

for k=2:N
    Xn=A*Xekf(:k-1)+B*i(k);%计算先验估计
    P1=A*P0*A‘+Q;%更新协方差矩阵
    dd=Xn(1)-Soc(k);%计算先验估计值与真值的差
    Zm=g(Soc(k))*dd+fn(Soc(k))-Xn(2)-Xn(3)-i(k)*ro;%计算观测值
    H=[g(Xn(1)) 0 0];%雅克比矩阵计算
    K=P1*H‘*inv(H*P1*H‘+R);%计算卡尔曼增益
    Xekf(:k)=Xn+K*(Uoc(k)-Zm);%更新状态
    P0=(eye(3)-K*H)*P1;%更新协方差方程
end

Socekf=zeros(1N);%Ekf下的soc
Uocekf=zeros(1N);%Ekf下的端电压
Eekf=zeros(1N);%EKF下的电池电压

for k=1:N
    Socekf(k)=Xekf(1k);
    Eekf(k)=fn(Socekf(k));
    Uocekf(k)=fn(Socekf(k))-i(k)*ro-Xekf(2k)-Xekf(3k);
end%计算三个值

%依次绘制先验数据,后验数据和实验数据做比较
%这里绘制的是soc-ocv曲线
figure;
plot(X(1:)Uoc‘b‘);
hold on;
plot(Xekf(1:)Uocekf‘g‘);
hold on;
load(‘2.2socv.mat‘)
plot(socsocv‘r‘);
grid on;
legend(‘先验数据‘‘后验数据‘‘实验数据‘);
xlabel(‘soc‘);ylabel(‘Uocv/V‘);
title(‘拓展卡尔曼滤波仿真soc-ocv曲线对比‘);

%依次绘制先验数据,后验数据和实验数据做比较
%这里绘制的是t-ocv曲线
figure;
plot(tUoc‘r‘);
hold on;
load(‘2.2vol.mat‘)
plot(timevol‘b‘);
hold on;
plot(tUocekf‘g‘);
grid on;
xlabel(‘t/s‘);ylabel(‘Uocv/V‘);
legend(‘先验数据‘‘实验数据‘‘后验数据‘);
title(‘拓展卡尔曼滤波仿真t-Uov曲线对比‘);

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件      16500  2018-12-27 11:28  2.2socv.mat

     文件       5739  2018-12-26 23:13  2.2vol.mat

     文件       2607  2018-12-27 15:20  EkfRcTwo.m

----------- ---------  ---------- -----  ----

                24846                    3


评论

共有 条评论