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

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

Этот пример требует 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 мкФ) и связанного минимума (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 11-Jan-2019 03:25:13

                                          First-order 
 Iter F-count        f(x)      Step-size  optimality
    0      3      55.0041            1                                         
    1      6      21.0161       0.2124         17.2
    2      9      11.5085       0.1272         6.08
    3     12      9.56468      0.06553         1.99
    4     15      9.27666      0.02744        0.442
    5     18      9.27666      0.00717        0.442
    6     21      9.27131     0.001793        0.356
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.1600e-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 11-Jan-2019 03:25:30

                                          First-order 
 Iter F-count        f(x)      Step-size  optimality
    0      5      4.66337            1                                         
    1     10      2.01883        1.533           21
    2     15      1.34889       0.1257       0.0803
    3     20      1.34365       0.0525         0.12
    4     25      1.34363     0.001294     0.000711
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.3596
    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, см. "Оценочные Параметры модели и начальные состояния (графический интерфейс пользователя)".

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

bdclose('sdoRCCircuit')