每个实验的估算模型参数(代码)

此示例显示如何使用多个实验来估计模型参数值的组合;一些是使用所有实验估计的,另一些是使用单个实验估计的。此示例还显示如何使用依赖于实验的参数值配置估计实验。

您基于在放电和充电的实验中收集的数据来估计可充电电池的参数。

打开模型并获得实验数据

该示例估计简单可充电电池模型的参数,sdobattery..模型输入为蓄电池电流,模型输出为蓄电池端子电压,由蓄电池充电状态计算得出。

开放式系统(“斯多巴特里”);

该模型基于该方程

E. = 1 - 损失 V. - K. 问: 最大值 1 - S. S.

在方程式中:

E. 是蓄电池端子电压,单位为伏特。

V. 电池恒定电压是否在伏特中。

K. 是电池偏振电阻在欧姆中。

问: 最大值 是以安培小时为单位的最大电池容量。

S. 是蓄电池充电状态,1充满电,0放电。蓄电池充电状态由蓄电池电流的积分计算得出,正极电流表示放电,负极电流表示充电。蓄电池初始充电状态由 问: 0. 以安培小时为单位。

损失 充电时电压降是否表示为电池恒压的一部分。当电池放电时,该值为零。

V.K.最大尿流率Q0,及损失是模型工作区中定义的变量。

加载实验数据。对1.2V(6500mAh)蓄电池进行放电实验和充电实验。

负载sdobattery_experimentdata.

变量chartion_data.数据充电已加载到工作区中。第一列chartion_data.包含时间数据。第二列和第三列chartion_data.描述蓄电池充电试验期间的电流和电压。数据充电类似地结构化并包含电池放电实验的数据。

绘制实验数据

子地块(221),地块(收费数据(:,1)/3600,收费数据(:,2))标题('实验:放电')xlabel(‘时间(小时)’)伊拉贝尔("现时(甲)")子地块(223)图(电荷数据(:,1)/3600,电荷数据(:,3))xlabel(‘时间(小时)’)伊拉贝尔(‘电压(V)’)子地块(222),地块(收费数据(:,1)/3600,收费数据(:,2))标题('实验:充电')xlabel(‘时间(小时)’)伊拉贝尔("现时(甲)")子图(224)绘图(chartion_data(:,1)/ 3600,chartion_data(:,3))xlabel(‘时间(小时)’)伊拉贝尔(‘电压(V)’

定义估计实验

创建实验对象的2元素数组,以指定两个实验的测量数据。

为电池放电实验创建一个实验对象。测量的电流数据在实验对象中指定为时间序列。

DCharge_Exp=sdo.实验(“斯多巴特里”);

将输入数据(当前)指定为timeseries对象。

dcharge_exp.inputdata = timeeries(dcharge_data(:,2),dcharge_data(:,1));

创建一个对象以指定测量的电压输出数据。

VoltageSig=Si万博1manbetxmulink.SimulationData.Signal;电压信号名称=“电压”;电压.BlockPath =.‘sdoBattery/SOC->电压’;电压信号端口类型='外港';电压.PortIndex = 1;电压.Values = timeeries(dcharge_data(:,3),dcharge_data(:,1));

将电压信号作为预期输出数据添加到放电实验中。

DCharge_Exp.OutputData=电压信号;

指定实验的电池初始充电状态。电池充电状态由q(啊)块,它的初始值由变量指定Q0.创建一个参数Q0变量,并将参数添加到实验中。Q0取决于实验,在放电和充电实验中假设不同的值。

q0 = sdo.getparameterfrommodel(“斯多巴特里”'Q0');Q0.Value = 6.5;q0.free = false;

Q0.Free.设置为假的因为初始电池电量是已知的,不需要估计。

添加Q0参数到实验。

DCharge_Exp.Parameters=Q0;

创建一个实验对象来存储充电实验数据。将测量的电流输入和测量的电压输出数据添加到该对象。

charmet_exp = sdo.experiment(“斯多巴特里”)电荷输入数据=时间序列(电荷数据(:,2),电荷数据(:,1));电压信号值=时间序列(电荷数据(:,3),电荷数据(:,1));电荷输出数据=电压信号;

将电池初始充电和充电损耗分数参数添加到实验中。对于这个实验,初始电荷(Q0)已知(0 AH),但充电损耗分数的值(损失)不知道。

Q0.Value=0;Loss=sdo.getParameterFromModel(“斯多巴特里”“损失”);丢失.Free = True;丢失..minimum = 0;损失..Maximum = 0.5;charge_exp.parameters = [q0;损失];

免费设置为true,以便损失估计。

将两种实验收集到一个矢量中。

Exp=[DCharge\u Exp;Charge\u Exp];

比较测量输出和初始模拟输出

使用第一个(放电)实验创建模拟场景,并获得模拟输出。

Simulator = CreateSimulator(Exp(1));Simulator = SIM(模拟器);

在记录的仿真数据中搜索电压信号。

simlog = find(simulator.loggeddata,get_param(“斯多巴特里”“SignalLoggingName”));电压(1)=查找(SIMLOG,“电压”);

获得第二次(充电)实验的模拟电压信号。

Simulator=createSimulator(Exp(2),Simulator);Simulator=sim(Simulator);SimLog=find(Simulator.LoggedData,get_param(“斯多巴特里”“SignalLoggingName”));电压(2)=查找(SimLog,“电压”);

绘制测量和模拟数据。模型响应与实验输出数据不匹配。

子地块(211)地块(......电压(1).值.时间/3600,电压(1).值.数据,......exp(1).outputdata.values.time / 3600,exp(1).outputdata.values.data,'-.')头衔(“放电实验:估算前的模拟和测量响应”)伊拉贝尔(‘电压(V)’) 传奇(“模拟电压”'测量电压'“位置”“西南”

子地块(212)地块(......电压(2).Values.Time / 3600,电压(2).values.data,......Exp(2).OutputData.Values.Time/3600,Exp(2).OutputData.Values.Data,'-.')头衔(“充电实验:估算前的模拟和测量响应”)xlabel(‘时间(小时)’)伊拉贝尔(‘电压(V)’) 传奇(“模拟电压”'测量电压'“位置”‘东南’

指定要估计的参数

估计蓄电池电压值V.,电池极化电阻K.,以及充电损耗分数损失这个V.K.使用所有实验数据估计参数损失仅使用充电数据估计参数。

选择电池电压V.以及电池的极化电阻K.模型中的参数。指定这些参数的最小和最大界限。

p = sdo.getparameterfrommodel(“斯多巴特里”,{“V”“K”});p(1).minimum = 0;p(1).maximum = 2;p(2).minimum = 1e-6;p(2).maximum = 1e-1;

让实验具体化损失实验得到的参数。

s = getvaluestoestimate(exp);

组估计所有参数。

v = [p; s]
v(1,1)=名称:“v”值:1.2000最小值:0最大值:2自由值:1比例:2信息:[1x1结构]v(2,1)=名称:“K”值:1.0000e-03最小值:1.0000e-06最大值:0.1000自由值:1比例:0.0020信息:[1x1结构]v(3,1)=名称:“损失”值:0.0100最小值:0最大值:0.5000自由值:1比例:0.0156信息:[1x1结构]3x1

确定评估目标

创建估算目标函数,以评估使用估算参数值生成的模拟输出与测量数据的匹配程度。

使用带有一个输入参数的匿名函数调用sdobattery_objective我们将匿名函数传递给优化,它在每次优化迭代时计算函数。

estfcn = @(v)sdobattery_objective(v,模拟器,exp);

sdobattery_objective功能:

  • 有一个输入参数,指定估计的电池参数值。

  • 有一个输入参数,指定包含测量数据的实验对象。

  • 返回模拟和实验输出之间的误差向量。

sdobattery_objective函数需要两个输入,但优化需要具有一个输入参数的函数。为了解决这个问题,estFcn是具有一个输入参数的匿名函数,V.,但它呼叫sdobattery_objective使用两个输入参数,V.费用

有关匿名函数的更多信息,请参阅匿名功能

优化命令最小化匿名函数的返回参数estFcn,即返回的剩余错误sdobattery_objective。有关如何编写用于的目标/约束函数的更多详细信息优化命令,类型帮助sdoExampleCostFunction在MATLAB®命令提示符下。

要更详细地检查估计目标函数,请键入编辑sdoBattery_目标在MATLAB命令提示符下。

类型sdobattery_objective
函数VAL=sdoBattery_目标(v,模拟器,Exp)%sdoBattery_目标%%sdoBattery_目标函数用于将模型%输出与实验数据进行比较。%%VAL=sdoBattery_目标(v,Exp)%%v |输入参数是估计模型参数值%和初始状态的向量。%%模拟器|输入参数是使用%模拟模型的估计参数值的模拟对象。%%Exp |输入参数包含估计实验数据。%%VAL |返回参数包含有关ho的信息w以及%模型模拟结果与实验数据匹配,并被%的| sdo.optimize |函数用于估计模型参数。%%另请参见sdo.optimize、sdoExampleCostFunction、sdoBattery_cmddemo%%版权所有2012-2015 MathWorks,Inc.%%定义信号跟踪要求,以计算模型输出%与实验数据。配置跟踪要求,以便%返回跟踪误差残差(而不是%平方和误差)并且不规范化错误。%r=sdo.requirements.SignalTracking;r.Type='='=';r.Method='残差';r.normalize='关闭';%%%使用估计的参数值更新实验。%Exp=SetEstimatedValue(Exp,v);%%%模拟模型并将模型输出与测量的实验%数据进行比较。%Error=[];对于ct=1:numel(Exp)Simulator=createSimulator(Exp(ct),Simulator);Simulator=sim(Simulator);SimLog=find(Simulator.LoggedData,get_param('sdoBattery','SignalLoggingName');Voltage=find(SimLog,'Voltage');voltagererror=evalRequirement(r,Voltage.Values,Exp(ct).OutputData(1.Values);Error=[错误;voltagererror,'voltagerer:];end%%%将剩余错误返回到优化解算器。%vals.F=错误(:);end

估计参数

使用优化估计电池参数值的功能。

指定优化选项。估计功能sdobattery_objective返回模拟和实验数据之间的错误残差,并且不包括任何约束,使得“LSQNONLIN”求解器成为此问题。

opt=sdo.options;opt.Method=“lsqnonlin”;

估计参数。

VOPT = SDO.Optimize(ESTFCN,V,OPT)
优化开始于25-8月25日-2020 01:10:02一阶ITER F-COUNT F(x)梯级最优值0 7 3272.22 11 1 14 619.356 0.1634 3.15E + 05 2 21 411.131 0.2175 21.7 3 28 405.529 0.3838 2.16E 0.3838 2.16E+03 4 35 403.727 0.2767 15.2 5 42 403.379 0.1645 1.14E + 03当地最低。LSQNONLIN停止,因为相对于其初始值的平方和的最终变化小于功能公差的值。VOPT(1,1)=名称:'v'值:1.3083最小值:0最多:2免费:1刻度:2信息:[1x1结构] VOPT(2,1)=名称:'k'值:0.0010最小值:0.00101.0000E-06最大值:0.1000免费:1刻度:0.0020信息:[1x1结构] Vopt(3,1)=名称:'丢失'值:5.1801E-05最小值:0最大值:0.05000免费:1比例:0.0156信息:[1x1 struct] 3x1 param.continuous

比较测量的输出和最终模拟输出

使用估计的参数值更新实验。

Exp=设置的估计值(Exp,vOpt);

获得第一次(放电)实验的模拟输出。

Simulator = CreateSimulator(Exp(1),模拟器);Simulator = SIM(模拟器);simlog = find(simulator.loggeddata,get_param(“斯多巴特里”“SignalLoggingName”));电压(1)=查找(SIMLOG,“电压”);

获得第二次(充电)实验的模拟输出。

Simulator=createSimulator(Exp(2),Simulator);Simulator=sim(Simulator);SimLog=find(Simulator.LoggedData,get_param(“斯多巴特里”“SignalLoggingName”));电压(2)=查找(SimLog,“电压”);

绘制测量和模拟数据。除了电池充满电的区域外,模拟结果与实验数据吻合得很好。这并不意外,因为简单电池模型无法模拟电池充满电时的指数电压降。

子地块(211)地块(......电压(1).值.时间/3600,电压(1).值.数据,......exp(1).outputdata.values.time / 3600,exp(1).outputdata.values.data,'-.')头衔(“放电实验:估算后的模拟和测量响应”)伊拉贝尔(‘电压(V)’) 传奇(“模拟电压”'测量电压'“位置”“西南”)子图(212)绘图(......电压(2).Values.Time / 3600,电压(2).values.data,......Exp(2).OutputData.Values.Time/3600,Exp(2).OutputData.Values.Data,'-.')头衔(“充电实验:估算后的模拟和测量响应”)xlabel(‘时间(小时)’)伊拉贝尔(‘电压(V)’) 传奇(“模拟电压”'测量电压'“位置”‘东南’

更新模型参数值

更新模型V.K.,及损失参数值。

sdo.setValueInModel(“斯多巴特里”,Vopt);

相关例子

学习如何使用的是估计电池参数参数估计, 看估计模型参数每实验(GUI)

关闭模型

bdclose(“斯多巴特里”