В этом примере показано, как оценивать параметры модели при наложении ограничений на значения параметров.
Вы оцениваете динамические и статические коэффициенты трения простой системы трения.
В этом примере оцениваются параметры для простой системы трения. 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');
Укажите входные данные (приложенная сила) в качестве объекта временных рядов.
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_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);
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 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')