exponenta event banner

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

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

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

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

open_system('sdoAircraftEstimation')

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

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

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

  • Сила G пилота, выход 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 - сила пилота G, а вторая колонна - угол атаки.

Для просмотра кода этой функции введите 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-Force и угол атаки к эксперименту в качестве ожидаемых выходных данных.

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-Force и угла атаки сигналов в записанных данных моделирования.

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 27-Jan-2021 14:00:21

                                          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.5       0.3845     1.24e+04
    3     35      872.577       0.4293     2.81e+03
    4     44      238.548       0.5156          618
    5     53      71.5731       0.4939          147
    6     62      16.9301       0.4222         44.3
    7     71      1.82188       0.3019         11.5
    8     80    0.0426814       0.1356         1.35
    9     89   0.00113417      0.02555        0.243
   10     98  0.000247412     0.008296      0.00764
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.8849
    Minimum: -10
    Maximum: 0
       Free: 1
      Scale: 1
       Info: [1x1 struct]

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

 
vOpt(4,1) =
 
       Name: 'sdoAircraftEstimation/Actuator...'
      Value: 1.3254e-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));

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

Сведения об оценке параметров модели с помощью приложения «Оценка параметров» см. в разделе Оценка значений параметров модели (GUI).

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

bdclose('sdoAircraftEstimation')