exponenta event banner

Создание кода, сохраняющего состояние модели RUL для перезапуска системы

В этом примере показано, как создать код для прогнозирования оставшегося срока службы (RUL), который сохраняет состояние модели RUL при остановке и перезапуске алгоритма прогнозирования. Этот рабочий процесс полезен при использовании входящих данных для обновления модели RUL во время работы системы. При этом, при выключении системы, вы рискуете потерять любые обновления, сделанные в модели. В этом примере показано, как использовать readState и restoreState в функции начальной точки для сохранения обновлений, сделанных в модели во время выполнения.

Этот пример основан на рабочем процессе, показанном в разделе Создание кода для прогнозирования оставшегося срока полезного использования. Рабочий процесс этого примера можно использовать для создания кода для прогнозирования оставшегося срока службы с использованием моделей RUL на основе деградации. linearDegradationModel и exponentialDegradationModel.

Подгонка модели RUL

Перед созданием кода для прогнозирования RUL необходимо подогнать модель RUL с использованием исторических данных. Для этого примера загрузите данные в linTrainTables.mat. Этот файл содержит измерения некоторых индикаторов условий, полученных с течением времени, сгруппированных в таблицы с метками столбцов. "Time" и "Condition". Эти данные используются для обучения линейной модели деградации. (Дополнительные сведения о настройке и обучении этого типа модели RUL см. в разделе linearDegradationModel.)

load('linTrainTables.mat')

mdl = linearDegradationModel;
fit(mdl,linTrainTables,"Time","Condition")

Подготовка модели для создания кода

Как описано в разделе Создание кода для прогнозирования оставшегося срока службы, для подготовки модели к созданию кода используйте saveRULModelForCoder сохранение модели RUL в виде структуры данных в MAT-файле. Позже в функции точки входа используйте loadRULModelForCoder для загрузки и реконструкции linearDegradationModel объект.

saveMATfilename = 'savedModel.mat';
saveRULModelForCoder(mdl,saveMATfilename);

При необходимости можно обновить параметры модели, используя дополнительные данные, собранные после обучения. Для этого примера загрузите linTestData1, которая представляет собой таблицу времени и значений индикатора условия в 121 строке. Используйте первые две записи в этой таблице для обновления модели.

load('linTestData.mat','linTestData1')
updateData = linTestData1(1:2,:);
update(mdl,updateData);

Затем прочтите состояние модели с помощью readState. Эта команда преобразует объект модели RUL в структуру, которую можно передать функции точки входа в качестве входного аргумента.

savedState = readState(mdl);

Определение функции точки входа

Функция точки входа - это функция, для которой требуется создать код. Для этого примера создайте функцию точки входа degradationRULPreserveState.m, как показано здесь.

type degradationRULPreserveState.m
function [estRULOut,ciOut,newState] = degradationRULPreserveState(data,restoreStateFlag,savedState)
%#codegen

persistent mdl

% Load the model the first time function is called
if isempty(mdl)
   mdl = loadRULModelForCoder('savedModel');  
end

% Restore the saved model parameters if needed
if restoreStateFlag
   restoreState(mdl,savedState);
end

% Update model and prediction with new data
threshold = 60;
update(mdl,data);
[estRULOut,ciOut] = predictRUL(mdl,threshold);

% Read the updated model parameters 
newState = readState(mdl);

end

Эта функция обновляет модель прогнозирования RUL с помощью update при каждом вызове команды с новыми входными данными. Объявление mdl в качестве persistent переменная сохраняет обновленные параметры модели между вызовами, пока функция остается в памяти. Эта функция записывает обновленные параметры модели в выходной аргумент newState. Этот выходной аргумент можно использовать для сохранения обновленного состояния модели при удалении функции из памяти. Таким образом, например, при перезапуске алгоритма прогнозирования после завершения работы системы можно установить restoreStateFlag кому true и передать в последний сохраненный savedState, гарантируя, что система возобновит прогнозирование с использованием последних обновленных параметров модели.

Создать код

Для создания кода необходимо предоставить образцы данных, имеющие тип данных и формат каждого входного аргумента, ожидаемого функцией точки входа. Для этого примера используйте следующую запись в linTestData1. Также, набор restoreStateFlag логическому значению true.

testData = linTestData1(3,:);
restoreStateFlag = true;

Теперь можно создать код, используя следующее codegen (Кодер MATLAB).

codegen degradationRULPreserveState -args {testData,restoreStateFlag,savedState} -nargout 3
Code generation successful.

Эта команда создает файл MEX, который является исполняемым файлом, который можно вызвать из MATLAB ®. Можно использовать процедуры, подобные этому примеру, для создания кода для любой другой цели, котораяcodegen опоры. Кроме того, можно использовать приложение MATLAB Coder, как показано в разделе Создание кода для прогнозирования оставшегося срока службы.

Проверка созданного кода

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

[estRUL,ci,newState] = degradationRULPreserveState(testData,restoreStateFlag,savedState);
[estRUL_mex,ci_mex,newState_mex] = degradationRULPreserveState_mex(testData,restoreStateFlag,savedState);

Например, сравните оценочное значение RUL, полученное с помощью функции MATLAB, и сгенерированный файл MEX.

estRUL,ci
estRUL = 113.8920
ci = 1×2

   83.0901  172.5393

estRUL_mex,ci_mex
estRUL_mex = 113.8920
ci_mex = 1×2

   83.0901  172.5393

Теперь созданный код можно использовать как часть развернутой системы для прогнозирования оставшегося срока службы. Сохранить значение newState используется при необходимости перезагрузки системы. Например, возьмем следующую точку данных в linTestData1 и использовать его для обновления прогноза, начиная с newState_mex, состояние модели, сгенерированное в предыдущем вызове файла MEX.

testData2 = linTestData1(4,:);
[estRUL2_mex,ci2_mex,newState2_mex] = degradationRULPreserveState_mex(testData2,restoreStateFlag,newState_mex);

estRUL2_mex,ci2_mex
estRUL2_mex = 104.4336
ci2_mex = 1×2

   77.8216  154.1263

Обратите внимание, что функция MATLAB и файл MEX управляют собственными постоянными переменными. Поэтому значение MEX-файла равно mdl теперь включает обновление из testData2, которое является значением функции mdl не. Чтобы сбросить значения этих постоянных переменных, явным образом очистите функцию и файл MEX из памяти.

clear degradationRULPreserveState;
clear degradationRULPreserveState_mex;

См. также

| | |

Связанные темы