主要内容

从数据中提取电池参数

这个例子展示了优化电池块的参数以适应数据定义在不同的温度。它使用MATLAB®优化功能fminsearch。其他产品可用s manbetx 845于执行这种类型的参数拟合与Simscape™电气™模型优化工具箱™和Simulink®设计优化™。万博1manbetx这些产品提供s manbetx 845预定义的功能操作和分析模块使用gui或命令行方法。

策略

适合对电池输出电压曲线数据使用4步过程:

  1. 电池主要的优化参数对话框选项卡。

  2. 优化参数电池动态对话框中的选项卡。

  3. 优化额定电压和电池的内部电阻的温度依赖性对话框选项卡。

  4. 优化温度依赖电池的温度依赖性的电荷动力学参数对话框选项卡。

数据和块的设置

MATLAB数据文件,ee_battery_data.mat,商店电池数据作为一个结构数组。每个结构包含5个字段:v(电压),(当前)t(时间),SOC0(初始状态)和T(温度)。保存输出电压范围结构数据,out.Vo.signals.values。

%的电池数据加载负载ee_battery_data.matassignin (“基地”,“T1”battery_data(找到([battery_data (1:2) .T] = = 25)) .T);assignin (“基地”,《终结者2》battery_data(找到([battery_data (1:2) .T] ~ = 25)) .T);%显示电池模型模型=“ee_battery”;open_system(模型)

close_system(模型中,0);

初始参数规格

起始值fminsearch可以使用的组合电池块估计违约和数据表的值

优化前的参数和初始值列表

ParsListMain = {“Vnom”,R1的,“啊”,“V1”,“AH1”};InitGuessMain = (3.6, 0.045, 2.7, 3.4, 1.4);ParsListDyn = {“一国”,“tau1”};InitGuessDyn = (0.006, 200);ParsListTemp = {“Vnom_T2”,“R1_T2”,“V1_T2”,“Rp1_T2”,“tau1_T2”};InitGuessTemp = [3.8, 0.055, 3.6, 0.006, 200);Pars0 =重塑([[ParsListMain ParsListDyn ParsListTemp);cellstr (num2str ([InitGuessMain InitGuessDyn InitGuessTemp)))), 1, []);流(' \ t % 5 s = % s \ n ',Pars0 {:});清晰的Pars0
Vnom = 3.6 R1 V1 = 0.045啊= 2.7 = 3.4 AH1 = 1.4一国= 0.006 tau1 = 200 Vnom_T2 = 3.8 R1_T2 = 0.055 V1_T2 = 3.6 Rp1_T2 = 0.006 tau1_T2 = 200

fminsearch是一个无约束非线性优化器,定位一个局部最小值的一个函数,不同的初始估计将导致不同的解集。

图数据与电池输出使用初始参数

负载单电池模型和设置参数

load_system(模型);%启用快速启动加速仿真set_param(模型,“FastRestart”,“上”)Pars =重塑([ParsListMain;cellstr (num2str (InitGuessMain ') '], 1, []);k = 1:2:长度(Pars) evalin (“基地”,(Pars {k}“=”帕尔斯{k + 1}“;”])结束帕尔斯=重塑([ParsListDyn;cellstr (num2str (InitGuessDyn ') '], 1, []);k = 1:2:长度(Pars) evalin (“基地”,(Pars {k}“=”帕尔斯{k + 1}“;”])结束帕尔斯=重塑([ParsListTemp;cellstr (num2str (InitGuessTemp ') '], 1, []);k = 1:2:长度(Pars) evalin (“基地”,(Pars {k}“=”帕尔斯{k + 1}“;”])结束%生成初步模型曲线和暗算数据num_lines =长度(battery_data) 1;v_model =细胞(1、num_lines);t_model =细胞(1、num_lines);legend_info_data =细胞(1、num_lines);legend_info_model =细胞(1、num_lines);idx_data = 1: num_lines assignin (“基地”,“t_data”battery_data (idx_data) .t);assignin (“基地”,“i_data”battery_data (idx_data)。我);assignin (“基地”,“T_data”battery_data (idx_data) .T *的(长度(t_data), 1));assignin (“基地”,“T0”battery_data (idx_data) .T);assignin (“基地”,“t”t_data (2) -t_data (1));assignin (“基地”,“AH0”,啊* battery_data (idx_data) .SOC0);= sim(模型);v_model {idx_data} = out.Vo.signals.values;t_model {idx_data} = out.Vo.time;legend_info_data {idx_data} = [“临时= 'num2str (battery_data (idx_data) .T)“\ circC、数据”];legend_info_model {idx_data} = [“临时= 'num2str (battery_data (idx_data) .T)“\ circC模式”];结束情节([battery_data (1: num_lines)。t]/3600, [battery_data(1:num_lines).v],“o”,(t_model {}): / 3600, [v_model{}):)包含(的时间(小时));ylabel (“电池电压(V)”);传奇([legend_info_data legend_info_model),“位置”,“最佳”);标题(“模型与初始参数值”);

误差平方和计算

ee_battery_lse最小化的功能吗fminsearch。这个函数返回一个误差平方和为电池输出电压之间的差异和数据。如果一个无效的参数值是由fminsearch,错误的语句返回一个较大的值。

免费优化主要标签对话框参数动力学(步骤1)

%找到环境温度数据索引idx_data =找到([battery_data (1: num_lines) .T] = = 25);assignin (“基地”,“t_data”battery_data (idx_data) .t);assignin (“基地”,“i_data”battery_data (idx_data)。我);assignin (“基地”,“T_data”battery_data (idx_data) .T *的(长度(t_data), 1));assignin (“基地”,“T0”battery_data (idx_data) .T);assignin (“基地”,“t”t_data (2) -t_data (1));assignin (“基地”,“v_data”battery_data (idx_data) .v);%优化电池的主要参数对话框选项卡assignin (“基地”,“ParsList”ParsListMain (1:4));InitGuess = InitGuessMain (1:4);OptPars = fminsearch (@ee_battery_lse InitGuess,optimset (“TolX”1 e - 3));OptParsMain = [OptPars (1:4) InitGuessMain (5)];%更新电池块与优化参数帕尔斯=重塑([ParsListMain;cellstr (num2str (OptParsMain ') '], 1, []);k = 1:2:长度(Pars) evalin (“基地”,(Pars {k}“=”帕尔斯{k + 1}“;”])结束%显示优化参数流([电池主要优化参数的“对话框选项卡:\ n”]);流(' \ t % 5 s = % s \ n 'Pars {:});清晰的i_datav_datat_dataT_dataTs清晰的kInitGuess
电池主要优化参数对话框选项卡:Vnom = 3.6999 R1 V1 = 0.050299啊= 2.6033 = 3.5265 AH1 = 1.4

优化电荷动力学参数(步骤2)

%只使用一个电流脉冲优化电荷动力学i_pos = battery_data(1)我。* (battery_data (1), > = 0);一个=找到(diff (i_pos) > 0, 2);b =找到(diff (battery_data(1)我));c =修复((b(找到(b < (1), 1,“最后一次”))+ (1))/ 2);assignin (“基地”,“i_data”battery_data (idx_data),我(c + 1: (2)));assignin (“基地”,“v_data”,battery_data (1) .v (c + 1: (2)));assignin (“基地”,“t_data”battery_data (idx_data) .t(1:长度(i_data)));assignin (“基地”,“T_data”battery_data (idx_data) .T *的(长度(t_data), 1));assignin (“基地”,“T0”battery_data (idx_data) .T);assignin (“基地”,“t”t_data (2) -t_data (1));%之前找到电池初始充电优化电荷动力学参数assignin (“基地”,“ParsList”,{“充电”});InitGuessCharge = OptParsMain (3);OptCharge = fminsearch (@ee_battery_lse InitGuessCharge,optimset (“TolX”1 e - 3));assignin (“基地”,“AH0”,OptCharge);%优化电池充电动力学参数assignin (“基地”,“ParsList”,(ParsListMain (2) ParsListDyn]);InitGuessDyn = [OptPars (2) InitGuessDyn];OptParsDyn = fminsearch (@ee_battery_lse InitGuessDyn,optimset (“TolX”1 e - 3));%更新电池块优化电荷动力学参数ParsListMainDyn = [ParsListMain ParsListDyn];OptParsMainDyn = [OptPars (1) OptParsDyn (1) OptPars (3:4) InitGuessMain (5) OptParsDyn (2:3)];帕尔斯=重塑([ParsListMainDyn;cellstr (num2str (OptParsMainDyn ') '], 1, []);k = 1:2:长度(Pars) evalin (“基地”,(Pars {k}“=”帕尔斯{k + 1}“;”])结束assignin (“基地”,“AH0”,啊* battery_data (idx_data) .SOC0);%显示优化参数流([电池的优化参数,“包括电荷动力学:\ n”]);流(' \ t % 5 s = % s \ n 'Pars {:});清晰的i_datav_datat_dataT_dataTs清晰的i_pos一个bc清晰的k清晰的OptParsOptParsDynParsListMainDynInitGuessMainInitGuessDynParsListDynParsListMain
为电池优化参数,包括电荷动力学,包括:Vnom = 3.699931 R1 V1 = 0.05019736啊= 2.603326 = 3.526493 AH1 = 1.4一国tau1 = 109.691 = 0.005029392

优化温度相关参数(步骤3)

idx_data =找到([battery_data (1: num_lines) .T] ~ = 25);assignin (“基地”,“t_data”battery_data (idx_data) .t);assignin (“基地”,“i_data”battery_data (idx_data)。我);assignin (“基地”,“T_data”battery_data (idx_data) .T *的(长度(t_data), 1));assignin (“基地”,“T0”battery_data (idx_data) .T);assignin (“基地”,“t”t_data (2) -t_data (1)) assignin (“基地”,“v_data”battery_data (2) .v);%使用初始参数为T1, T2参数InitGuessTemp = [OptParsMainDyn (1:2) OptParsMainDyn (4) OptParsMainDyn(者);帕尔斯=重塑([ParsListTemp;cellstr (num2str (InitGuessTemp ') '], 1, []);k = 1:2:长度(Pars) evalin (“基地”,(Pars {k}“=”帕尔斯{k + 1}“;”])结束%优化电池温度相关参数assignin (“基地”,“ParsList”ParsListTemp (1:3));OptParsTemp = fminsearch (@ee_battery_lse InitGuessTemp (1:3),optimset (“TolX”1 e - 3));%更新电池块与优化参数帕尔斯=重塑([ParsListTemp (1:3);cellstr (num2str (OptParsTemp ') '], 1, []);k = 1:2:长度(Pars) evalin (“基地”,(Pars {k}“=”帕尔斯{k + 1}“;”])结束assignin (“基地”,“AH0”,啊* battery_data (idx_data) .SOC0);%显示优化参数流([优化电池的温度依赖参数的“是:\ n”]);流(' \ t % 5 s = % s \ n 'Pars {:});清晰的i_datav_datat_dataT_dataTs清晰的k清晰的OptParsMainDyn
优化电池的温度依赖的参数有:Vnom_T2 = 3.9003 R1_T2 V1_T2 = 3.8133 = 0.081404

第二温度优化电荷动力学参数(步骤4)

%寻找non-room温度指数数据%只使用一个电流脉冲优化电荷动力学i_pos = battery_data (idx_data)。我。* (battery_data (idx_data), > = 0);一个=找到(diff (i_pos) > 0, 2);b =找到(diff (battery_data (idx_data)。我));c =修复((b(找到(b < (1), 1,“最后一次”))+ (1))/ 2);assignin (“基地”,“i_data”battery_data (idx_data),我(c + 1: (2)));assignin (“基地”,“v_data”battery_data (idx_data) .v (c + 1: (2)));assignin (“基地”,“t_data”battery_data (idx_data) .t(1:长度(i_data)));assignin (“基地”,“T_data”battery_data (idx_data) .T *的(长度(t_data), 1));assignin (“基地”,“T0”battery_data (idx_data) .T);assignin (“基地”,“t”t_data (2) -t_data (1))%之前找到电池初始充电优化电荷动力学参数assignin (“基地”,“ParsList”,{“充电”});InitGuessCharge = OptParsMain (3);OptCharge = fminsearch (@ee_battery_lse InitGuessCharge,optimset (“TolX”1 e - 3));assignin (“基地”,“AH0”,OptCharge);%优化电池充电动力学参数assignin (“基地”,“ParsList”,(ParsListTemp (2) ParsListTemp (4:5)]);InitGuessTempDyn = [OptParsTemp (2) InitGuessTemp (4:5)];OptParsTempDyn = fminsearch (@ee_battery_lse InitGuessTempDyn,optimset (“TolX”1 e - 3));%更新电池块与优化参数OptParsTempDyn = [OptParsTemp (1) OptParsTempDyn (1) OptParsTemp (3) OptParsTempDyn (2:3)];帕尔斯=重塑([ParsListTemp;cellstr (num2str (OptParsTempDyn ') '], 1, []);k = 1:2:长度(Pars) evalin (“基地”,(Pars {k}“=”帕尔斯{k + 1}“;”])结束assignin (“基地”,“AH0”,啊* battery_data (idx_data) .SOC0);%显示优化参数流([优化电池的温度依赖参数,“包括电荷动力学:\ n”]);流(' \ t % 5 s = % s \ n 'Pars {:});清晰的i_datav_datat_dataT_dataTs清晰的i_pos一个bc清晰的k清晰的OptChargeOptParsMainOptParsTempOptParsTempDyn清晰的帕尔斯ParsListParsListTempInitGuessChargeInitGuessTempInitGuessTempDyn
优化电池的温度依赖参数,包括电荷动力学,包括:Vnom_T2 = 3.900266 R1_T2 = 0.07979468 V1_T2 = 3.813256 Rp1_T2 tau1_T2 = 160.2999 = 0.007920818

显示优化的曲线

idx_data = 1: num_lines assignin (“基地”,“t_data”battery_data (idx_data) .t);assignin (“基地”,“i_data”battery_data (idx_data)。我);assignin (“基地”,“T_data”battery_data (idx_data) .T *的(长度(t_data), 1));assignin (“基地”,“T0”battery_data (idx_data) .T);assignin (“基地”,“t”t_data (2) -t_data (1));= sim(模型);v_model {idx_data} = out.Vo.signals.values;t_model {idx_data} = out.Vo.time;结束情节([battery_data (1: num_lines)。t]/3600, [battery_data(1:num_lines).v],“o”,(t_model {}): / 3600, [v_model{}):)包含(的时间(小时));ylabel (“电池电压(V)”);传奇([legend_info_data legend_info_model),“位置”,“最佳”);标题(“模型与优化参数值”);

使用动态电流周期验证

idx_data = 3;assignin (“基地”,“t_data”battery_data (idx_data) .t);assignin (“基地”,“i_data”battery_data (idx_data)。我);assignin (“基地”,“T_data”battery_data (idx_data) .T);assignin (“基地”,“T0”battery_data (idx_data) .T (1));assignin (“基地”,“t”t_data (2) -t_data (1));assignin (“基地”,“AH0”,啊* battery_data (idx_data) .SOC0) = sim(模型);次要情节(1,1)情节(t_data, battery_data .v (3),“o”,out.Vo。t我me, out.Vo.signals.values) xlabel(“时间(s)”);ylabel (“电池电压(V)”);传奇(“数据”,“模型”,“位置”,“最佳”);次要情节(1、2)情节(t_data i_data)包含(“时间(s)”);ylabel (“当前的需求(A)”);次要情节(3、1,3)情节(t_data, t_data)包含(“时间(s)”);ylabel (“温度(^ oC)”);标题(模型验证的);

bdclose(模型)清晰num_lineslegend_info_datalegend_info_modelv_modelt_model清晰的battery_dataidx_dataTs模型