主要内容

设置时稳态模型估计参数(代码)

这个例子显示了如何设置一个模型的稳态参数估计的过程。设置一个稳态模型是很重要的,在许多应用程序中,如电力系统和飞机动力学。这个例子使用一个种群动态模型。

这个例子需要仿真软件®™软件控制设计。金宝app

模型描述

仿真软件金宝app模型sdoPopulationInflux人口增长模型的一个简单的生态,有机体环境的承载能力是有限的。

$ $ \压裂{d y} {dt} = R(1 - \压裂{y} {K}) (y + 10) $ $

  • R美元是固有的生物人口的增长率。

  • K美元是环境的承载能力。

还有大量的其他成员有机体的周边环境。模型使用标准化的单位。

打开模型。

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)