一、数据导入

这个脚本的主要目标是提供一个使用扩展卡尔曼滤波器(EKF)的电池荷电状态(SOC)估计的程序。使用二阶RC等效电路模型来分析电池在使用中的SOC和端电压(Vt),并考虑到电池表面温度的影响。该分析中使用的电池数据可在https://data.mendeley.com/datrxm/1.上公开获得。

首先,加载实验测量的电池时间、电压、电流和温度数据。这将作为EKF_SOC_Estimation函数的输入。由于真实的SOC不能直接测量并与EKF估计的SOC进行比较,因此使用颜色计数进行计算。 在这个程序中,真实的数据以前被组织成一个结构类型,然后保存为一个.mat文件。一旦执行“load”命令,工作区中的“meas”数据将加载,其中包含电池时间、电压、电流和温度数据。如果将数据保存在Excel电子表格中,则使用命令“xlsread”,并相应地将数据分配给相应的LiPoly结构。

load('04-12-19_04.45 765_LA92_40degC_Turnigy_Graphene.mat');
LiPoly.RecordingTime            = meas.Time;
LiPoly.Measured_Voltage         = meas.Voltage;
LiPoly.Measured_Current         = meas.Current;
LiPoly.Measured_Temperature     = meas.Battery_Temp_degC;nominalCap                      = 4.81; % Battery capacity in Ah taken from data.
LiPoly.Measured_SOC             = (nominalCap + meas.Ah).*100./nominalCap;  % Calculate the SOC using Coloumb Counting for comparison

根据数据的大小,可能需要重新采样以节省计算时间。在下面的代码行中,数据从10 Hz重新采样到1 Hz。如果需要,可以对这部分进行更改。

LiPoly.RecordingTime            = LiPoly.RecordingTime(1:10:end);
LiPoly.Measured_Voltage         = LiPoly.Measured_Voltage(1:10:end);
LiPoly.Measured_Current         = LiPoly.Measured_Current(1:10:end);
LiPoly.Measured_Temperature     = LiPoly.Measured_Temperature(1:10:end);
LiPoly.Measured_SOC             = LiPoly.Measured_SOC(1:10:end);

本脚本将电流的正值作为放电电流,将负值作为充电电流。如果用户记录的数据具有相反的定义,那么使用第17行中的命令来反转此定义,否则则注释第17行。为了绘图目的,将采样时间从秒转换为小时。

% 电流定义: (+) 放电, (-) 充电
LiPoly.Measured_Current_R       = - LiPoly.Measured_Current;% 将秒转化成小时
LiPoly.RecordingTime_Hours      = LiPoly.RecordingTime/3600;

EKF_SOC_Estimation Function

给定测量的电流、电压、SOC和温度,以下函数输出SOC和Vt的估计值,以及与测量相关误差。EKF_SOC_Estimation Function模块的详细设计将在下一篇博客进行讲解。

[SOC_Estimated, Vt_Estimated, Vt_Error] = EKF_SOC_Estimation(LiPoly.Measured_Current_R, LiPoly.Measured_Voltage, LiPoly.Measured_Temperature);

二、绘制结果并计算误差

1.测量端电压vs估计端电压

figure
plot(LiPoly.RecordingTime_Hours,LiPoly.Measured_Voltage);
hold on
plot(LiPoly.RecordingTime_Hours,Vt_Estimated);
hold off;
legend('Measured','Estimated EKF');
ylabel('Terminal Voltage[V]');xlabel('Time[hr]');
title('Measured vs. Estimated Terminal Voltage (V) at 40 Deg C')
grid minor

2.端电压误差

figure
plot(LiPoly.RecordingTime_Hours,Vt_Error);
legend('Terminal Voltage Error');
ylabel('Terminal Voltage Error');
xlabel('Time[hr]');

3.真实SOC vs EKF估计的SOC

figure
plot (LiPoly.RecordingTime_Hours,LiPoly.Measured_SOC);
hold on
plot (LiPoly.RecordingTime_Hours,SOC_Estimated*100);
hold off;
legend('Coulomb Counting','Estimated EKF');
ylabel('SOC[%]');xlabel('Time[hr]');
title('Coulomb Counting vs. SOC Estimated at 40 Deg C')
grid minor

4.SOC误差

figure
plot(LiPoly.RecordingTime_Hours,(LiPoly.Measured_SOC - SOC_Estimated*100));
legend('SOC Error');
ylabel('SOC Error [%]');
xlabel('Time[hr]');
grid minor

5.计算端电压(Vt)和SOC的均方根误差(RMSE)和最大误差(MAX)

RMSE_Vt     = sqrt((sum((LiPoly.Measured_Voltage - Vt_Estimated).^2)) /(length(LiPoly.Measured_Voltage)))*1000 % mV
RMSE_SOC    = sqrt((sum((LiPoly.Measured_SOC - SOC_Estimated*100).^2)) /(length(LiPoly.Measured_SOC))) % (%)
Max_Vt      = max(abs(LiPoly.Measured_Voltage - Vt_Estimated))*1000 % mV
Max_SOC     = max(abs(LiPoly.Measured_SOC - SOC_Estimated*100)) % (%)

RMSE_vt = 1.3154;

RMSE_soc = 1.9440;

Max_vt = 17.7890;

Max_soc = 2.8007;

使用扩展卡尔曼滤波(EKF)估计电池SOC(附MATLAB程序及详解)part1主函数篇相关推荐

  1. ekf估计电池soc过程推导(一)状态方程列写及离散化

    SOC是什么 SOC(State of Charge)即电池的电荷状态,通常用百分比表示.它表示电池目前已经存储了多少电量,是电池容量的一个比例. 例如,如果一个电池的额定容量为1000mAh,而目前 ...

  2. 激光雷达的检测仿真代码详解(附Matlab源码详解)

    一.创建velodyneFileReader 本示例中的激光雷达数据来自安装在车辆上的激光雷达Velodyne HDL32E.创建velodyneFileReader对象以读取录制的PCAP文件. f ...

  3. 基于自适应无迹卡尔曼滤波算法(AUKF)锂电池SOC估计,噪声系数自适应 Matlab程序

    基于自适应无迹卡尔曼滤波算法(AUKF)锂电池SOC估计,噪声系数自适应 Matlab程序 仿真模型建模数据mat Sci一篇参考文献 ID:77100657373800632张徳帅123

  4. ## ***电池SOC仿真系列-基于扩展卡尔曼(EKF)算法的SOC估计(内含代码等资料)***

    ## ***电池SOC仿真系列-基于扩展卡尔曼(EKF)算法的SOC估计(内含代码等资料)*** ## 1 研究背景 电池的荷电状态(SOC)代表的是电池当前的剩余容量,数值定义是电池剩余电量与电池额 ...

  5. 基于扩展卡尔曼滤波EKF和模型预测控制MPC,自动泊车场景建模开发

    基于扩展卡尔曼滤波EKF和模型预测控制MPC,自动泊车场景建模开发,文复现. MATLAB 基于扩展卡尔曼滤波EKF和模型预测控制MPC,自动泊车场景建模开发,文复现. MATLAB(工程项目线上支持 ...

  6. 控制算法学习 四、扩展卡尔曼滤波EKF

    控制算法学习 四.扩展卡尔曼滤波EKF 前言 非线性系统 状态/观测方程线性化 扩展卡尔曼滤波EKF 后记 前言 经典卡尔曼滤波的使用场景是线性系统,但现实应用时,大多数系统都是非线性的.扩展卡尔曼滤 ...

  7. EKF SLAM Matlab仿真实践详解(附源码)

    EKF SLAM Matlab仿真实践详解(附源码) 为提供更好的阅读体验,详细内容及源码请移步https://github.com/Nrusher/EKF_SLAM 或 https://gitee. ...

  8. 用MATLAB实现转子的故障诊断,单盘转子故障诊断报告(附matlab程序).doc

    单盘转子故障诊断报告(附matlab程序).doc 单盘转子故障诊断报告1数据TEST1TXT,数据长度1556486,2组振动数据第一.二列为测点1涡流传感器X.Y振动数据:第三.四列为测点2涡流传 ...

  9. 用matlab仿真导航信号,北斗卫星导航信号串行捕获算法MATLAB仿真报告(附MATLAB程序)[互联网+]...

    <北斗卫星导航信号串行捕获算法MATLAB仿真报告(附MATLAB程序)[互联网+]>由会员分享,可在线阅读,更多相关<北斗卫星导航信号串行捕获算法MATLAB仿真报告(附MATLA ...

最新文章

  1. Windows 8失败的5个原因
  2. 【C++基础 09】避免对象的拷贝
  3. python调用系统_python 执行系统命令
  4. linux远程挽救模式,linux – 如何在远程重启Redhat后进入SSH并进入恢复模式?
  5. JAVA获得天气json数据的方法,获取从天气预报接口返回回来的json数据
  6. c++高斯投影正反算_为何买手机要选Type-C接口的?除充电快以外,还隐藏这4个妙用...
  7. 同济保研计算机,同济大学保研率28%,保研高校前四:复旦、北大、交大、清华...
  8. python账户密码_python02 用户名密码
  9. 常用标准库_Python入门(五):常用标准库sys和os
  10. 批处理禁用U盘,光驱,用户添加到组,盘符添加权限
  11. python网络图可视化_蜘蛛网图实现Python可视化的方法
  12. 图像滤镜艺术---美颜相机之高级柔焦效果实现
  13. 信息搜集-读取微信聊天记录
  14. 2020-12-01
  15. angular实现双向绑定
  16. SAP message TK 248 solved
  17. 【北邮国院大二下】产品开发与营销知识点整理 Topic11
  18. 软件著作权申请有什么条件?
  19. 随性的很-python基础 1
  20. 第一篇 重新认识皮肤

热门文章

  1. 你并不理解的 电快速瞬变脉冲群 实验
  2. STM32基于正点原子ALIENTEK探索者开发板的跑马灯实验
  3. Mac上的日程和任务管理工具Things3你get了吗
  4. 安卓平板标注pdf,坚果云+zotero+xodo
  5. 【UEFI实战】OS下如何查看系统相关信息
  6. joomla QQ登录,微信登录,微博登陆,人人登陆,明道登录的第三方登录
  7. dnf计算机配置检测,dnf电脑配置测试。
  8. Java 在线纸牌游戏
  9. Qt汉化QColorDialog窗口
  10. pkpm2020安装教程 v5.1.0附安装教程