В этом примере показано, как сгенерировать код для предсказания остающегося срока полезного использования (RUL), который сохраняет состояние модели RUL, когда алгоритм прогнозирования остановлен и перезапущен. Этот рабочий процесс полезен, когда вы используете входящие данные, чтобы обновить модель RUL во время работы системы. Когда вы делаете так на завершении работы системы, вы рискуете терять любые обновления, которые вы делаете к модели. В этом примере показано, как использовать readState
и restoreState
команды в вашей точке входа функционируют, чтобы сохранить обновления, сделанные к модели во время выполнения.
Этот пример основывается на рабочем процессе, показанном в, Генерируют Код для Предсказания Остающегося Срока полезного использования. Можно использовать рабочий процесс этого примера, чтобы сгенерировать код для предсказания остающегося срока полезного использования с основанными на ухудшении моделями RUL, linearDegradationModel
и exponentialDegradationModel
.
Прежде, чем сгенерировать код для предсказания 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 Coder) команда.
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
loadRULModelForCoder
| saveRULModelForCoder
| readState
| restoreState