当前位置: 首页 > news >正文

使用粒子群优化算法(PSO)辨识锂电池二阶RC模型参数(附MATLAB代码)

目录

一、原理部分

二、代码详解部分

三、结果及分析


一、原理部分

       PSO算法由美国学者于 1995 年提出,因其算法简单、效果良好,而在很多领域得到了广泛应用。该算法的起源是模拟鸟群的觅食过程,形成一种群体智能搜索算法。

       其核心是,通过迭代的方式来寻求最优解的过程。在算法运行过程中,在每一次迭代中会筛选出微粒最优解和群体最优解。然后,通过向最优解学习的方式,每个粒子都能不断地更新自身的速度和位置,从而逐渐使得整个群体中的所有微粒,都趋近目标函数的最优解,最终达到优化要求。

       “粒子”在不同的情景下,代表不同的群体,但是其没有质量和体积,算法中重点强调的是其代表的位置和速度。空间中的所有粒子,都有相对应的表达式,迭代到第t代的第i个粒子,它在空间中的位置和速度如下式所示:

       个体极值用来描述, t代的第 个微粒运行到当前时刻,所经历的历史最优位置,用下式表示 :

        全局极值用来描述,整个粒子群算法运行到当下时刻,所搜索到的最优位置,用下式表示:

       找出全局极值后,需要对下一代粒子的速度和位置进行更新,以往最优目标方向引导整个粒子群。第i个粒子的速度及位置更新的公式如下:

 下标  表示搜索空间的维度。c 和c为粒子的学习因子,一般按经验值来取,为非负常数。 c和c分别代表粒子向个体极值和全局值靠拢的一次步长;w为惯性权重其可以代表第t代粒子的速度对当前第 +1 代粒子速度的影响,如果w 偏大,则粒子全局搜索能力强、局部搜索能力太弱:如果w偏小,则粒子全局能力弱,局部搜索能力太强。改变 w 值可以相应的调整粒子的全局搜索能力和局部搜索能力;和为随机数均匀分布在[0,1]区间上。

       本文运用粒子群算法进行参数辨识的流程为:设定目标函数,目标函数是关于4个电池参数的函数;对目标函数寻优,有同学可能会好奇为什么是4个参数而不是5个参数,这里解释一下,R0参数的辨识是通过充放电瞬间的压降来识别的,即

,因此本套代码只适用于HPPC工况下的参数辨识,当目标函数收敛至最优值时,相应的参数也收敛至稳定值。

       在本项目中,目标函数设置为:

 U(k+1)为 k+1时刻,电池的实际输出电压。Y(k+1)为经过粒子群算法输出的跟随电压,它是关于电池5个参数的函数,如下式所示:

        当目标函数取得稳定收敛值时,参数也取得了相应合理值。本质为通过目标函数寻优,进行参数辨识。

二、代码详解部分

1.清空环境变量并读取HPPC的电流、电压,时间单位为1s。

clc;clear;close allHPPC_25_05C = xlsread('013005-2021-07-01 07-30-1209fc.xls','记录列表1');
ZI_SOC_05 = [0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1];
ZI_OCV_05 = [3.24899 3.36034 3.48125 3.56082 3.60988 3.66923 3.77507 3.86842 3.94964 4.05713 4.16831];

2.拟合OCV-SOC曲线,利用8次多项式拟合

p = polyfit(ZI_SOC_05,ZI_OCV_05,8);   %  多项式拟合参数调用的格式,8次多项式拟合公式

3.数据的处理,如将数据中为NAN的数据删除

V_05C = HPPC_25_05C(:,4)/1000;
I_05C = HPPC_25_05C(:,5);
V_05C(isnan(V_05C)==1) = [];   %  将数据中为NAN的数据删除
I_05C(isnan(I_05C)==1) = [];

4.辨识R0的参数,利用两个电压值来辨识

U = V_05C(11583:end,:)';
I = I_05C(11583:end,:)';A=[];B=[];C=[];D=[];
for j=1:length(U)-1if I(j)==0&&I(j+1)<0A=[A j];%即将有电流的点B=[B j+1];%刚刚有电流的点end
end
for j=1:length(U)-1if I(j)<0&&I(j+1)==0C=[C j];%电流即将变为0的点D=[D j+1];%电流刚变为0的点end
end
M1=U(1,A);%即将有电流的点
M2=U(1,B);%刚刚有电流的点
N1=U(1,C);%电流即将变为0的点
N2=U(1,D);%电流刚变为0的点
%   R=(M1-M2+N2-N1)/2/1.375;%计算R0
R=(N2-N1)/1.375;%计算R0
R0_Pingjun=mean(R(2:8)); % 取SOC>20%的R0,平均值认为是欧姆内阻的值。

5.各种参数设置

timer1=cputime;
Ts=1;%系统采样时间
Cn=2.75;
soc_chushizhi=0.5; %SOC的初始值(必须知道脉冲放电或者充电前的SOC,而且是准确的,可根据开路电压曲线知道)   
model_RC=2;     %  模型的选择 
if model_RC==1  %R  int模型%  参数上下值界限     Canshu = [R1,C1];lb = [1e-03,1e-02];ub = [5e-02,1e+06];     %   ub = [2e-01,1e+06];     %  0的时候的参数值dim = 2;
elseif model_RC==2lb = [1e-03,1e-03,1e+01,1e+01];ub = [5e-02,3e-02,1e+06,1e+06];%  ub = [2e-01,2e-01,1e+06,1e+06];    %  0的时候的参数值dim = 4;
elseif model_RC==3lb = [1e-03,1e-03,1e-03,1e-02,1e-02,1e-02];ub = [5e-02,3e-02,3e-02,1e+06,1e+06,1e+06];%  ub = [2e-01,2e-01,2e-01,1e+06,1e+06,1e+06];    %  0的时候的参数值dim = 6;
end

6.导入数据,计算ocv、soc真实值、开路电压多项拟合参数选择;实验数据是两列,第一列是电压、第二列是电流(mA)其实,只需要其中辨识脉冲那部分的电池端电压、电流数据即可。

匹配SOC初始值。

if soc_chushizhi==1R0 = R(1);U = V_05C_1_L;I = I_05C_1_L;    
elseif soc_chushizhi==0.9R0 = R(2);U = V_05C_09_L;I = I_05C_09_L;
elseif soc_chushizhi==0.8R0 = R(3);U = V_05C_08_L;I = I_05C_08_L;
elseif soc_chushizhi==0.7R0 = R(4);U = V_05C_07_L;I = I_05C_07_L;
elseif soc_chushizhi==0.6R0 = R(5);U = V_05C_06_L;I = I_05C_06_L;
elseif soc_chushizhi==0.5R0 = R(6);U = V_05C_05_L;I = I_05C_05_L;
elseif soc_chushizhi==0.4R0 = R(7);U = V_05C_04_L;I = I_05C_04_L;
elseif soc_chushizhi==0.3R0 = R(8);U = V_05C_03_L;I = I_05C_03_L;
elseif soc_chushizhi==0.2R0 = R(9);U = V_05C_02_L;I = I_05C_02_L;
elseif soc_chushizhi==0.1R0 = R(10);U = V_05C_01_L;I = I_05C_01_L;
end

7.安时积分法计算soc

N = length(I);
soc(1)=soc_chushizhi; 
ocv(1)=U(1);   %   你自己初始ocv-soc数据 
for i=2:Nsoc(i)=soc(i-1)+I(i)*1/(Cn*3600);   %  额定容量为2Ahocv(i)=polyval(p,soc(i)); 
end

8.PSO部分参数的初始化。

test_number=2;%测试次数,测试多次,去最好那个
SearchAgents_no=100;%种群,最好选择100
Max_iter=500;%迭代次数
Alpha_score=zeros(test_number,1);
Alpha_pos=zeros(test_number,dim);
Convergence_curve=zeros(test_number,Max_iter);
R0_R1_C1_R2_C2_curve=zeros(dim,Max_iter/SearchAgents_no,test_number);%三维矩阵

9.非常重要的function,输入为:种群数量、迭代次数、电流初始值、电压初始值、辨识参数的维度(4维,即R1、R2、C1、C2)、电压序列、电流序列、OCV值、R0、模型阶数;输出为最优粒子群适应度函数值、适应度迭代曲线、端电压误差、端电压值。

for i=1:test_number[Alpha_score,Alpha_pos,Convergence_curve,X_error,U_duan]=PSO_R0(SearchAgents_no,Max_iter,lb,ub,dim,U,I,ocv,R0,model_RC);
end

三、结果及分析

       粒子群优化算法的适应度函数随迭代次数的变数曲线如图1所示,真实端电压曲线与粒子群辨识出来的参数所仿真出的端电压曲线如图2所示,两者之间的误差如图3所示。

图1

图2 

图3 

点击下方的长方形小方框内有博主的QQ名片获取本文同款程序

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

 

相关文章:

使用粒子群优化算法(PSO)辨识锂电池二阶RC模型参数(附MATLAB代码)

目录 一、原理部分 二、代码详解部分 三、结果及分析 一、原理部分 PSO算法由美国学者于 1995 年提出&#xff0c;因其算法简单、效果良好&#xff0c;而在很多领域得到了广泛应用。该算法的起源是模拟鸟群的觅食过程&#xff0c;形成一种群体智能搜索算法。 其核心是&#…...

如何利用地面控制点实现倾斜摄影三维模型数据的几何坐标变换和纠正?

如何利用地面控制点实现倾斜摄影三维模型数据的几何坐标变换和纠正&#xff1f; 倾斜摄影是一种在空中拍摄地表物体的技术&#xff0c;可以获得高分辨率、高精度的三维模型数据&#xff0c;广泛应用于城市规划、建筑设计、土地管理等领域。然而&#xff0c;由于航拍时无法避免姿…...

设计规则之里氏替换原则

tip: 作为程序员一定学习编程之道&#xff0c;一定要对代码的编写有追求&#xff0c;不能实现就完事了。我们应该让自己写的代码更加优雅&#xff0c;即使这会费时费力。 相关规则&#xff1a; 推荐&#xff1a;体系化学习Java&#xff08;Java面试专题&#xff09; 1.6大设…...

【叠高高】叠蛋糕游戏的微信小程序开发流程详解

记得小时候玩过的搭积木游戏吗&#xff0c;和叠高高游戏原理差不多的&#xff0c;与之类似的还有盖高楼游戏&#xff0c;就是看谁盖的&#xff08;叠的&#xff09;最高&#xff0c;这里讲一下比较基础的叠高高游戏小程序实现过程&#xff0c;对编程感兴趣的同学可以参考学习一…...

收集关键词的方法有哪些?(如何查找精准的行业流量关键词)

关键词的收集通常可以通过以下几种方法: 关键词收集方法 1.根据市场价值、搜索词竞争性和企业实际产品特征进行筛选&#xff1a;确定您的关键词列表之前&#xff0c;建议先进行市场分析&#xff0c;了解您的竞争对手、行业状况和目标受众等信息&#xff0c;以更好地了解所需的特…...

【GreenDao】RxQuery查询并修改GreenDao数据库,完成后更新UI

GreenDao是一个轻量级的ORM&#xff08;对象关系映射&#xff09;数据库&#xff0c;而RxJava是一个响应式编程库&#xff0c;可以帮助我们更轻松地处理异步事件。在 Android 应用程序中&#xff0c;您可以使用这两个库一起处理数据库查询和更新&#xff0c;并使用观察者模式来…...

Modifier ‘public‘ is redundant for interface methods错误

java中接口的方法默认是 public abstract 的 所以放心的删掉public即可&#xff0c;如果改为protected 或者 private还会报错 接口的方法及变量的默认修饰符 1.接口中每一个方法也是隐式抽象的,接口中的方法会被隐式的指定为 public abstract &#xff08;只能是 public abst…...

Redis缓存击穿及解决问题

缓存击穿的意思是对于设置了过期时间的key,缓存在某个时间点过期的时候&#xff0c;恰好这时间点对这个 Key有大量的并发请求过来&#xff0c;这些请求发现缓存过期- -般都会从后端DB加载数据并回设到缓存&#xff0c;这个时候大并发的请求可能会瞬间把DB压垮。 解决方案有两种…...

环境感知算法——2.CenterNet基于KITTI数据集训练

1. CenterNet简介 CenterNet采用了一种新的检测思路&#xff0c;即以目标中心点为基础&#xff0c;直接回归出目标的位置和大小。而传统的目标检测算法通常会先产生大量候选框&#xff08;Anchor&#xff09;&#xff0c;再通过分类器进行筛选&#xff0c;这种方法比较复杂。C…...

JUC 高并发编程基础篇

JUC 高并发编程基础篇 • 1、什么是 JUC • 2、Lock 接口 • 3、线程间通信 • 4、集合的线程安全 • 5、多线程锁 • 6、Callable 接口 • 7、JUC 三大辅助类: CountDownLatch CyclicBarrier Semaphore • 8、读写锁: ReentrantReadWriteLock • 9、阻塞队列 • 10、ThreadPo…...

【十二】设计模式~~~行为型模式~~~命令模式(Java)

命令模式-Command Pattern【学习难度&#xff1a;★★★☆☆&#xff0c;使用频率&#xff1a;★★★★☆】 1.1. 模式动机 在软件设计中&#xff0c;我们经常需要向某些对象发送请求&#xff0c;但是并不知道请求的接收者是谁&#xff0c;也不知道被请求的操作是哪个&#xf…...

可再生能源的不确定性和储能系统的时间耦合的鲁棒性和非预期性区域微电网的运行可行性研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…...

Revit中如何使创建的族文件内存变小

族文件的大小直接影响到项目文件的大小和软件运行速度&#xff0c;如何将族文件做的最小并且满足项目需求呢? 方法一&#xff1a;清除未使用项 1. 族制作完成可以把族文件中未用到的外部载入族或其他多余数据删掉&#xff0c;点击“管理”选项卡下拉的“清除未使用项”命令; 2…...

ClassLoader源码

介绍 ClassLoader 顾名思义就是类加载器 ClassLoader 是一个抽象类 没有父类 作用 1.负责将 Class 加载到 JVM 中 2.审查每个类由谁加载&#xff08;父优先的等级加载机制&#xff09; 3.将 Class 字节码重新解析成 JVM 统一要求的对象格式 常量&变量 //注册本地方法…...

Kafka分区消息积压排查指南

针对某个TOPIC只有几个分区积压的场景&#xff0c;可以采用以下方法进行排查&#xff1a; 消息生产是否指定key&#xff1f; 如果指定了消息key&#xff0c;那么消息会指定生产到hash(key)的分区中。如果指定了key&#xff0c;那么有下列几种可能&#xff1a; 生产该key的消息体…...

数据库 期末复习(4) 概念数据库的设计

第一部分 为啥要引入概念数据库 感觉只有一个重点 实体联系模型----ER模型 第二部分-----实体联系模型 这个例子可以全看完之后再来看 举个例子:根据COMPANY数据库的需求来构造数据库模式:The company is organized into DEPARTMENTs. Each department has a name, number …...

WuThreat身份安全云-TVD每日漏洞情报-2023-05-26

漏洞名称:Barracuda Email Security Gateway TAR文件命令注入 漏洞级别:严重 漏洞编号:CVE-2023-2868,CNNVD-202305-2128 相关涉及:Barracuda Email Security Gateway 5.1.3.001 漏洞状态:在野 参考链接:https://tvd.wuthreat.com/#/listDetail?TVD_IDTVD-2023-12949 漏洞名称…...

关于Idea的一些常用设置项

1. 输出中文不乱码 设置工程项目编码 file -> settings -> Editor -> File Encodings-> 如下图通通UTF-8 2. 创建文件自动设置本文模板 File–>settings–>Editor–>File and Code Templates–>Includes -> 输入类注释模板 /*** Classname ${N…...

Python使用WMI模块获取Windows系统的硬件信息,并使用pyinstaller库编译打包成exe的可执行文件

引言 今天给大家分享一篇有关Python和Windows系统的文章。你有没有想过如何获取Windows系统的硬件信息&#xff1f;或者你是否曾经尝试过将Python脚本编译打包成可执行文件&#xff1f;如果你对这些问题感兴趣&#xff0c;那么这篇文章一定适合你。 背景 由于公司现阶段大多…...

JavaScript语句(七)

JavaScript语句 1、条件语句2、循环语句3、break 和 continue 语句4、异常处理语句4.1、抛出异常4.2、捕获异常4.3、处理异步代码块中的异常4.3.1、Promise4.3.2、async/await try-catch 4.4、处理未捕获的异常4.5、总结 1、条件语句 名称描述if当指定条件为 true 时&#xf…...

基于算法竞赛的c++编程(28)结构体的进阶应用

结构体的嵌套与复杂数据组织 在C中&#xff0c;结构体可以嵌套使用&#xff0c;形成更复杂的数据结构。例如&#xff0c;可以通过嵌套结构体描述多层级数据关系&#xff1a; struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...

iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘

美国西海岸的夏天&#xff0c;再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至&#xff0c;这不仅是开发者的盛宴&#xff0c;更是全球数亿苹果用户翘首以盼的科技春晚。今年&#xff0c;苹果依旧为我们带来了全家桶式的系统更新&#xff0c;包括 iOS 26、iPadOS 26…...

大模型多显卡多服务器并行计算方法与实践指南

一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...

(转)什么是DockerCompose?它有什么作用?

一、什么是DockerCompose? DockerCompose可以基于Compose文件帮我们快速的部署分布式应用&#xff0c;而无需手动一个个创建和运行容器。 Compose文件是一个文本文件&#xff0c;通过指令定义集群中的每个容器如何运行。 DockerCompose就是把DockerFile转换成指令去运行。 …...

JavaScript基础-API 和 Web API

在学习JavaScript的过程中&#xff0c;理解API&#xff08;应用程序接口&#xff09;和Web API的概念及其应用是非常重要的。这些工具极大地扩展了JavaScript的功能&#xff0c;使得开发者能够创建出功能丰富、交互性强的Web应用程序。本文将深入探讨JavaScript中的API与Web AP…...

【Nginx】使用 Nginx+Lua 实现基于 IP 的访问频率限制

使用 NginxLua 实现基于 IP 的访问频率限制 在高并发场景下&#xff0c;限制某个 IP 的访问频率是非常重要的&#xff0c;可以有效防止恶意攻击或错误配置导致的服务宕机。以下是一个详细的实现方案&#xff0c;使用 Nginx 和 Lua 脚本结合 Redis 来实现基于 IP 的访问频率限制…...

CVPR2025重磅突破:AnomalyAny框架实现单样本生成逼真异常数据,破解视觉检测瓶颈!

本文介绍了一种名为AnomalyAny的创新框架&#xff0c;该方法利用Stable Diffusion的强大生成能力&#xff0c;仅需单个正常样本和文本描述&#xff0c;即可生成逼真且多样化的异常样本&#xff0c;有效解决了视觉异常检测中异常样本稀缺的难题&#xff0c;为工业质检、医疗影像…...

MFE(微前端) Module Federation:Webpack.config.js文件中每个属性的含义解释

以Module Federation 插件详为例&#xff0c;Webpack.config.js它可能的配置和含义如下&#xff1a; 前言 Module Federation 的Webpack.config.js核心配置包括&#xff1a; name filename&#xff08;定义应用标识&#xff09; remotes&#xff08;引用远程模块&#xff0…...

【题解-洛谷】P10480 可达性统计

题目&#xff1a;P10480 可达性统计 题目描述 给定一张 N N N 个点 M M M 条边的有向无环图&#xff0c;分别统计从每个点出发能够到达的点的数量。 输入格式 第一行两个整数 N , M N,M N,M&#xff0c;接下来 M M M 行每行两个整数 x , y x,y x,y&#xff0c;表示从 …...

十二、【ESP32全栈开发指南: IDF开发环境下cJSON使用】

一、JSON简介 JSON&#xff08;JavaScript Object Notation&#xff09;是一种轻量级的数据交换格式&#xff0c;具有以下核心特性&#xff1a; 完全独立于编程语言的文本格式易于人阅读和编写易于机器解析和生成基于ECMAScript标准子集 1.1 JSON语法规则 {"name"…...