主要内容

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

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

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

打开模型,获取实验数据

这个例子估计了一个简单摩擦系统的参数,sdoFriction.模型的输入是施加在物体上的力,模型的输出是物体的位置和速度。

open_system (“sdoFriction”);

该模型基于物体在表面上的滑动。质量受到静摩擦的影响,在质量移动之前必须克服静摩擦,一旦质量移动,就必须克服动摩擦。静摩擦,u_static,为质量法向力的一个分数;类似地,动态摩擦,u_dynamic,是质量法向力的一个分数。

加载实验数据。物体受到施加的力,并记录其位置。

负载sdoFriction_ExperimentData

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

绘制实验数据

subplot(211), plot(AppliedForce(:,1),AppliedForce(:,2))简单摩擦系统的测量施加力输入);ylabel (“施加力(N)”) subplot(212) plot(Position(:,1),Position(:,2))简单摩擦系统的测量质量位置);包含(的时间(秒)) ylabel (“位置(m)”

定义估计实验

创建实验对象,指定实验数据。

Exp = sdo。经验值eriment(“sdoFriction”);

将输入数据(施加的力)指定为时间序列对象。

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

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

PositionSig = 万博1manbetxSimulink.SimulationData.Signal;PositionSig。Name =“位置”;PositionSig。BlockPath =“sdoFriction / x”;PositionSig。PortType =“输出港”;PositionSig。PortIndex = 1;PositionSig。Values =时间序列(Position(:,2),Position(:,1));

将测得的质量位置数据加入实验,作为预期输出数据。

Exp.OutputData = PositionSig;

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

利用实验创建模拟场景,并获得模拟输出。

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

在记录的模拟数据中搜索位置信号。

SimLog = find(模拟器。LoggedData get_param (“sdoFriction”“SignalLoggingName”));位置= find(SimLog,“位置”);

绘制实测数据和模拟数据。

正如预期的那样,模型响应与实验输出数据不匹配。

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

指定要估计的参数

估计u_static而且u_dynamic摩擦系数采用实验数据。这些系数被用作增益静态摩擦而且动态摩擦块,分别。物理学表明,摩擦系数应该受到限制,以便u_static\组的美元u_dynamic;该参数约束在估计目标函数中实现。

选择u_static而且u_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功能:

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

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

  • 返回模拟输出和实验输出之间的平方和误差误差,并返回参数约束。

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,Simulator,Exp) % sdoFriction_Objective % % sdoFriction_Objective用于将模型%输出与实验数据进行比较,并衡量约束%满足的程度。% % vals = sdoFriction_Objective(p,Exp) % % |p|输入参数是估计模型参数值的向量。|模拟器|输入参数是一个模拟对象,用于用估计的参数值模拟模型。|Exp|输入参数包含估计实验数据。|val的|返回参数包含有关%模型模拟结果与实验数据匹配程度以及%约束满足程度的信息。|vals|参数由% |sdo使用。优化|函数估计模型参数。% %参见sdo。版权所有:The MathWorks, Inc.定义一个信号跟踪需求,以计算模型输出%与实验数据匹配的程度。配置跟踪需求,使%返回求和平方和错误。 % 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返回模拟数据和实验数据之间的和平方和误差,并包含参数约束。默认的“fmincon”求解器是这种类型的问题的理想选择。

估计参数。

pOpt = sdo.optimize(estFcn,p)
优化26 - 11月- 2022年开始11:41:29 max一阶Iter F-count f (x)约束步长最优0 5 27.7267 0 1 11 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.00527178 0 0.0295 0.271 0.00405706 7 44 0 0.02 0.177 8 49 0.00111788 0 0.109 0.176 9 66 0.00106789 0 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 Free: 1 Scale: 0.5000信息:[1x1 struct] pOpt(2,1) =名称:'u_dynamic'值:0.3978最小值:0最大值:1 Free: 1 Scale: 0.2500信息:[1x1 struct] 2x1参数。连续

比较实测输出和最终模拟输出

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

Exp = setEstimatedValues(Exp,pOpt);

得到实验的模拟输出。

模拟器= createsemulator (Exp,模拟器);模拟器= sim(模拟器);SimLog = find(模拟器。LoggedData get_param (“sdoFriction”“SignalLoggingName”));位置= find(SimLog,“位置”);

绘制实测数据和模拟数据。

可以看出,使用估计参数值的模型响应与实验输出数据吻合得很好。

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

更新模型参数值

更新模型u_static而且u_dynamic参数值。

sdo.setValueInModel (“sdoFriction”, pOpt);

关闭模型。

bdclose (“sdoFriction”