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

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

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

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

Этот пример оценивает параметры для простой системы трения, 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 $\geq$ u_dynamic; это ограничение параметра реализовано в целевой функции оценки.

Выберите u_static и u_dynamic параметры модели. Задайте границы для предполагаемых значений параметров. Оба коэффициента ограничены областью значений [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);

The sdoFriction_Objective функция:

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

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

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

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

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

The sdo.optimize команда минимизирует возвращаемый аргумент анонимной функции estFcn, то есть остаточные ошибки, возвращенные sdoFriction_Objective. Для получения дополнительной информации о том, как написать функцию objective/constraint для использования со 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 $\geq$ u_dynamic, реализована в sdoFriction_Objective функционировать как u_dynamic - u_static $\leq$ 0. Это связано с тем, что оптимизатору требуются значения ограничений в$c \leq 0$ формате. Для получения дополнительной информации введите help sdo.optimize в командной строке MATLAB.

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

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

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

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

pOpt = sdo.optimize(estFcn,p)
 Optimization started 27-Jan-2021 14:01:20

                               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.76336            0         1.33         10.7
    4     29     0.408381            0        0.263         3.15
    5     34    0.0255292            0       0.0897         1.22
    6     39   0.00527178            0       0.0295        0.271
    7     44   0.00405706            0         0.02        0.177
    8     49   0.00111788            0        0.109        0.176
    9     63   0.00111788            0      0.00176        0.176
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.8224
    Minimum: 0
    Maximum: 1
       Free: 1
      Scale: 0.5000
       Info: [1x1 struct]

 
pOpt(2,1) =
 
       Name: 'u_dynamic'
      Value: 0.3973
    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')