主要内容

模型参数估计使用多个实验(代码)

这个例子展示了如何从多组试验数据估计模型参数。你估计的参数系统质-弹。

打开模型,得到实验数据

下面的例子使用了sdoMassSpringDamper模型。模型包括两个集成商模型质量的速度和位置系统质-弹。

open_system (“sdoMassSpringDamper”);

加载实验数据。

负载sdoMassSpringDamper_ExperimentData

的变量texp1,yexp1,texp2,yexp2被加载到工作区。yexp1yexp2描述质量位置乘以texp1texp2,分别。

定义评估实验

创建一个2-element实验对象的数组来存储两个实验的测量数据。

创建一个实验对象的实验。

经验= sdo.Experiment (“sdoMassSpringDamper”);

创建一个对象来存储测量质量位置输出。

MeasuredPos = 万博1manbetxSimulink.SimulationData.Signal;MeasuredPos。值= timeseries (yexp1 texp1);MeasuredPos。BlockPath =“sdoMassSpringDamper /位置”;MeasuredPos。PortType =“输出港”;MeasuredPos。PortIndex = 1;MeasuredPos。Name =“位置”;

测量质量的位置数据添加到实验预期的输出数据。

Exp.OutputData = MeasuredPos;

创建一个对象指定的初始状态速度块。质量的初始速度是0 m / s。

声波速度= sdo.getStateFromModel (“sdoMassSpringDamper”,“速度”);声波速度。值= 0;sVel.Free= false;

sVel.Free被设置为因为初速度是已知的和不需要估计。

创建一个对象指定的初始状态位置块。指定初始质量猜测的位置。设置免费的初始位置对象的字段真正的据估计。

检测= sdo.getStateFromModel (“sdoMassSpringDamper”,“位置”);进行比较。免费的= true; sPos.Value = -0.1;

初始状态添加到实验。

Exp.InitialStates =(声波速度;检测);

双元素数组创建一个实验。这两个实验是相同的除了预期的输出数据,复制第一个实验两次。

经验=[经验;Exp];

第二个实验对象的修改所需要的输出数据经验值

Exp (2) .OutputData。值= timeseries (yexp2 texp2);

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

创建一个模拟场景中使用第一个实验,获得模拟输出。

模拟器= createSimulator (Exp (1));模拟器= sim(模拟器);

搜索记录的位置信号仿真数据。

SimLog =找到(Simulator.LoggedData get_param (“sdoMassSpringDamper”,“SignalLoggingName”));位置=找到(SimLog,“位置”);

获得第二个实验模拟位置信号。

模拟器= createSimulator (Exp(2),模拟器);模拟器= sim(模拟器);SimLog =找到(Simulator.LoggedData get_param (“sdoMassSpringDamper”,“SignalLoggingName”));位置(2)=找到(SimLog,“位置”);

图测量和模拟数据。

模型响应不匹配实验输出数据。

次要情节(211)图((1).Values.Time位置,位置(1).Values.Data,实验(1).OutputData.Values。时间、Exp (1) .OutputData.Values.Data“——”)标题(实验1:模拟和测量反应之前估计的)ylabel (“位置”)传说(“模拟位置”,测量位置的,“位置”,“东南”情节)次要情节(212)((2).Values.Time位置,(2).Values.Data位置,Exp (2) .OutputData.Values。时间、Exp (2) .OutputData.Values.Data“——”)标题(“实验2:模拟和测量响应之前估计的)包含(的时间(秒))ylabel (“位置”)传说(“模拟位置”,测量位置的,“位置”,“东南”)

指定的参数估计

选择质量,弹簧常数k和阻尼系数b从模型参数。指定这些参数估计的值必须是积极的。

p = sdo.getParameterFromModel (“sdoMassSpringDamper”,{“b”,“k”,“米”});(1页)。最小值= 0;(2页)。最小值= 0;(3页)。最小值= 0;

得到初始状态值的位置估计的实验。

s = getValuesToEstimate (Exp);

年代包含两个初始状态对象,对位置块。每个对象对应于一项实验经验值

组模型参数和初始状态估计在一起。

v = (p, s)
v(1, - 1) =名字:b值:100最低:0最大:正自由:1规模:128信息:[1 x1 struct] v(2, 1) =名字:“k”值:500最低:0最大:正自由:1规模:512信息:[1 x1 struct] v(3,1) =名字:“m”值:8最低:0最大:正自由:1:8信息:[1 x1 struct] v(4,1) =名字:sdoMassSpringDamper /位置的值:-0.1000最低:负最大:正自由:1比例:0.1250 dxValue: 0 dxFree: 1信息:[1 x1 struct] v(5、1) =名字:sdoMassSpringDamper /位置的值:-0.1000最低:负最大:正自由:1比例:0.1250 dxValue: 0 dxFree: 1信息:[1 x1 struct] 5 x1 param.Continuous

定义评估目的

创建一个估计目标函数来评估仿真输出,使用估计的参数值,生成匹配的测量数据。

使用一个匿名函数调用的一个输入参数sdoMassSpringDamper_Objective函数。通过匿名函数sdo.optimize在每个迭代优化,评估函数。

estFcn = @ (v) sdoMassSpringDamper_Objective (v,模拟器,Exp);

sdoMassSpringDamper_Objective功能:

  • 有一个输入参数,用于指定质量,弹簧常数和阻尼值以及初始质量的位置。

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

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

sdoMassSpringDamper_Objective函数需要两个输入,但是sdo.optimize需要一个函数和一个输入参数。为了解决这一问题,estFcn是一个匿名函数输入参数,v,但它调用sdoMassSpringDamper_Objective使用两个输入参数,v经验值

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

sdo.optimize命令最小化返回参数的匿名函数estFcn,即剩余错误返回sdoMassSpringDamper_Objective。更多细节关于如何编写一个目标/约束函数使用sdo.optimize命令,键入帮助sdoExampleCostFunction在MATLAB®命令提示符。

更详细地检查估计目标函数,类型编辑sdoMassSpringDamper_Objective在MATLAB命令提示符。

类型sdoMassSpringDamper_Objective
函数vals = sdoMassSpringDamper_Objective (v,模拟器,Exp) % sdoMassSpringDamper_Objective % % % sdoMassSpringDamper_Objective函数是用来比较模型输出实验数据。% % vals = sdoMassSpringDamper_Objective v (v, Exp) % % | |输入参数是一个向量的估计模型参数值%和初始状态。% % | |模拟器的输入参数是一个模拟对象使用%模拟模型估计参数值。% % | Exp |输入参数包含评估实验数据。% % | vals |返回参数包含有关如何%模型仿真结果与实验数据和使用% | sdo。优化|函数来估计模型参数。% %也看到sdo。优化,sdoExampleCostFunction % % 2012 - 2015版权MathWorks, Inc . % % %定义一个信号跟踪要求计算,模型输出%匹配实验数据。配置跟踪要求%这样返回跟踪误差残差(而不是% sum-squared-error)和不正常的错误。% r = sdo.requirements.SignalTracking;r。Type = '=='; r.Method = 'Residuals'; r.Normalize = 'off'; %% % Update the experiments with the estimated parameter values. % Exp = setEstimatedValues(Exp,v); %% % Simulate the model and compare model outputs with measured experiment % data. % Error = []; for ct=1:numel(Exp) Simulator = createSimulator(Exp(ct),Simulator); Simulator = sim(Simulator); SimLog = find(Simulator.LoggedData,get_param('sdoMassSpringDamper','SignalLoggingName')); Position = find(SimLog,'Position'); PositionError = evalRequirement(r,Position.Values,Exp(ct).OutputData.Values); Error = [Error; PositionError(:)]; end %% % Return the residual errors to the optimization solver. % vals.F = Error(:); end

估计的参数

使用sdo.optimize函数来估计执行器参数值和初始状态。

指定优化选项。估计函数sdoMassSpringDamper_Objective返回模拟和实验数据之间的误差残差,不包括任何约束,使这个问题的理想选择lsqnonlin解算器。

选择= sdo.OptimizeOptions;opt.Method =“lsqnonlin”;

估计的参数。注意,初始质量位置估计的两倍,一旦为每个实验。

vOpt = sdo.optimize (estFcn, v,选择)
优化开始2022年- 8月31日08:16:52一阶Iter F-count f (x)步长最优0 11 0.777696 - 1 1 22 0.00413099 3.696 0.00648 2 33 44 0.0011106 0.06718 5.09 0.00118327 0.3194 0.00243 3 e-05局部最小值。优化完成因为梯度的大小小于最优值的宽容。vOpt(1, - 1) =名字:b值:58.1959最低:0最大:正自由:1规模:128信息:[1 x1 struct] vOpt(2, 1) =名字:“k”值:399.9452最低:0最大:正自由:1规模:512信息:[1 x1 struct] vOpt(3,1) =名字:“m”值:9.7225最低:0最大:正自由:1:8信息:[1 x1 struct] vOpt(4,1) =名字:sdoMassSpringDamper /位置的值:0.2995最低:负最大:正自由:1比例:0.1250 dxValue: 0 dxFree: 1信息:[1 x1 struct] vOpt(5、1) =名字:sdoMassSpringDamper /位置的值:0.0994最低:负最大:正自由:1比例:0.1250 dxValue: 0 dxFree: 1信息:[1 x1 struct] 5 x1 param.Continuous

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

更新实验估计参数值。

经验= setEstimatedValues (Exp、vOpt);

获得第一个实验的模拟输出。

模拟器= createSimulator (Exp(1)模拟器);模拟器= sim(模拟器);SimLog =找到(Simulator.LoggedData get_param (“sdoMassSpringDamper”,“SignalLoggingName”));位置(1)=找到(SimLog“位置”);

获得第二个实验的模拟输出。

模拟器= createSimulator (Exp(2),模拟器);模拟器= sim(模拟器);SimLog =找到(Simulator.LoggedData get_param (“sdoMassSpringDamper”,“SignalLoggingName”));位置(2)=找到(SimLog,“位置”);

图测量和模拟数据。

模型响应使用估计参数值匹配的输出数据实验。

次要情节(211)图((1).Values.Time位置,位置(1).Values.Data,实验(1).OutputData.Values。时间、Exp (1) .OutputData.Values.Data“——”)标题(实验1:模拟和测量反应经过评估的)ylabel (“位置”)传说(“模拟位置”,测量位置的,“位置”,“东北”情节)次要情节(212)((2).Values.Time位置,(2).Values.Data位置,Exp (2) .OutputData.Values。时间、Exp (2) .OutputData.Values.Data“——”)标题(“实验2:模拟和测量反应经过评估的)包含(的时间(秒))ylabel (“位置”)传说(“模拟位置”,测量位置的,“位置”,“东南”)

更新模型参数值

更新模型,k,b参数值。不更新模型初始位置值,因为这是依赖于实验。

sdo.setValueInModel (“sdoMassSpringDamper”vOpt (1:3));

关闭模式

bdclose (“sdoMassSpringDamper”)