主要内容

估算模型参数值(代码)

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

飞机模型

Simu金宝applink仿真®模型,sdoAircraftEstimation,为飞机的纵向飞行控制系统建模。

open_system (“sdoAircraftEstimation”

估计问题

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

测量输出数据:

  • 导频G力,输出导频G力计算块

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

参数:

  • 执行机构时间常数,助教,用于执行器模型块

  • 垂直速度,Zd,用于飞机动力学模型模块

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

状态:

  • 一阶执行器模型的初始状态,sdoAircraftEstimation/执行器模型

定义估计实验

获得测量数据。

(时间,iodata) = sdoAircraftEstimation_Experiment;

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

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

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

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

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

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

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

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

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

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

将致动器模型块的初始状态添加到实验中。设置它免费的字段真正的所以它是估计的。

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使用两个输入参数,v经验值

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

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,选择)
优化01 - 9月- 2021年开始16:52:22一阶Iter F-count f (x)步长最优0 8 27955.2 - 1 1 10121.6 0.4744 5.68 e + 17日04 2 3127.37 0.3853 1.24 e + 26日04 3 35 872.654 0.4286 2.81 e + 03 4 44 53 71.6429 - 0.4938 238.612 - 0.5152 618 147 62 16.8936 0.4246 43.4 71 1.84675 0.2942 11.5 89 80 0.041964 0.1377 1.42 0.00203774 0.02857 0.178 1098 0.000848053 0.008335 0.0611 11 107 0.000100733 0.006281 0.438 Local minimum possible. lsqnonlin stopped because the final change in the sum of squares relative to its initial value is less than the value of the function tolerance. vOpt(1,1) = Name: 'Ta' Value: 0.0500 Minimum: 0.0100 Maximum: 1 Free: 1 Scale: 0.5000 Info: [1x1 struct] vOpt(2,1) = Name: 'Md' Value: -6.8865 Minimum: -10 Maximum: 0 Free: 1 Scale: 1 Info: [1x1 struct] vOpt(3,1) = Name: 'Zd' Value: -64.0160 Minimum: -100 Maximum: 0 Free: 1 Scale: 128 Info: [1x1 struct] vOpt(4,1) = Name: 'sdoAircraftEstimation/Actuator...' Value: 6.4114e-05 Minimum: 0 Maximum: Inf Free: 1 Scale: 1 dxValue: 0 dxFree: 1 Info: [1x1 struct] 4x1 param.Continuous

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

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

经验= 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”