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

news2024/11/28 14:10:31

目录

一、原理部分

二、代码详解部分

三、结果及分析


一、原理部分

       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 all

HPPC_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)-1
    if I(j)==0&&I(j+1)<0
        A=[A j];%即将有电流的点
        B=[B j+1];%刚刚有电流的点
    end
end
for j=1:length(U)-1
    if I(j)<0&&I(j+1)==0
        C=[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==2
    lb = [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==3
    lb = [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==1
    R0 = R(1);
    U = V_05C_1_L;
    I = I_05C_1_L;    
elseif soc_chushizhi==0.9
    R0 = R(2);
    U = V_05C_09_L;
    I = I_05C_09_L;
elseif soc_chushizhi==0.8
    R0 = R(3);
    U = V_05C_08_L;
    I = I_05C_08_L;
elseif soc_chushizhi==0.7
    R0 = R(4);
    U = V_05C_07_L;
    I = I_05C_07_L;
elseif soc_chushizhi==0.6
    R0 = R(5);
    U = V_05C_06_L;
    I = I_05C_06_L;
elseif soc_chushizhi==0.5
    R0 = R(6);
    U = V_05C_05_L;
    I = I_05C_05_L;
elseif soc_chushizhi==0.4
    R0 = R(7);
    U = V_05C_04_L;
    I = I_05C_04_L;
elseif soc_chushizhi==0.3
    R0 = R(8);
    U = V_05C_03_L;
    I = I_05C_03_L;
elseif soc_chushizhi==0.2
    R0 = R(9);
    U = V_05C_02_L;
    I = I_05C_02_L;
elseif soc_chushizhi==0.1
    R0 = 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:N
    soc(i)=soc(i-1)+I(i)*1/(Cn*3600);   %  额定容量为2Ah
    ocv(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软件。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/620189.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用Flask高效构建Web应用

1、聊聊Flask框架 Flask官方文档 Flask是Armin ronacher基于Python开发的微型Web框架&#xff0c;诞生于2010年&#xff0c;它依赖于jinja2模板和Werkzeug WSGI服务。Flask的核心简单易于扩展&#xff0c;它不会替你做出太多决策比如使用何种数据库或模板引擎&#xff0c;这些都…

抖音seo矩阵系统源码解析

抖音SEO矩阵系统源码是一种用于优化抖音视频内容的工具&#xff0c;可以帮助用户提高抖音视频的搜索排名和流量&#xff0c;从而增加视频曝光和转化率。该系统包括两部分&#xff0c;即数据收集和分析模块以及SEO策略和实施模块。 数据收集和分析模块主要负责从抖音平台上收集…

认识功能安全

01、什么是功能安全 1-背景简介 由于汽车的复杂性&#xff0c;整个行业正在致力于提供符合安全要求的零部件系统。比如&#xff0c;线控油门系统&#xff0c;当驾驶员踩下油门踏板&#xff0c;踏板上的传感器向控制器发送信号时&#xff0c;控制器会综合分析如发动机转速、车…

ERP系统实施,8个需要了解的关键绩效指标

实施ERP系统是一项复杂的、耗时的工作&#xff0c;但它也代表了企业重新思考其战略、目标和流程的绝佳机会。成功的ERP实施可以激发创新&#xff0c;改善企业的所有领域。例如&#xff0c;通过集中企业各部门不断增长的财务和业务数据&#xff0c;所有的决策者都在同一个页面上…

非煤矿山电子封条系统算法方案 opencv

非煤矿山电子封条系统算法部署方案是基于pythonopencv网络模型Ai视频图像识别技术&#xff0c;非煤矿山电子封条系统算法部署方案对出入井人员、人员变化及非煤矿山生产作业状态等状况&#xff0c;及时发现处理异常动态将自动发出警报。OpenCV的全称是Open Source Computer Vis…

亲身经历告诉你,0基础转行学Python,毕业就能15000

对生活现状的不满&#xff0c;对自己浑浑噩噩的厌恶&#xff0c;以及对互联网行业的憧憬&#xff0c;让我下定决心选择去黑马程序员开启转行之旅。 学科 | Python大数据开发 薪资 | 15000 时间总是在你回忆往事时才会觉得短暂&#xff0c;来黑马之前觉得六个月将是一段很漫长…

操作系统原理 —— 内存动态分区分配算法(二十一)

在上一个章节我们讲了内存连续分配的几种方式&#xff0c;有单一、固定、动态这三种&#xff0c;在固定、动态这种里面&#xff0c;操作系统会记录空闲分区表&#xff0c;这个表是用来记录当前空闲的内存。 那么在之后有新的进程装入内存&#xff0c;需要从空闲分区表中找到一…

从零手写操作系统之RVOS内存管理模块简单实现-02

从零手写操作系统之RVOS内存管理模块简单实现-02 内存管理分类内存映射表&#xff08;Memory Map)Linker Script 链接脚本语法基于符号定义获取程序运行时内存分布 基于 Page 实现动态内存分配代码讲解调试 扩展 本系列参考: 学习开发一个RISC-V上的操作系统 - 汪辰 - 2021春 整…

qrcode.min.js下载

目录 qrcode.min.js下载步骤&#xff1a; 去官网 下载后解压&#xff1a; 如下&#xff1a;就可以得到 qrcode.min.js文件了 qrcode.min.js下载步骤&#xff1a; 去官网 可以前往qrcode官网&#xff08;https://davidshimjs.github.io/qrcodejs/&#xff09;下载qrcode.m…

培训pytorch(未完善) bp算法原理

生物的神经元 接受外部的刺激 神经网络工作流程演示

MySQL高可用集群解决方案之:MySql Cluster搭建

MySQL是当前使用最广泛的关系型数据库管理系统之一&#xff0c;但MySQL在高并发访问和大量数据处理方面存在较为明显的性能瓶颈。为了解决MySQL单点故障带来的不便和可扩展性问题&#xff0c;我们需要构建稳定性极高的MySQL集群方案。本文将介绍一种快速搭建MySQL集群的解决方案…

机器学习聚类算法——BIRCH算法、DBSCAN算法、OPTICS算法

系列文章目录 前言 本文主要介绍BIRCH算法、DBSCAN算法、OPTICS算法&#xff0c;以及相关案例举例&#xff0c;以下案例仅供参考 一、BIRCH算法 1.1、BIRCH算法简介 BIRCH&#xff08;Balanced Iterative Reducing and Clustering using Hierarchies&#xff0c;平衡迭代规约…

Kubernetes(K8s)各组件白话解释

深入springboot怎么启动tomcat NameSpacePodDeployment1. 创建多个副本2. 扩容/缩容3. 滚动更新4. 版本回退 ServiceClusterIpNodePort Ingress 个人笔记&#xff0c;仅供参考。 来源于尚硅谷视频 转载请评论。 NameSpace 名称空间&#xff0c;在K8s中用于隔离资源。对不同资源…

第十一届“泰迪杯”数据挖掘挑战赛成绩公示

第十一届“泰迪杯” 数据挖掘挑战赛成绩公示 第十一届“泰迪杯”数据挖掘挑战赛历时两个月顺利结束。竞赛采用盲审&#xff08;屏蔽参赛者信息&#xff1b;评审专家只能评阅非本区域作品&#xff1b;三位评阅专家同时评阅同一作品&#xff0c;超限调整后再取平均分&#xff0…

【小米的技术分享】数据库索引原理与底层数据结构解析

大家好&#xff0c;我是小米。今天我们来探讨一下数据库索引原理以及底层索引数据结构&#xff0c;同时还会介绍叶子节点存储的内容以及索引失效的情况。废话不多说&#xff0c;让我们开始吧&#xff01; IO操作与索引 首先&#xff0c;我们先来了解一下IO操作对于数据库索引的…

【区块链 | L2】作为Layer2赛道的领跑者,如何理解 Arbitrum?

上周我们介绍了以太坊L2扩展解决方案Optimism,本周我们继续介绍另一个L2解决方案——Arbitrum。Arbitrum 是以太坊的一个 Optimistic Rollup L2 可扩展性解决方案。 Part.1 什么是Arbitrum? Arbitrum 是一个构建在以太坊之上的区块链网络。你可以使用 Arbitrum 链来做任何在…

长短连接对压测的影响有多大?!

【引言】 当我们进行压力测试时&#xff0c;长短连接是一个非常重要的参数。但是&#xff0c;你知道吗&#xff1f;长短连接对于压测结果有着非常大的影响&#xff01;如果你不理解这个参数&#xff0c;那么你的压测结果可能会出现严重的偏差。 在这篇文章中&#xff0c;我将…

快速在linux上配置python3.9的环境以及可能报错的解决方案(python其它版本可同样方式安装)

一. linux安装python3.9 步骤1&#xff1a;安装系统依赖&#xff08;重要&#xff09; 这一步不执行&#xff0c;后面各种错误。 yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-d…

C#:不同登录用户阅读状态的修改:不同的登录用户,登录用户修改阅读状态后,状态变为已读,未修改阅读状态的用户,依然显示未读的程序实例

一、创建数据库 首先&#xff0c;可以使用SQL Server Management Studio创建一个新的数据库(MyDatabase) 以及三个表(Users, Messages, UserMessageStatus)&#xff0c;分别用于存储用户信息&#xff0c;消息信息以及用户消息状态。 Users表 该表包含了所有注册用户的信息。…

Es elasticsearch 十七 Java api 实现聚合 几个聚合示例 sql 开启许可 新特效 java 实现es7 sql 功能

目录 Java api 实现聚合 依赖 简单聚合按照颜色分组获取每个卖出数量 聚合每个颜色卖出数量&#xff0c;及平均价格&#xff08;每个分桶子聚合&#xff09; 按照颜色分组 &#xff0c;获取销售数量&#xff0c;avg min max sum 按照600区间价格范围分组&#xff0c;算出…