估计模型参数值(代码)
这个例子展示了如何使用实验数据估计模型参数值。
飞机模型
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”);
绘制实测数据和模拟数据。
正如预期的那样,模型响应与实验输出数据不匹配。
情节(时间、iodata…AoASignal.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”);情节(时间、iodata…AoASignal.Values.Time AoASignal.Values.Data,“-”。,…PilotGSignal.Values.Time PilotGSignal.Values.Data,“——”)标题(“估算后的模拟和测量反应”)传说(“测得的攻角”,测得的导频g力,…“模拟攻角”,“模拟飞行员g力”);
更新模型参数值
用估计的执行器参数值更新模型。不更新模型执行器初始状态(第四个元素vOpt
)因为这取决于实验。
sdo.setValueInModel (“sdoAircraftEstimation”vOpt (1:3));
相关的例子
方法估计模型参数参数估计量应用程序,请参阅估计模型参数值(GUI)。
关闭模型。
bdclose (“sdoAircraftEstimation”)