Оцените значения параметра модели (код)

Этот пример показывает, как использовать экспериментальные данные, чтобы оценить значения параметра модели.

Модель самолета

Модель Simulink, sdoAircraftEstimation, моделирует продольную систему управления полетом самолета.

open_system('sdoAircraftEstimation')

Проблема оценки

Вы используете результаты измерений, чтобы оценить параметры модели самолета и состояния.

Измеренные выходные данные:

  • Сила пилота Г, вывод блока Pilot G-force calculation

  • Угол нападения, четвертый вывод блока Aircraft Dynamics Model

Параметры:

  • Временная константа привода, Ta, используется блоком Actuator Model

  • Вертикальная скорость, Zd, используется блоком Aircraft Dynamics Model

  • Передайте усиления уровня, Md, используемый блоком Aircraft Dynamics Model

Состояние:

  • Начальное состояние модели привода первого порядка, sdoAircraftEstimation/Actuator Model

Задайте эксперимент оценки

Получите результаты измерений.

[time,iodata] = sdoAircraftEstimation_Experiment;

Функция sdoAircraftEstimation_Experiment возвращает измеренные выходные данные, iodata и соответствующий временной вектор. Первый столбец iodata является силой пилота Г, и второй столбец является углом нападения.

Чтобы видеть код для этой функции, введите edit sdoAircraftEstimation_Experiment.

Создайте объект эксперимента хранить измеренные данные о вводе/выводе.

Exp = sdo.Experiment('sdoAircraftEstimation');

Создайте объект сохранить измеренный экспериментальный G-Force вывод.

PilotG = Simulink.SimulationData.Signal;
PilotG.Name      = 'PilotG';
PilotG.BlockPath = 'sdoAircraftEstimation/Pilot G-force calculation';
PilotG.PortType  = 'outport';
PilotG.PortIndex = 1;
PilotG.Values    = timeseries(iodata(:,2),time);

Создайте объект сохранить измеренный угол нападения (альфа) вывод.

AoA = Simulink.SimulationData.Signal;
AoA.Name = 'AngleOfAttack';
AoA.BlockPath = 'sdoAircraftEstimation/Aircraft Dynamics Model';
AoA.PortType  = 'outport';
AoA.PortIndex = 4;
AoA.Values    = timeseries(iodata(:,1),time);

Добавьте измеренную экспериментальную G-силу и угол данных о нападении к эксперименту как ожидаемые выходные данные.

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

Добавьте начальное состояние для блока Actuator Model к эксперименту. Установите его поле Free на true так, чтобы он был оценен.

Exp.InitialStates = sdo.getStateFromModel('sdoAircraftEstimation','Actuator Model');
Exp.InitialStates.Minimum = 0;
Exp.InitialStates.Free    = true;

Сравните измеренный Вывод и начальный моделируемый Вывод

Создайте сценарий симуляции с помощью эксперимента и получите моделируемый вывод.

Simulator    = createSimulator(Exp);
Simulator    = sim(Simulator);

Ищите экспериментальную G-силу и угол сигналов нападения в регистрируемых данных моделирования.

SimLog       = find(Simulator.LoggedData,get_param('sdoAircraftEstimation','SignalLoggingName'));
PilotGSignal = find(SimLog,'PilotG');
AoASignal    = find(SimLog,'AngleOfAttack');

Отобразите измеренные и моделируемые данные на графике.

Как ожидалось образцовый ответ не совпадает с экспериментальными выходными данными.

plot(time, iodata, ...
    AoASignal.Values.Time,AoASignal.Values.Data,'--', ...
    PilotGSignal.Values.Time,PilotGSignal.Values.Data,'-.');
title('Simulated and Measured Responses Before Estimation')
legend('Measured angle of attack',  'Measured pilot g force', ...
     'Simulated angle of attack', 'Simulated pilot g force');

Задайте параметры, чтобы оценить

Выберите параметры модели, которые описывают систему приведения в действие управления полетом. Задайте границы для предполагаемых значений параметров на основе нашего понимания системы приведения в действие.

p = sdo.getParameterFromModel('sdoAircraftEstimation',{'Ta','Md','Zd'});
p(1).Minimum = 0.01;  %Ta
p(1).Maximum = 1;
p(2).Minimum = -10;   %Md
p(2).Maximum = 0;
p(3).Minimum = -100;  %Zd
p(3).Maximum = 0;

Получите значение начального состояния привода, которое должно быть оценено из эксперимента.

s = getValuesToEstimate(Exp);

Сгруппируйте параметры модели и начальные состояния, которые будут оценены вместе.

v = [p;s]
 
v(1,1) =
 
       Name: 'Ta'
      Value: 0.5000
    Minimum: 0.0100
    Maximum: 1
       Free: 1
      Scale: 0.5000
       Info: [1x1 struct]

 
v(2,1) =
 
       Name: 'Md'
      Value: -1
    Minimum: -10
    Maximum: 0
       Free: 1
      Scale: 1
       Info: [1x1 struct]

 
v(3,1) =
 
       Name: 'Zd'
      Value: -80
    Minimum: -100
    Maximum: 0
       Free: 1
      Scale: 128
       Info: [1x1 struct]

 
v(4,1) =
 
       Name: 'sdoAircraftEstimation/Actuator...'
      Value: 0
    Minimum: 0
    Maximum: Inf
       Free: 1
      Scale: 1
    dxValue: 0
     dxFree: 1
       Info: [1x1 struct]

 
4x1 param.Continuous
 

Задайте целевую функцию оценки

Создайте целевую функцию оценки, чтобы оценить, как тесно симуляция вывод, сгенерированное использование предполагаемых значений параметров, совпадает с результатами измерений.

Используйте анонимную функцию с одним входным параметром, который вызывает функцию sdoAircraftEstimation_Objective. Мы передаем анонимную функцию sdo.optimize, который выполняет функцию в каждой итерации оптимизации.

estFcn = @(v) sdoAircraftEstimation_Objective(v,Simulator,Exp);

Функция sdoAircraftEstimation_Objective:

  • Имеет один входной параметр, который задает значения параметров привода и начальное состояние привода.

  • Имеет один входной параметр, который задает объект эксперимента, содержащий результаты измерений.

  • Возвращает вектор ошибок между моделируемыми и экспериментальными выходными параметрами.

Функция sdoAircraftEstimation_Objective требует двух входных параметров, но sdo.optimize требует функции с одним входным параметром. Чтобы работать вокруг этого, estFcn является анонимной функцией с одним входным параметром, v, но это вызывает sdoAircraftEstimation_Objective с помощью двух входных параметров, v и Exp.

Для получения дополнительной информации относительно анонимных функций, см. "Анонимные функции".

Команда sdo.optimize минимизирует возвращаемый аргумент анонимной функции estFcn, то есть, остаточные ошибки, возвращенные sdoAircraftEstimation_Objective. Для получения дополнительной информации о том, как записать функцию цели/ограничения, чтобы использовать с командой sdo.optimize, введите help sdoExampleCostFunction в подсказке команды MATLAB.

Чтобы исследовать целевую функцию оценки более подробно, введите edit sdoAircraftEstimation_Objective в подсказке команды MATLAB.

type sdoAircraftEstimation_Objective
function vals = sdoAircraftEstimation_Objective(v,Simulator,Exp) 
%SDOAIRCRAFTESTIMATION_OBJECTIVE
%
%    The sdoAircraftEstimation_Objective function is used to compare model
%    outputs against experimental data.
%
%    vals = sdoAircraftEstimation_Objective(v,Exp) 
%
%    The |v| input argument is a vector of estimated model parameter values
%    and initial states.
%
%    The |Simulator| input argument is a simulation object used 
%    simulate the model with the estimated parameter values.
%
%    The |Exp| input argument contains the estimation experiment data.
%
%    The |vals| return argument contains information about how well the
%    model simulation results match the experimental data and is used by
%    the |sdo.optimize| function to estimate the model parameters.
%
%    See also sdo.optimize, sdoExampleCostFunction,
%    sdoAircraftEstimation_cmddemo
%
 
% Copyright 2012-2015 The MathWorks, Inc.

%%
% Define a signal tracking requirement to compute how well the model output
% matches the experiment data. Configure the tracking requirement so that
% it returns the tracking error residuals (rather than the
% sum-squared-error) and does not normalize the errors.
%
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)
 Optimization started 11-Jan-2019 03:25:01

                                          First-order 
 Iter F-count        f(x)      Step-size  optimality
    0      8      27955.2            1                                         
    1     17      10121.6       0.4744     5.68e+04
    2     26      3127.78       0.3853     1.24e+04
    3     35       872.79       0.4286     2.81e+03
    4     44      238.683       0.5152          618
    5     53      71.6605       0.4938          147
    6     62      16.9689       0.4218         44.6
    7     71      1.83553       0.3016         11.8
    8     80       0.0466       0.1342         1.36
    9     89   0.00126697      0.02786         0.22
   10     98  0.000281143     0.008563      0.00962
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.8848
    Minimum: -10
    Maximum: 0
       Free: 1
      Scale: 1
       Info: [1x1 struct]

 
vOpt(3,1) =
 
       Name: 'Zd'
      Value: -63.9979
    Minimum: -100
    Maximum: 0
       Free: 1
      Scale: 128
       Info: [1x1 struct]

 
vOpt(4,1) =
 
       Name: 'sdoAircraftEstimation/Actuator...'
      Value: 1.4130e-04
    Minimum: 0
    Maximum: Inf
       Free: 1
      Scale: 1
    dxValue: 0
     dxFree: 1
       Info: [1x1 struct]

 
4x1 param.Continuous
 

Сравните измеренный Вывод и итоговый моделируемый Вывод

Обновите эксперименты с предполагаемыми значениями параметров.

Exp = setEstimatedValues(Exp,vOpt);

Моделируйте модель с помощью обновленного эксперимента и сравните моделируемый вывод с экспериментальными данными.

Образцовый ответ с помощью предполагаемых значений параметров тесно совпадает с выходными данными эксперимента.

Simulator    = createSimulator(Exp,Simulator);
Simulator    = sim(Simulator);
SimLog       = find(Simulator.LoggedData,get_param('sdoAircraftEstimation','SignalLoggingName'));
PilotGSignal = find(SimLog,'PilotG');
AoASignal    = find(SimLog,'AngleOfAttack');

plot(time, iodata, ...
    AoASignal.Values.Time,AoASignal.Values.Data,'-.', ...
    PilotGSignal.Values.Time,PilotGSignal.Values.Data,'--')
title('Simulated and Measured Responses After Estimation')
legend('Measured angle of attack',  'Measured pilot g force', ...
    'Simulated angle of attack', 'Simulated pilot g force');

Обновите значения параметра модели

Обновите модель с предполагаемыми значениями параметров привода. Не обновляйте образцовое начальное состояние привода (четвертый элемент vOpt), когда это зависит от эксперимента.

sdo.setValueInModel('sdoAircraftEstimation',vOpt(1:3));

Связанные примеры

Чтобы изучить, как оценить параметры модели с помощью Parameter Estimation Tool, см. "Оценочные Значения Параметра модели (графический интерфейс пользователя)".

Закройте модель.

bdclose('sdoAircraftEstimation')