此示例显示如何使用多个实验来估计模型参数值的组合;一些是使用所有实验估计的,另一些是使用单个实验估计的。此示例还显示如何使用依赖于实验的参数值配置估计实验。
您基于在放电和充电的实验中收集的数据来估计可充电电池的参数。
该示例估计简单可充电电池模型的参数,sdobattery.
.模型输入为蓄电池电流,模型输出为蓄电池端子电压,由蓄电池充电状态计算得出。
开放式系统(“斯多巴特里”);
该模型基于该方程
在方程式中:
是蓄电池端子电压,单位为伏特。
电池恒定电压是否在伏特中。
是电池偏振电阻在欧姆中。
是以安培小时为单位的最大电池容量。
是蓄电池充电状态,1充满电,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(“斯多巴特里”)