上次分享了一个扩展卡尔曼滤波估计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表示毫Ω化Ω
elseR0=(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);

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

图2 SOC的误差图

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

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

  1. Three.js实例详解___旋转的精灵女孩(附完整代码和资源)(一)

    Three.js实例详解___旋转的精灵女孩(附完整代码和资源)(一) 本文目录: 一.[旋转的精灵女孩]案例运行效果 二.Three.js简介 三.Three.js代码正常运行显示条件 (1)不载入 ...

  2. Three.js实例详解___旋转的精灵女孩(附完整代码和资源)(二)

    Three.js实例详解___旋转的精灵女孩(附完整代码和资源)(二) 本篇目录: 五.实例中所使用的代码语法详细解释 (1).构建一个三维空间场景 (2).选择一个透视投影相机作为观察点 (a).创 ...

  3. Three.js实例详解___旋转的精灵女孩(附完整代码和资源)(三)

    Three.js实例详解___旋转的精灵女孩(附完整代码和资源)(三) 本篇目录: 六.完整构建整个[旋转的精灵女孩]实例 (1).新建.启动webGL工程空间 (2).构建项目的目录层次结构 (2. ...

  4. 优化切尔诺贝利灾难模型——附matlab代码

    优化切尔诺贝利灾难模型--附matlab代码 切尔诺贝利核电站事故是人类历史上最严重的核事故之一,对环境和人类健康造成了极大的影响.针对这样的事故,科学家们开发了许多模型用于预测和优化应对措施.本文将 ...

  5. a*算法matlab代码_NSGAII多目标优化算法讲解(附MATLAB代码)

    小编今天为大家讲解NSGA-II多目标优化算法,提到多目标优化,大家可能第一个就想到NSGA-II算法,今天小编就带领大家解开NSGA-II的神秘面纱. NSGA-II全称是快速非支配排序遗传算法,这 ...

  6. 【图像去噪】基于正则化实现图像去噪附matlab代码

    1 简介 图像去噪一直是图像处理问题中一个重要的备受关注的问题,降质图像对于图像的进一步应用造成了很大局限性.从数学角度上来讲,图像去噪是一个反问题,对于含有模糊核的图像处理而言更是一个不适定的反问题 ...

  7. 【微电网优化】基于粒子群求解CHP机组、气网、电网、储热罐和电锅炉微电网优化模型附matlab代码

    1 简介 近年来随着全球性的环境污染问题与能源危机日益突出,人们的环保意识与节能意识不断提高,使得微电网成为了电力系统领域的研究热点之一.相对于传统的大电网,微电网具有自身的特点和优势,发电过程产生的 ...

  8. 【无人机】基于蒙特卡洛算法实现无人机任务分配模型附matlab代码

    1 简介 注意:所谓的实时分配指的是实时分配用户位置-根据实时分配的位置更新无人机的位置进而优化最优的分配任务 ​ 2 部分代码 clcclose allclear alldisp('无人机优化模型' ...

  9. 【SVM分类】基于支持向量机实现数据分类附matlab代码

    1 简介 支持向量机是利用已知数据类别的样本为训练样本,寻找同类数据的空间聚集特征,从而对测试样本进行分类验证,通过验证可将分类错误的数据进行更正.本文以体检数据为数据背景,首先通过利用因子分析将高维 ...

最新文章

  1. 教育部发文35所高校新增AI本科专业!想回去重新高考
  2. SPRING多个占位符配置文件解析源码研究--转
  3. 1090 Highest Price in Supply Chain (25 分)【难度: 一般 / 知识点: 树的遍历】
  4. MaskedTextBox
  5. arduino串口绘图_一起打造一款光驱迷你绘图仪
  6. Apache Shiro去掉URL中的JSESSIONID
  7. VTK:可视化之Hawaii
  8. 超级智能玩具《小小机器人》|全新50种玩法,创造力之源
  9. LeetCode 1. 两数之和(哈希)
  10. 使用程序修改域帐户直接领导时遇到的错误
  11. 在SQL SERVER里面用命令查包含某字段的表
  12. Atitit.h5 web webview性能提升解决方案-----fileStrore缓存离线存储+http方案
  13. 使用鸿蒙原生做游戏适配问题
  14. ASP运行环境--.NetBox 软件使用方法,怎样使用.NETBOX运行asp项目?
  15. 计算机表格外边框颜色怎么设置,#表格外部框线设置颜色#如何把excel里所有边框颜色改变...
  16. 使用 RSA 算法进行加解密,签名和验签
  17. JavaMail连接Office 365使用XOAUTH2身份认证
  18. CentOS7 添加开机启动项
  19. JavaScript之留言板制作
  20. sm缩写代表什么意思_股票黄线代表什么意思?

热门文章

  1. A 三角函数计算(train-ss)
  2. 修改props的属性值,Vue warn]: Avoid mutating a prop directly since the value will be overwritten
  3. matlab wgn未定义,解决matlab缺少awgn和wgn函数的问题
  4. 程序员如何写好技术简历
  5. 计算机乐谱深海少女,《深海少女》(初音ミク)钢琴谱
  6. 详解回文质数---洛谷1217---C语言
  7. 为什么C/C++程序员一定要阅读redis源码?腾讯面试教你做人【linux服务器开发】
  8. android notifydatasetchanged 不起作用,为什么android子线程更新数据再调用notifyDataSetChanged没有效果...
  9. 人生百味-1:人际关系的分支语句--10个switch,1个if else
  10. 请求状态码(Http常见状态码总结)