Сгенерируйте код, который сохраняет состояние модели 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")

Подготовьте модель для генерации кода

Как описано в Generate Code для предсказания оставшейся полезной жизни, чтобы подготовить модель к генерации кода, используйте 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 Coder) команда.

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

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

Проверьте сгенерированный код

Чтобы подтвердить сгенерированный код, в командной строке 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;

См. также

| | |

Похожие темы