基于
UKF算法的电池SOC估算
1、UKF算法
无迹卡尔曼滤波是将数据变化(UT变换)与卡尔曼滤波结合起来的一种算法,通过UT变换将一个状态点转换为多个状态点,依据一定的权重传递给后面观测值,再根据后面的观测值和真实值的误差,向前反馈,不断修正,最后得到理想的状态值。
以SOC估算为例,卡尔曼滤波的估算思路分为预测和更新两阶段。
预测阶段:根据k时刻的SOC(k)值、输入电流I(k)和SOC的误差P(k)来估算k+1时刻的SOC(k+1)、误差P(k+1)和k时刻的端电压U(k)。
更新阶段:根据观测得到的k时刻端电压真实值与端电压的估算值计算差值,系统递推公式中的p与K,k+1时刻的SOC真实值,并更新误差真实值。
这样两个阶段的往复循环就能够不断的估算出任意时刻的SOC值。
2、UKF算法流程
2.1、参数初始化
load 电池实验数据.mat;
V=data(:,1);
I=data(:,2);
SOC=data(:,3); % 电压,电流,SOC
n=2;
Qf=[0.00001 0;0.00001 0];
p=[0.01 0;0 0.01];
R=0.1;
state0=[0.99;0]; % UKF初值
stater=stater0;
SOCan=stater0(1);
xc=state0;
tout=[];
staterout=[]; % 真实值矩阵
xcout=[]; % UKF估计矩阵
errorout=[]; % UKF误差矩阵
errarry=[];
2.2、UKF递推公式
for t=t0:h:tf
yc=V(t);
I0=I(t);
alp=0.1;
kap=0;
beta=2;
lamda=alp^2*(n+kap)-n;
nc=n+lamda;
%----------------采样点权值---------------------
for i=1:2*n+1
Wm(i)=1/(2*(lamda+n));
Wc(i)=1/(2*(lamda+n));
end
Wm(1)=lamda/(lamda+n);
Wc(1)=lamda/(lamda+n)+1-alp^2+beta;
%----------------构造sigma点-----------------
pk=sqrt(p*(n+lamda));
for j=1:n
sigma1(:,j)=xc+pk(:,j);
sigma2(:,j)=xc-pk(:,j);
end
sigma=[xc,sigma1,sigma2]; %5列
%---------------利用采样点更新状态-------------------
for j=1:2*n+1 %状态方程
F=[1,0;0, 0.9545];
G=[0.00003541;0.0003282];
sigma(:,j)=F*sigma(:,j)+G*I0;
end
%----------------状态均值------------------
sxk=0;
for j=1:2*n+1
sxk=Wm(j)*sigma(:,j)+sxk;
end
%-----------------px的值---------------------
spk=0;
for kp=1:2*n+1 % px
spk=Wc(kp)*(sigma(:,kp)-sxk)*(sigma(:,kp)-sxk)'+spk;
end
spk=spk+Qf;
%-------------根据Px重新采样数据点--------------
chor=sqrt(spk*(n+lamda));
for j=1:n
Sigma1(:,j)=sxk+chor(:,j);
Sigma2(:,j)=sxk-chor(:,j);
end
Sigma=[sxk, Sigma1, Sigma2 ];
for kg=1:2*n+1 % 测量方程
Sigma(1,kg))+I0*0.0115+Sigma(2,kg);
gamma(kg)=3.2348-0.0148*log(Sigma(1,kg))-0.0363*log(1-Sigma(1,kg))+I0*0.0118+Sigma(2,kg);
end
2.3、仿真结果
figure;
plot(tout,xcout(1,:),'r',tout,staterout(1,:),'b');
legend('UFK估算SOC值','真实SOC值');grid on;
xlabel('时间(s)');ylabel('SOC');title('无迹卡尔曼滤波');
3、结果分析
从仿真结果可知,UKF算法具有较高的SOC估算精度!
欢迎关注我的微信公众号,感谢大家的支持!