Этот пример показывает, как оценить начальное состояние и параметры модели.
Этот пример требует Simscape ®.
Модель 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')