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

Этот пример показывает, как оценить параметры модели в то время как внушительные ограничения на значения параметров.

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

Откройте модель и получите экспериментальные данные

Этот пример оценивает параметры для простой системы трения, sdoFriction. Образцовый вход является силой, применился к массе, и образцовые выходные параметры являются массовым положением и скоростью.

open_system('sdoFriction');

Модель основана на массе, скользящей на поверхности. Масса подвергается статическому трению, которое должно быть преодолено перед массовыми перемещениями и динамическим трением, если перемещается масса. Статическое трение, u_static, является частью массовой нормальной силы; так же динамическое трение, u_dynamic, является частью массовой нормальной силы.

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

load sdoFriction_ExperimentData

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

Отобразите данные об эксперименте на графике

subplot(211),
plot(AppliedForce(:,1),AppliedForce(:,2))
title('Measured Applied Force Input for Simple Friction System');
ylabel('Applied Force (N)')
subplot(212)
plot(Position(:,1),Position(:,2))
title('Measured Mass Position for Simple Friction System');
xlabel('Time (seconds)')
ylabel('Position (m)')

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

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

Exp = sdo.Experiment('sdoFriction');

Задайте входные данные (приложенная сила) как объект timeseries.

Exp.InputData = timeseries(AppliedForce(:,2),AppliedForce(:,1));

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

PositionSig = Simulink.SimulationData.Signal;
PositionSig.Name      = 'Position';
PositionSig.BlockPath = 'sdoFriction/x';
PositionSig.PortType  = 'outport';
PositionSig.PortIndex = 1;
PositionSig.Values    = timeseries(Position(:,2),Position(:,1));

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

Exp.OutputData = PositionSig;

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

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

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

Ищите сигнал положения в регистрируемых данных моделирования.

SimLog     = find(Simulator.LoggedData,get_param('sdoFriction','SignalLoggingName'));
Position   = find(SimLog,'Position');

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

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

figure
plot(...
    Position.Values.Time,Position.Values.Data, ...
    Exp.OutputData.Values.Time, Exp.OutputData.Values.Data,'-.')
title('Simulated and Measured Responses Before Estimation')
ylabel('Position (m)')
xlabel('Time (seconds)')
legend('Simulated Position','Measured Position','Location','NorthWest')

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

Оцените u_static и коэффициенты трения u_dynamic с помощью данных об эксперименте. Эти коэффициенты используются в качестве усилений в Static Friction и блоках Dynamic Friction, соответственно. Физика указывает, что коэффициенты трения должны быть ограничены так, чтобы u_static u_dynamic; это ограничение параметра реализовано в целевой функции оценки.

Выберите параметры модели u_dynamic и u_static. Задайте границы для предполагаемых значений параметров. Оба коэффициента ограничиваются областью значений [0 1].

p = sdo.getParameterFromModel('sdoFriction',{'u_static','u_dynamic'});

p(1).Minimum = 0;
p(1).Maximum = 1;

p(2).Minimum = 0;
p(2).Maximum = 1;

Задайте цель оценки

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

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

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

Функция sdoFriction_Objective:

  • Имеет один входной параметр, который задает предполагаемые коэффициенты трения.

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

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

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

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

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

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

type sdoFriction_Objective
function vals = sdoFriction_Objective(p,Simulator,Exp) 
%SDOFRICTION_OBJECTIVE
%
%    The sdoFriction_Objective function is used to compare model
%    outputs against experimental data and measure how well constraints are
%    satisfied.
%
%    vals = sdoFriction_Objective(p,Exp) 
%
%    The |p| input argument is a vector of estimated model parameter values.
%
%    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 how well
%    constraints are satisfied. The |vals| argument is used by the
%    |sdo.optimize| function to estimate the model parameters.
%
%    See also sdo.optimize, sdoExampleCostFunction, sdoFriction_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 sum-squared-error.
%
r = sdo.requirements.SignalTracking;
r.Type   = '==';
r.Method = 'SSE';

%%
% Update the experiments with the estimated parameter values.
%
Exp  = setEstimatedValues(Exp,p);

%%
% Simulate the model and compare model outputs with measured experiment
% data.
%
Simulator = createSimulator(Exp,Simulator);
Simulator = sim(Simulator);

SimLog  = find(Simulator.LoggedData,get_param('sdoFriction','SignalLoggingName'));
Position = find(SimLog,'Position');

PositionError = evalRequirement(r,Position.Values,Exp.OutputData(1).Values);

%%
% Measure how well the parameters satisfy the friction coefficient constraint,
% |u_static| >= |u_dynamic|. Note that constraints are returned to the
% optimizer in a c <=0 format. The friction coefficient constraint is
% rewritten accordingly.
PConstr =  p(2).Value - p(1).Value; % u_dynamic - u_static <= 0

%%
% Return the sum-squared-error and constraint violation to the optimization
% solver.
%
vals.F    = PositionError(:);
vals.Cleq = PConstr;
end

Содействующее ограничение трения, u_static u_dynamic, реализовано в функции sdoFriction_Objective как u_dynamic - u_static 0. Это вызвано тем, что оптимизатор требует ограничительных значений в формате. Для получения дополнительной информации введите help sdo.optimize в подсказке команды MATLAB.

Оцените параметры

Используйте функцию sdo.optimize, чтобы оценить значения параметра модели трения.

Задайте опции оптимизации. Функция оценки sdoFriction_Objective возвращает квадратичную невязку суммы между моделируемыми и экспериментальными данными и включает ограничение параметра. Значение по умолчанию 'fmincon' решатель идеально для этого типа проблемы.

Оцените параметры.

pOpt = sdo.optimize(estFcn,p)
 Optimization started 29-Jan-2019 16:05:14

                               max                     First-order 
 Iter F-count        f(x)   constraint    Step-size    optimality
    0      5      27.7267            0
    1     11      22.5643            0         2.21         72.9
    2     15      17.4771            0         0.51           16
    3     22     0.762174            0         1.33         10.7
    4     29      0.40765            0        0.263         3.15
    5     34    0.0254254            0       0.0897         1.22
    6     39   0.00525359            0       0.0296         0.27
    7     44   0.00394384            0       0.0203        0.213
    8     49   0.00196687            0         0.11        0.215
    9     57   0.00189753            0       0.0464        0.242
   10     72   0.00186809            0      0.00979        0.236
   11     89   0.00186809            0      0.00165        0.236
Local minimum possible. Constraints satisfied.

fmincon stopped because the size of the current step is less than
the value of the step size tolerance and constraints are 
satisfied to within the value of the constraint tolerance.
 
pOpt(1,1) =
 
       Name: 'u_static'
      Value: 0.7961
    Minimum: 0
    Maximum: 1
       Free: 1
      Scale: 0.5000
       Info: [1x1 struct]

 
pOpt(2,1) =
 
       Name: 'u_dynamic'
      Value: 0.4028
    Minimum: 0
    Maximum: 1
       Free: 1
      Scale: 0.2500
       Info: [1x1 struct]

 
2x1 param.Continuous
 

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

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

Exp  = setEstimatedValues(Exp,pOpt);

Получите моделируемый вывод для эксперимента.

Simulator = createSimulator(Exp,Simulator);
Simulator = sim(Simulator);
SimLog    = find(Simulator.LoggedData,get_param('sdoFriction','SignalLoggingName'));
Position  = find(SimLog,'Position');

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

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

plot(...
    Position.Values.Time,Position.Values.Data, ...
    Exp.OutputData.Values.Time, Exp.OutputData.Values.Data,'-.')
title('Simulated and Measured Responses After Model Parameter Estimation')
ylabel('Position (m)')
xlabel('Time (seconds)')
legend('Simulated Position','Measured Position','Location','NorthWest')

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

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

sdo.setValueInModel('sdoFriction',pOpt);

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

bdclose('sdoFriction')