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

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

Этот пример требует Simscape ®.

Модель RC-схемы

Модель Simulink, sdoRCCircuit, моделирует простую схему резистор-конденсатор (RC).

open_system('sdoRCCircuit');

Задача оценки

Вы используете измеренные данные, чтобы оценить параметр модели RC и значения состояния.

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

  • Напряжение конденсатора, выход PS-Simulink Converter блок

Параметр:

  • Емкость, C1, используемый в C1 блок

Состояние:

  • Начальное напряжение конденсатора, C1

Определите эксперимент по оценке

Получите измеренные данные.

load sdoRCCircuit_ExperimentData

Переменные time и data загружаются в рабочую область, где data - измеренное напряжение конденсатора в разы time.

Создайте объект эксперимента, чтобы сохранить экспериментальные данные о напряжении.

Exp = sdo.Experiment('sdoRCCircuit');

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

Voltage = Simulink.SimulationData.Signal;
Voltage.Name      = 'Voltage';
Voltage.BlockPath = 'sdoRCCircuit/PS-Simulink Converter';
Voltage.PortType  = 'outport';
Voltage.PortIndex = 1;
Voltage.Values    = timeseries(data,time);

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

Exp.OutputData = Voltage;

Сравнение измеренного выхода и начального моделируемого выхода

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

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

Поиск сигнала напряжения в записанных данных моделирования.

SimLog       = find(Simulator.LoggedData,get_param('sdoRCCircuit','SignalLoggingName'));
Voltage      = find(SimLog,'Voltage');

Постройте график измеренных и моделируемых данных.

Реакция модели не совпадает с экспериментальными выходными данными.

plot(time,data,'ro',Voltage.Values.Time,Voltage.Values.Data,'b')
title('Simulated and Measured Responses Before Estimation')
legend('Measured Voltage','Simulated Voltage')

Задайте параметры для оценки

Выберите емкостный параметр из модели. Задайте начальное предположение для значения емкости (460 uF) и минимальной границы (0 F).

p = sdo.getParameterFromModel('sdoRCCircuit','C1');
p.Value   = 460e-6;
p.Minimum = 0;

Определите целевую функцию оценки

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

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

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

The sdoRCCircuit_Objective функция:

  • Имеет один входной параметр, который задает оценочное значение емкости схемы.

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

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

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

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

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

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

type sdoRCCircuit_Objective
function vals = sdoRCCircuit_Objective(v,Simulator,Exp) 
%SDORCCIRCUIT_OBJECTIVE
%
%    The sdoRCCircuit_Objective function is used to compare model
%    outputs against experimental data.
%
%    vals = sdoRCCircuit_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, sdoRCCircuit_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('sdoRCCircuit','SignalLoggingName'));
Voltage = find(SimLog,'Voltage');

VoltageError = evalRequirement(r,Voltage.Values,Exp.OutputData(1).Values);

%%
% Return the residual errors to the optimization solver.
%
vals.F = VoltageError(:);
end

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

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

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

opt = sdo.OptimizeOptions;
opt.Method = 'lsqnonlin';

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

pOpt = sdo.optimize(estFcn,p,opt)
 Optimization started 27-Jan-2021 14:03:18

                                          First-order 
 Iter F-count        f(x)      Step-size  optimality
    0      3      55.0017            1                                         
    1      6      21.0148       0.2124         17.3
    2      9      11.5069       0.1272          6.1
    3     12      9.56554      0.06554            2
    4     15      9.27804       0.0275         0.43
    5     18      9.27316     0.006987       0.0788
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.
 
pOpt =
 
       Name: 'C1'
      Value: 1.1346e-04
    Minimum: 0
    Maximum: Inf
       Free: 1
      Scale: 0.0020
       Info: [1x1 struct]

 
1x1 param.Continuous
 

Сравнение измеренного выхода и моделируемого выхода

Обновите эксперимент с оцененным значением емкости.

Exp = setEstimatedValues(Exp,pOpt);

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

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

Поиск сигнала напряжения в записанных данных моделирования.

SimLog  = find(Simulator.LoggedData,get_param('sdoRCCircuit','SignalLoggingName'));
Voltage = find(SimLog,'Voltage');

Постройте график измеренных и моделируемых данных.

Имитированные и измеренные сигналы хорошо совпадают, за исключением почти начального момента времени. Это несоответствие связано с тем, что начальное напряжение конденсатора, заданное в модели, не совпадает с начальным напряжением от эксперимента.

plot(time,data,'ro',Voltage.Values.Time,Voltage.Values.Data,'b')
title('Simulated and Measured Responses After Estimation')
legend('Measured Voltage','Simulated Voltage')

Оценка начального состояния

Добавьте начальное напряжение конденсатора для C1 блок к эксперименту. Установите его начальное значение догадки равным 1 В.

Exp.InitialStates = sdo.getStateFromModel('sdoRCCircuit','C1');
Exp.InitialStates.Value = 1;

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

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

Получите начальное состояние и значение емкости, которые должны быть оценены из эксперимента.

v = getValuesToEstimate(Exp);

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

vOpt = sdo.optimize(estFcn,v,opt)
 Optimization started 27-Jan-2021 14:03:31

                                          First-order 
 Iter F-count        f(x)      Step-size  optimality
    0      5      4.74867            1                                         
    1     10       2.1196        1.537         22.7
    2     15      1.34958       0.1262       0.0713
    3     20      1.34365      0.05718        0.129
    4     25      1.34363     0.001378     0.000765
Local minimum found.

Optimization completed because the size of the gradient is less than
the value of the optimality tolerance.
 
vOpt(1,1) =
 
       Name: 'sdoRCCircuit/C1:sdoRCCircuit.C1.vc'
      Value: 2.3597
    Minimum: -Inf
    Maximum: Inf
       Free: 1
      Scale: 1
    dxValue: 0
     dxFree: 1
       Info: [1x1 struct]

 
vOpt(2,1) =
 
       Name: 'C1'
      Value: 2.2638e-04
    Minimum: 0
    Maximum: Inf
       Free: 1
      Scale: 0.0020
       Info: [1x1 struct]

 
2x1 param.Continuous
 

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

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

Exp = setEstimatedValues(Exp,vOpt);

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

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

plot(time,data,'ro',Voltage.Values.Time,Voltage.Values.Data,'b')
title('Simulated and Measured Responses After Initial State and Model Parameter Estimation')
legend('Measured Voltage','Simulated Voltage')

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

Обновите модель с предполагаемым значением емкости. Не обновляйте начальное напряжение конденсатора модели (первый элемент vOpt), так как он зависит от эксперимента.

sdo.setValueInModel('sdoRCCircuit',vOpt(2));

Похожие примеры

Чтобы узнать, как оценить параметры модели с помощью sdo.optimize команда, см. Оценка параметров модели и начальных состояний (GUI).

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

bdclose('sdoRCCircuit')