主要内容

估计模型参数与参数约束(代码)

这个例子展示了如何估计模型参数,同时施加约束参数值。

你估计一个简单的摩擦系统的动态和静态摩擦系数。

打开模型,得到实验数据

一个简单的摩擦系统,这个例子估计参数sdoFriction。模型的输入是力应用于质量和模型输出质量的位置和速度。

open_system (“sdoFriction”);

模型是基于大量滑动表面。质量的静态摩擦之前,必须克服大规模移动和动态摩擦一旦大规模举措。静态摩擦,u_static大规模的法向力的一小部分;同样的动态摩擦,u_dynamic大规模的法向力的一小部分。

加载实验数据。质量受到一个作用力及其位置记录。

负载sdoFriction_ExperimentData

的变量AppliedForce,位置,速度被加载到工作区。每一个变量的第一列代表时间,第二列表示测量数据。因为速度的一阶导数的位置,只使用这个示例的位置测量。

画出实验数据

次要情节(211),情节(AppliedForce (: 1), AppliedForce(:, 2)标题(“简单的摩擦系统的作用力测量输入”);ylabel (“应用力(N)”)次要情节(212)情节(位置(:1),(2):,)标题(“简单的摩擦系统测量质量的位置”);包含(的时间(秒))ylabel (“位置(m)”)

定义评估实验

创建一个实验对象指定实验数据。

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

指定输入数据(作用力)作为timeseries对象。

Exp.InputData = timeseries (AppliedForce (:, 2), AppliedForce (: 1));

创建一个对象指定测量质量位置输出。

PositionSig = 金宝appSimulink.SimulationData.Signal;PositionSig。Name =“位置”;PositionSig。BlockPath =“sdoFriction / x”;PositionSig。PortType =“输出港”;PositionSig。PortIndex = 1;PositionSig。值= timeseries(位置(:,2)、位置(:1));

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

Exp.OutputData = PositionSig;

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

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

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

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

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

图测量和模拟数据。

正如所料,该模型响应不匹配实验输出数据。

图绘制(Position.Values.Time Position.Values.Data,Exp.OutputData.Values。时间、Exp.OutputData.Values.Data“-”。)标题(模拟和测量反应之前估计的)ylabel (“位置(m)”)包含(的时间(秒))传说(“模拟位置”,测量位置的,“位置”,“西北”)

指定的参数估计

估计u_staticu_dynamic摩擦系数使用实验数据。这些系数作为收益静态摩擦动态摩擦块,分别。物理学表明,摩擦系数应该这样的约束u_static\组的美元u_dynamic;这个参数约束估计目标函数的实现。

选择u_staticu_dynamic模型参数。指定范围的估计参数值。两个系数范围仅限于[0 1]。

p = sdo.getParameterFromModel (“sdoFriction”,{“u_static”,“u_dynamic”});(1页)。最小值= 0;(1页)。最大= 1;(2页)。最小值= 0;(2页)。最大= 1;

定义评估目的

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

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

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

sdoFriction_Objective功能:

  • 有一个输入参数,用于指定估计摩擦系数。

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

  • 返回sum-squared-error模拟和实验输出之间的误差,并返回参数约束。

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

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

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

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

类型sdoFriction_Objective
函数vals = sdoFriction_Objective (p,模拟器,Exp) % sdoFriction_Objective % % % sdoFriction_Objective函数是用来比较模型输出与实验数据和测量约束是如何%满意。% % vals = sdoFriction_Objective (p, Exp) % % | |页输入参数是一个矢量估计模型的参数值。% % | |模拟器的输入参数是一个模拟对象使用%模拟模型估计参数值。% % | Exp |输入参数包含评估实验数据。% % | vals |返回参数包含有关如何%模型仿真结果与实验数据以及%约束得到满足。瓦尔斯的| | % |使用sdo的论点。优化|函数来估计模型参数。% %也看到sdo。优化、sdoExampleCostFunction sdoFriction_cmddemo % % 2012 - 2015版权MathWorks, Inc . % % %定义一个信号跟踪要求计算,模型输出%匹配实验数据。配置这%它返回sum-squared-error跟踪要求。 % r = sdo.requirements.SignalTracking; r.Type = '=='; r.Method = 'SSE'; %% % Update the experiments with the estimated parameter values. % Exp = setEstimatedValues(Exp,p); %% % Simulate the model and compare model outputs with measured experiment % data. % Simulator = createSimulator(Exp,Simulator); Simulator = sim(Simulator); SimLog = find(Simulator.LoggedData,get_param('sdoFriction','SignalLoggingName')); Position = find(SimLog,'Position'); PositionError = evalRequirement(r,Position.Values,Exp.OutputData(1).Values); %% % Measure how well the parameters satisfy the friction coefficient constraint, % |u_static| >= |u_dynamic|. Note that constraints are returned to the % optimizer in a c <=0 format. The friction coefficient constraint is % rewritten accordingly. PConstr = p(2).Value - p(1).Value; % u_dynamic - u_static <= 0 %% % Return the sum-squared-error and constraint violation to the optimization % solver. % vals.F = PositionError(:); vals.Cleq = PConstr; end

摩擦系数约束,u_static\组的美元u_dynamic中实现sdoFriction_Objective函数作为u_dynamic- - - - - -u_static\ leq美元0。这是因为优化器需要约束值c \ leq 0美元格式。有关更多信息,类型帮助sdo.optimize在MATLAB命令提示符。

估计的参数

使用sdo.optimize函数估计摩擦模型参数值。

指定优化选项。估计函数sdoFriction_Objective返回sum-squared-error模拟和实验数据,包括一个参数之间的约束。默认的“fmincon”解算器是理想的这种类型的问题。

估计的参数。

pOpt = sdo.optimize (estFcn, p)
优化开始2023 - 3月- 03,09:07:28 max一阶Iter F-count f (x)约束11步长最优0 5 27.7267 0 1 22.5643 0.51 17.4771 2.21 72.9 - 2 15 0 16 3 22 0.76336 0 1.33 10.7 - 4 29 0.408381 0 0.263 3.15 - 5 34 0.0255292 0 0.0897 1.22 6 39 0.177 0.02 0.00527178 0.00405706 0.0295 0.271 7 44 0 8 49 0.00111788 0 0.109 0.176 9 66 0.00106789 0.00359 - 0.174 85 0.00105317 0.00105317 0.002 0.174 11 100 0 0.00158 - 0.174局部最小值。约束满足。fmincon停止因为当前步骤的大小小于一步尺寸公差的值和约束满足约束的值公差内。pOpt(1, - 1) =名字:“u_static”值:0.8198最低:0最大:1自由:1比例:0.5000信息:[1 x1 struct] pOpt(2, 1) =名字:“u_dynamic”值:0.3978最低:0最大:1自由:1比例:0.2500信息:[1 x1 struct] 2 x1 param.Continuous

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

更新实验估计参数值。

经验= setEstimatedValues (Exp、pOpt);

获得实验的模拟输出。

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

图测量和模拟数据。

可以看出,该模型响应使用估计的参数值很好地匹配实验输出数据。

图(Position.Values.Time Position.Values.Data,Exp.OutputData.Values。时间、Exp.OutputData.Values.Data“-”。)标题(模拟和测量后反应模型参数估计的)ylabel (“位置(m)”)包含(的时间(秒))传说(“模拟位置”,测量位置的,“位置”,“西北”)

更新模型参数值

更新模型u_staticu_dynamic参数值。

sdo.setValueInModel (“sdoFriction”,pOpt);

关闭模式。

bdclose (“sdoFriction”)