exponenta event banner

Параметры модели оценки и начальные состояния (код)

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

В этом примере требуется программа 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);

sdoRCCircuit_Objective функция:

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

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

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

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

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

Решатель оптимизации минимизирует остаточные ошибки. Дополнительные сведения о том, как написать функцию цели/ограничения для использования с 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')