主要内容

估计模型参数值(代码)

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

飞机模型

Simulink®模型,sdoAircraftEstimation,模拟飞机的纵向飞行控制系统。

open_system (“sdoAircraftEstimation”

估计问题

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

测量输出数据:

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

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

参数:

  • 执行器时间常数,助教,由驱动器模型块使用

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

  • 俯仰率增益,医学博士,由飞机动力学模型块使用

状态:

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

定义估计实验

获取测量数据。

[time,iodata] = sdoAircraftEstimation_Experiment;

sdoAircraftEstimation_Experiment函数返回测量的输出数据,iodata,和相应的时间向量。的第一列iodata为先导G力,第二列为迎角。

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

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

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

创建一个对象来存储测量的导频G-Force输出。

PilotG = Simulink.SimulationData.Signal;PilotG。Name =“PilotG”;PilotG。BlockPath =' sdoaircraftestimate /飞行员重力计算';PilotG。PortType =“输出港”;PilotG。PortIndex = 1;PilotG。Values = timeseries(iodata(:,2),time);

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

AoA = Simulink.SimulationData.Signal;农产品协定的。Name =“AngleOfAttack”;农产品协定的。BlockPath =“sdoaircraftestimate /飞机动力学模型”;农产品协定的。PortType =“输出港”;农产品协定的。PortIndex = 4;农产品协定的。Values = timeseries(iodata(:,1),time);

将测得的导频重力和迎角数据加入实验,作为预期输出数据。

Exp.OutputData = [PilotG;AoA);

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

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

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

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

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

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

SimLog = find(模拟器。LoggedData get_param (“sdoAircraftEstimation”“SignalLoggingName”));PilotGSignal = find(SimLog,“PilotG”);aosignal = find(SimLog,“AngleOfAttack”);

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

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

情节(时间、iodataAoASignal.Values.Time AoASignal.Values.Data,“——”PilotGSignal.Values.Time PilotGSignal.Values.Data,“-”。);标题(“估算前的模拟和测量响应”)传说(“测得的攻角”测得的导频g力“模拟攻角”“模拟飞行员g力”);

指定要估计的参数

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

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) =名称:'Ta'值:0.5000最小值:0.0100最大值:1 Free: 1 Scale: 0.5000 Info: [1x1 struct] v(2,1) =名称:'Md'值:-1最小值:-10最大值:0 Free: 1 Scale: 1 Info: [1x1 struct] v(3,1) =名称:'Zd'值:-80最小值:-100最大值:0 Free: 1 Scale: 128 Info: [1x1 struct] v(4,1) =名称:'sdoAircraftEstimation/Actuator…'取值范围:0最小值:0最大值:无穷大自由值:1比例:1 dxValue: 0 dxFree: 1信息:[1x1 struct] 4x1参数。连续

定义估计目标函数

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

方法使用带有一个输入参数的匿名函数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
函数vals = sdoAircraftEstimation_Objective(v,Simulator,Exp) % sdoAircraftEstimation_Objective % % sdoAircraftEstimation_Objective函数用于将模型%输出与实验数据进行比较。|v|输入参数是估计模型参数值%和初始状态的向量。|模拟器|输入参数是一个模拟对象,用于用估计的参数值模拟模型。|Exp|输入参数包含估计实验数据。|vals|返回参数包含有关%模型模拟结果与实验数据匹配程度的信息,并由% |sdo使用。优化|函数估计模型参数。% %参见sdo。Copyright 2012-2015 The MathWorks, Inc.定义一个信号跟踪需求,以计算模型输出%与实验数据匹配的程度。配置跟踪需求,使%返回跟踪误差残差(而不是% sum-squared-error),并且不归一化误差。% 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解算器。

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

估计参数。

vOpt = sdo.optimize(estFcn,v,opt)
一阶Iter f -count f(x)步长优化08 27955.2 11 17 10121.6 0.4744 5.68e+04 2 26 3127.27 0.3854 1.24e+04 3 35 872.666 0.4288 2.81e+03 4 44 238.616 0.5154 617 5 53 71.693 0.4938 148 6 62 17.1565 0.4236 43.9 7 71 1.73233 0.3027 11 8 80 0.0392376 0.135 1.33 9 89 0.000957796 0.02489 0.266 10 98 0.000202147 0.007931 0.0114局部最小值可能。Lsqnonlin停止了,因为最终平方和相对于其初始值的变化小于函数公差的值。vOpt(1,1) =名称:'Ta'值:0.0500最小值:0.0100最大值:1 Free: 1 Scale: 0.5000 Info: [1x1 struct] vOpt(2,1) =名称:'Md'值:-6.8849最小值:-10最大值:0 Free: 1 Scale: 1 Info: [1x1 struct] vOpt(3,1) =名称:'Zd'值:-63.9989最小值:-100最大值:0 Free: 1 Scale: 128 Info: [1x1 struct] vOpt(4,1) =名称:'sdoAircraftEstimation/Actuator…'取值范围:1.1976e-04最小值:0最大值:无穷大自由值:1比例:1 dxValue: 0 dxFree: 1信息:[1x1 struct] 4x1参数。连续

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

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

Exp = setEstimatedValues(Exp,vOpt);

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

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

模拟器= createsemulator (Exp,模拟器);模拟器= sim(模拟器);SimLog = find(模拟器。LoggedData get_param (“sdoAircraftEstimation”“SignalLoggingName”));PilotGSignal = find(SimLog,“PilotG”);aosignal = find(SimLog,“AngleOfAttack”);情节(时间、iodataAoASignal.Values.Time AoASignal.Values.Data,“-”。PilotGSignal.Values.Time PilotGSignal.Values.Data,“——”)标题(“估算后的模拟和测量反应”)传说(“测得的攻角”测得的导频g力“模拟攻角”“模拟飞行员g力”);

更新模型参数值

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

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

相关的例子

方法估计模型参数参数估计量应用程序,请参阅估计模型参数值(GUI)

关闭模型。

bdclose (“sdoAircraftEstimation”
Baidu
map