设置时稳态模型估计参数(代码)
这个例子显示了如何设置一个模型的稳态参数估计的过程。设置一个稳态模型是很重要的,在许多应用程序中,如电力系统和飞机动力学。这个例子使用一个种群动态模型。
这个例子需要仿真软件®™软件控制设计。金宝app
模型描述
仿真软件金宝app模型sdoPopulationInflux
人口增长模型的一个简单的生态,有机体环境的承载能力是有限的。
是固有的生物人口的增长率。
是环境的承载能力。
还有大量的其他成员有机体的周边环境。模型使用标准化的单位。
打开模型。
modelName =“sdoPopulationInflux”;open_system (modelName)
该文件sdoPopulationInflux_Data.mat
包含数据的人口环境以及其他生物的涌入周边环境。
负载sdoPopulationInflux_Data.mat;%的时间系列:Population_ts Inflow_tshFig =图;次要情节(2,1,1);情节(Population_ts)次要情节(2,1,2);情节(Inflow_ts)
人口开始在一个稳定状态。一段时间后,有大量的生物从周边环境。基于实测数据,你可以估计模型参数的值。
的参数R
代表有机体的固有增长率。使用1作为该参数的初始猜测。非负。
R = sdo.getParameterFromModel (modelName“R”);R。值= 1;R。最小值= 0;
的参数K
代表环境的承载能力。使用2为这个参数作为初始猜测。它至少是0.1。
K = sdo.getParameterFromModel (modelName“K”);K。值= 2;K。最小值= 0.1;
收集这些参数向量。
v = (R K);
比较测量数据初步模拟输出
创建一个实验对象。
经验= sdo.Experiment (modelName);
副Population_ts
与模型输出。
人口= Simulink.金宝appSimulationData.Signal;人口。Name =“人口”;人口。BlockPath = [modelName' /集成商'];人口。PortType =“输出港”;人口。PortIndex = 1;人口。值= Population_ts;
添加人口
的实验。
Exp.OutputData =人口;
副Inflow_ts
模型的输入。
流入= Simul金宝appink.SimulationData.Signal;流入。Name =“人口”;流入。BlockPath = [modelName' / in '];流入。PortType =“输出港”;流入。PortIndex = 1;流入。值= Inflow_ts;
添加流入
的实验。
Exp.InputData =流入;
创建一个模拟场景中使用实验,获得模拟输出。
经验= setEstimatedValues (Exp, v);%使用向量的参数/状态模拟器= createSimulator (Exp);模拟器= sim(模拟器);
搜索模型模拟输出信号的记录数据。
SimLog =找到(Simulator.LoggedData,…get_param (modelName“SignalLoggingName”));PopulationSim =找到(SimLog,“人口”);
模型输出不匹配的数据很好,表明需要计算更好的估计模型参数。
clf;情节(PopulationSim.Values“r”);持有在;情节(Population_ts“b”);传奇(“仿真模型”,的测量数据,“位置”,“最佳”);
估计参数
估计参数,定义一个目标函数计算平方误差和模型模拟结果与实测资料和数据。
estFcn = @ (v) sdoPopulationInflux_Objective (v,模拟器,Exp);类型sdoPopulationInflux_Objective.m
函数vals = sdoPopulationInflux_Objective (v,模拟器,Exp OpPointSetup) % % %比较模型输出和数据输入:% v -向量的参数和/或州%模拟器,用于模拟模型% % OpPointSetup实验——实验对象——对象建立计算稳态%操作点%版权2018年MathWorks, Inc . %解析输入如果输入参数个数< 4 OpPointSetup = [];结束%要求设置点播= sdo.requirements.SignalTracking;要求的事情。类型=“= =”;要求的事情。方法=“残差”;%模拟模型实验= setEstimatedValues (Exp, v);%使用向量的参数/州模拟器= createSimulator (Exp模拟器);strOT = mat2str (Exp.OutputData (1) .Values.Time);如果isempty (OpPointSetup)模拟器= sim(模拟器,‘OutputOption’,‘AdditionalOutputTimes’,‘OutputTimes’, strOT); else Simulator = sim(Simulator, 'OutputOption', 'AdditionalOutputTimes', 'OutputTimes', strOT, ... 'OperatingPointSetup', OpPointSetup); end % Compare model output with data SimLog = find(Simulator.LoggedData, ... get_param(Exp.ModelName, 'SignalLoggingName') ); OutputModel = find(SimLog, 'Population'); Model_Error = evalRequirement(req, OutputModel.Values, Exp.OutputData.Values); vals.F = Model_Error;
%定义选项优化。%选择= sdo.OptimizeOptions;选择。方法=“lsqnonlin”;
估计的参数。
vOpt = sdo。优化(estFcn, v,选择);disp (vOpt)
2023 - 3月- 03优化开始,09:06:49一阶Iter F-count f (x)步长最优0 5 12.485 - 1 1 10 15 0.9873 1.088 0.0259 1.09824 - 1.184 0.244 - 2 3 20 25 0.946892 0.9151 0.00197 0.952948 1.217 0.00624 4 5 30 0.946484 0.3541 0.00153局部最小值。lsqnonlin停止是因为最后的平方和的变化相对于其初始值小于公差的值函数。(1,1)=名字:‘R’值:5.5942最低:0最大:正自由:1规模:1信息:[1 x1 struct](1、2) =名字:“K”值:3.2061最低:0.1000最大:正自由:1规模:2信息:[1 x1 struct] 1 x2 param.Continuous
使用估计模型中的参数值,得到模型的响应。搜索模型模拟输出信号的记录数据。
经验= setEstimatedValues (Exp、vOpt);模拟器= createSimulator (Exp、模拟器);模拟器= sim(模拟器);SimLog =找到(Simulator.LoggedData,…get_param (modelName“SignalLoggingName”));PopulationSim =找到(SimLog,“人口”);
比较测量人口数据与优化模型响应表明他们仍然不匹配。初有一个瞬态模型的响应,从测量数据明显不同的地方。
clf;情节(PopulationSim.Values“r”);持有在;情节(Population_ts“b”);传奇(“仿真模型”,的测量数据,“位置”,“最佳”);
在稳态模型评估
改善之间的合适的模型和测量数据,模型需要被设置时稳态参数估计。定义一个操作规范。从实验数据输入是已知的。因此,(1)它不应该被视为一个自由变量计算稳态操作点时,和(2)操作点后发现,其输入时不应使用模拟模型。另一方面,所有的州时发现计算操作点时应使用模拟模型。创建一个sdo.OperatingPointSetup
对象收集操作规范,投入使用,使用和状态,因此该信息可以传递到目标函数和时使用模拟模型。您还可以提供第四个参数sdo.OperatingPointSetup
为计算指定选项的操作点。例如,选择“graddescent-proj”
常被用来找到操作系统,使用物理建模。
opSpec = operspec (modelName);opSpec.Inputs (1)。知道= true;inputsToUse = [];statesToUse = 1:元素个数(opSpec.States);OpPointSetup = sdo。OperatingPointSetup (opSpec inputsToUse statesToUse);
估计参数,设定模型的稳态过程。
estFcn = @ (v) sdoPopulationInflux_Objective (v,模拟器,Exp OpPointSetup);vOpt = sdo。优化(estFcn, v,选择);disp (vOpt)
优化开始2023 - 3月- 03,09:07:03一阶Iter F-count f (x)步长最优0 5 11.1517 - 1 1 10 15 0.00239293 0.3451 0.357 0.025674 - 0.5732 0.045 - 2 3 20 0.000692478 1.16 6.539 0.00069236 0.0148 0.00301 - 4 25 e-05 e-07局部最小值。优化完成因为梯度的大小小于最优值的宽容。(1,1)=名字:‘R’值:0.5953最低:0最大:正自由:1规模:1信息:[1 x1 struct](1、2) =名字:“K”值:3.0988最低:0.1000最大:正自由:1规模:2信息:[1 x1 struct] 1 x2 param.Continuous
使用估计模型中的参数值,得到模型的响应。搜索模型模拟输出信号的记录数据。
经验= setEstimatedValues (Exp、vOpt);模拟器= createSimulator (Exp、模拟器);模拟器= sim(模拟器,“OperatingPointSetup”,OpPointSetup);SimLog =找到(Simulator.LoggedData,…get_param (modelName“SignalLoggingName”));PopulationSim =找到(SimLog,“人口”);
开始时没有更多的瞬态模型的响应,还有一个更好的匹配模型响应和测量数据,这也反映在较低的目标/成本函数值在第二优化。所有这些表明,一套好的参数值被发现。
clf;情节(PopulationSim.Values“r”);持有在;情节(Population_ts“b”);传奇(“仿真模型”,的测量数据,“位置”,“最佳”);
相关的例子
学习如何把模型放在一个稳态使用参数估计量应用程序,请参阅设置时稳态模型估计参数(GUI)。
关闭模型和图。
bdclose (modelName)关闭(hFig)