В этом примере показано, как использовать экспериментальные данные для оценки значений параметров модели.
модель 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')