主要内容

估算模型参数值(代码)

这个例子展示了如何使用实验数据估计模型参数值。

飞机模型

仿真软件万博1manbetx模型,sdoAircraftEstimation,为飞机的纵向飞行控制系统建模。

open_system (“sdoAircraftEstimation”

估计问题

您使用测量数据来估计飞机模型参数和状态。

测量输出数据:

  • 驾驶员G力,输出的飞行员重力计算

  • 攻角,第四输出飞机动力学模型

参数:

  • 执行机构时间常数,助教,由致动器模型

  • 垂直速度,Zd,由飞机动力学模型

  • 利率上涨,医学博士,由飞机动力学模型

状态:

  • 一阶致动器模型的初始状态,sdoAircraftEstimation /致动器模型

定义估计实验

获得测量数据。

(时间,iodata) = sdoAircraftEstimation_Experiment;

sdoAircraftEstimation_Experiment函数返回测量的输出数据,iodata,以及相应的时间向量。第一列iodata是飞行员G力,第二列是迎角。

要查看此函数的代码,输入编辑sdoAircraftEstimation_Experiment

创建一个实验对象来存储测量的输入/输出数据。

经验= sdo。Experiment(“sdoAircraftEstimation”);

创建一个对象来存储测量到的飞行员重力输出。

PilotG = 万博1manbetxSimulink.SimulationData.Signal;PilotG。Name =“PilotG”;PilotG。BlockPath =“sdoAircraftEstimation /飞行员重力计算”;PilotG。PortType =“输出港”;PilotG。PortIndex = 1;PilotG。值= timeseries (iodata(:, 2),时间);

创建一个对象来存储测量的攻角(alpha)输出。

AoA = 万博1manbetxSimulink.SimulationData.Signal;农产品协定的。Name =“AngleOfAttack”;农产品协定的。BlockPath =“sdoAircraftEstimation /飞机动力学模型”;农产品协定的。PortType =“输出港”;农产品协定的。PortIndex = 4;农产品协定的。值= timeseries (iodata(: 1),时间);

将测得的飞行员重力和攻角数据作为预期输出数据加入实验中。

Exp.OutputData = [...PilotG;...AoA);

的初始状态致动器模型Block to the experiment。设置它免费的字段真正的所以它是估计的。

Exp.InitialStates = sdo.getStateFromModel (“sdoAircraftEstimation”“致动器模式”);Exp.InitialStates.Minimum = 0;Exp.InitialStates.Free = true;

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

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

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

在记录的模拟数据中搜索飞行员的重力和攻角信号。

SimLog =找到(模拟器。LoggedData get_param (“sdoAircraftEstimation”“SignalLoggingName”));PilotGSignal =找到(SimLog,“PilotG”);AoASignal =找到(SimLog,“AngleOfAttack”);

绘制测量和模拟数据。

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

情节(时间、iodata...AoASignal.Values.Time AoASignal.Values.Data,“——”...PilotGSignal.Values.Time PilotGSignal.Values.Data,“-”。);标题(“评估前的模拟和测量反应”)传说(“测量的迎角”“测得的飞行员重力”...“模拟迎角”“模拟飞行员重力”);

指定要评估的参数

选择描述飞行控制作动系统的模型参数。根据我们对驱动系统的理解,指定估计参数值的界限。

p = sdo.getParameterFromModel (“sdoAircraftEstimation”, {“助教”“医学博士”“Zd”});(1页)。最小值= 0.01;%的助教(1页)。最大= 1;(2页)。最小值= -10;%医学博士(2页)。最大= 0;(3页)。最小值= -100;% Zd(3页)。最大= 0;

得到由实验估计的执行器初始状态值。

s = getValuesToEstimate (Exp);

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

v = (p, s)
v(1, - 1) =名字:“助教”值:0.5000最低:0.0100最大:1自由:1比例:0.5000信息:[1 x1 struct] v(2, 1) =名字:“Md”价值:1最低:-10最大:0自由:1规模:1信息:[1 x1 struct] v(3,1) =名字:“Zd”值:-80最低:-100最大:0自由:1规模:128信息:[1 x1 struct] v(4,1) =名字:“sdoAircraftEstimation /致动器……”取值范围:0最小值:0最大值:Inf Free: 1 Scale: 1 dxValue: 0 dxFree: 1 Info: [1x1 struct] 4x1 parameter。连续

定义估计目标函数

创建一个估计目标函数,以评估使用估计参数值生成的模拟输出与测量数据的匹配程度。

使用带有一个输入参数的匿名函数来调用sdoAircraftEstimation_Objective函数。我们将匿名函数传递给sdo.optimize,它在每次优化迭代时对函数进行计算。

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

sdoAircraftEstimation_Objective功能:

  • 具有一个输入参数,该参数指定执行器参数值和执行器初始状态。

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

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

sdoAircraftEstimation_Objective函数需要两个输入,但是sdo.optimize要求具有一个输入参数的函数。为了解决这个问题,estFcn是一个带有一个输入参数的匿名函数,v,但它调用sdoAircraftEstimation_Objective使用两个输入参数,vExp

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

sdo.optimize命令最小化匿名函数的返回参数estFcn,即返回的残差sdoAircraftEstimation_Objective.有关如何编写目标/约束函数的更多细节sdo.optimize命令,键入帮助sdoExampleCostFunction在MATLAB命令提示符处。

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

类型sdoAircraftEstimation_Objective
函数val = sdoAircraftEstimation_Objective(v,Simulator,Exp) % sdoAircraftEstimation_Objective|v|输入参数是估计模型参数值%和初始状态的向量。模拟器|输入参数是一个模拟对象,使用估计的参数值模拟模型。|Exp|输入参数包含估计实验数据。|val |返回参数包含关于%模型模拟结果与实验数据匹配程度的信息,并由|sdo %使用。优化|函数,估计模型参数。% %参见sdo。定义一个信号跟踪需求,以计算模型输出与实验数据的匹配程度。配置跟踪需求,以便%它返回跟踪误差残差(而不是%和平方误差),并且不对错误进行归一化。% 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. % Simulator = createSimulator(Exp,Simulator); Simulator = sim(Simulator); SimLog = find(Simulator.LoggedData,get_param('sdoAircraftEstimation','SignalLoggingName')); PilotGSignal = find(SimLog,'PilotG'); AoASignal = find(SimLog,'AngleOfAttack'); PilotGError = evalRequirement(r,PilotGSignal.Values,Exp.OutputData(1).Values); AoAError = evalRequirement(r,AoASignal.Values,Exp.OutputData(2).Values); %% % Return the residual errors to the optimization solver. % vals.F = [PilotGError(:); AoAError(:)]; end

估计的参数

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

指定优化选项。估计函数sdoAircraftEstimation_Objective返回模拟数据和实验数据之间的误差残差,并且不包含任何约束条件,使这个问题成为“lsqnonlin”求解器的理想问题。

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

估计的参数。

vOpt = sdo.optimize (estFcn, v,选择)
优化开始2021年- 2月23日18:40:16一阶Iter F-count f (x)步长最优0 8 27955.2 - 1 1 10121.6 0.4744 5.68 e + 17日04 2 3127.27 0.3854 1.24 e + 26日04 3 35 872.666 0.4288 2.81 e + 03 4 44 53 71.693 - 0.4938 238.616 - 0.5154 617 148 71 62 17.1565 0.4236 43.9 7 11 89 80 0.0392376 0.135 1.33 1.73233 - 0.3027 0.000957796 0.02489 0.266 1098 0.000202147 0.007931 0.0114局部最小可能。Lsqnonlin停止的原因是相对于初始值的平方和的最终变化小于函数的容差值。vOpt(1, - 1) =名字:“助教”值:0.0500最低:0.0100最大:1自由:1比例:0.5000信息:[1 x1 struct] vOpt(2, 1) =名字:“Md”值:-6.8849最低:-10最大:0自由:1规模:1信息:[1 x1 struct] vOpt(3,1) =名字:“Zd”值:-63.9989最低:-100最大:0自由:1规模:128信息:[1 x1 struct] vOpt(4,1) =名称:“sdoAircraftEstimation /致动器……”取值范围:1.1976e-04最小值:0最大值:Inf Free: 1 Scale: 1 dxValue: 0 dxFree: 1 Info: [1x1 struct] 4x1 param。连续

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

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

经验= setEstimatedValues (Exp、vOpt);

使用更新后的实验对模型进行仿真,并将仿真输出与实验数据进行比较。

使用估计参数值的模型响应与实验输出数据非常吻合。

模拟器= createSimulator (Exp、模拟器);模拟器= sim(模拟器);SimLog =找到(模拟器。LoggedData get_param (“sdoAircraftEstimation”“SignalLoggingName”));PilotGSignal =找到(SimLog,“PilotG”);AoASignal =找到(SimLog,“AngleOfAttack”);情节(时间、iodata...AoASignal.Values.Time AoASignal.Values.Data,“-”。...PilotGSignal.Values.Time PilotGSignal.Values.Data,“——”)标题(“估计后的模拟和测量响应”)传说(“测量的迎角”“测得的飞行员重力”...“模拟迎角”“模拟飞行员重力”);

更新模型参数值

用估计的执行器参数值更新模型。不更新模型执行器初始状态(第四元素vOpt),因为它依赖于实验。

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

相关的例子

学习如何使用。估计模型参数参数估计量应用程序,请参阅估计模型参数值(GUI)

关闭模式。

bdclose (“sdoAircraftEstimation”