扩展卡尔曼滤波(EKF)估计SOC代码2详解,基于二阶RC模型(附MATLAB代码)

这篇具有很好参考价值的文章主要介绍了扩展卡尔曼滤波(EKF)估计SOC代码2详解,基于二阶RC模型(附MATLAB代码)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

       上次分享了一个扩展卡尔曼滤波估计SOC的代码,得到了很多小伙伴的支持,今天再分享一个很好用的扩展卡尔曼滤波估计SOC的程序。使用MATLAB语言完成程序的编写。

        有关EKF的推导及原理请看我写的另一个博客:基于扩展卡尔曼滤波的SOC估计(附MATLAB代码)文章链接:基于扩展卡尔曼滤波的SOC估计(附MATLAB代码)_新能源小趴菜的博客-CSDN博客_soc扩展卡尔曼滤波

下面开始代码的详细分析:

1.采样时间、总步长、状态向量、参数P、Q、R的确定。状态向量设置为一个3行N列的零矩阵。协方差矩阵P设置为一个单位矩阵,Q=0.1;R=0.1;这个值的设置不是固定的,可用优化算法来求得或者根据经验来调参。

T=1;%采样时间为1s
N=20042/T;%总步长
x=zeros(3,N);%定义状态向量x,定义一个3行N列的零矩阵。
x(:,1)=[0;0;1];%状态向量x初值设定
global P;     %global  声明全局变量

P=eye(3);%定义协方差 EKF,生成一个3行3列的单位矩阵

Q=0.1;R=0.1;
global Q_1;

2.导入电流、电压、SOC数据,以及将电池容量设置为24Ah。

%ii(1,:)=I;uu(1,:)=Ub;soc(1,:)=SOC;%输入参数
i = xlsread('i.xlsx');     %读取电流数据
u = xlsread('v.xlsx');     %读取电压数据
soc1 = xlsread('soc.xlsx');  %读取soc数据
ii = i';        %将电流数据变成行向量
uu = u';        %将电压数据变成行向量
soc = soc1';    %将soc数据变成行向量
I = ii(1,:);Ub = uu(1,:);SOC = soc(1,:);   %访问数组第一行的所有元素???
Cn=24;%电池容量

3.通过数据拟合方法,基于Matlab的曲线拟合工具箱cftool结合hppc辨识出来的参数。


for i=2:N
R1=0.03023*x(3,i-1)^6-0.1141*x(3,i-1)^5+0.1689*x(3,i-1)^4-0.1243*x(3,i-1)^3+0.04728*x(3,i-1)^2-0.008527*x(3,i-1)+0.0006967;
R2=0.003971*x(3,i-1)^6-0.005341*x(3,i-1)^5-0.006872*x(3,i-1)^4+0.01435*x(3,i-1)^3-0.007282*x(3,i-1)^2+0.001231*x(3,i-1)+0.0002082;
C1=510100*x(3,i-1)^6-1276000*x(3,i-1)^5+1031000*x(3,i-1)^3-176300*x(3,i-1)^2+69310*x(3,i-1)+909;
C2=-12940000*x(3,i-1)^6+39640000*x(3,i-1)^5-45050000*x(3,i-1)^4+23320000*x(3,i-1)^3-5467000*x(3,i-1)^2+523200*x(3,i-1)+52340;
A=[1-(1/(R1*C1)) 0 0;0 1-(1/(R2*C2)) 0;0 0 1];%系数矩阵A  3行3列
B=[1/C1 1/C2 1/(3600*Cn)]';%系数矩阵B 3行1列
H=(66.48+54.18*ii(1,i-1))*x(3,i-1)^5-(127.9+196.8*ii(1,i-1))*x(3,i-1)^4+(70.16+262.88*ii(1,i-1))*x(3,i-1)^3-(3.48-163.38*ii(1,i-1))*x(3,i-1)^2....
           -(4.58-48.42*ii(1,i-1))*x(3,i-1)-5.77*ii(1,i-1)+1.26;  %求一阶泰勒近似
C=[1,1,H];%系数矩阵C 1行3列 
if ii(1,:)>=0   %R0区分充放电来拟合,也是关于SOC的函数
    R0=(-0.1313*x(3,i-1)^3+0.4812*x(3,i-1)^2-0.5452*x(3,i-1)+2.96)/1000;%充电时欧姆内阻三阶拟合,除1000表示毫Ω化Ω
else
    R0=(9.033*x(3,i-1)^6-39.36*x(3,i-1)^5+65.72*x(3,i-1)^4-54.46*x(3,i-1)^3+24.21*x(3,i-1)^2 -5.774*x(3,i-1)+2.58)/1000;%放电时欧姆内阻6阶拟合 除1000表示毫Ω化Ω
end
Ppre=A*P*A'+eye(3)*Q;%协方差预测更新 3行3列   
xpre(:,i-1)=A*x(:,i-1)+B*ii(1,i-1);%状态x的预测更新 3行1列  第一行为U1,;第二行为U2;第三行为SOC
Usoc=11.08*xpre(3,i-1)^6-25.58*xpre(3,i-1)^5+17.54*xpre(3,i-1)^4-1.159*xpre(3,i-1)^3-2.386*xpre(3,i-1)^2....
    +1.263*xpre(3,i-1)+3.422;%开路电压Usoc是关于SOC的函数
K(:,i-1)=Ppre*C'*inv(C*Ppre*C'+R);%卡尔曼增益更新
Um(1,i-1)=Usoc+xpre(1,i-1)+xpre(2,i-1)+ii(1,i-1)*R0;%预测的电池端电压
e(1,i-1)=uu(1,i-1)-Um(1,i-1);%新息
x(:,i)=xpre(:,i-1)+K(:,i-1)*e(1,i-1);%状态的后验估计  / 状态估计测量更新
P=(eye(3)-K(:,i-1)*C)*Ppre;%协方差更新  
end

4.绘图,通过MATLAB的plot命令,绘制出EKF估计出的SOC与真实SOC的对比图如图1所示,以及SOC的误差图如图2所示。

figure	
hold on;box on;	
plot(x(3,:),'r','Linewidth',5);
plot(soc(1,:),'b','Linewidth',5);
xlabel('time  s');	
ylabel('SOC');
figure	
hold on;box on;	
plot(soc(1,:)-x(3,:),'c','Linewidth',3);

扩展卡尔曼滤波(EKF)估计SOC代码2详解,基于二阶RC模型(附MATLAB代码)

图1 EKF估计出的SOC与真实SOC的对比图

扩展卡尔曼滤波(EKF)估计SOC代码2详解,基于二阶RC模型(附MATLAB代码)

 图2 SOC的误差图

硕博期间所有的程序代码,一共2个多g,可以给你指导,赠送半个小时的语音电话答疑。电池数据+辨识程序+各种卡尔曼滤波算法都在里面了,后续还会有新模型的更新。快速入门BMS软件。某鹅:2629471989文章来源地址https://www.toymoban.com/news/detail-458226.html

到了这里,关于扩展卡尔曼滤波(EKF)估计SOC代码2详解,基于二阶RC模型(附MATLAB代码)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包