Этот пример показывает, как сгенерировать код для предсказания оставшегося срока полезного использования (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")
Как описано в 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;
loadRULModelForCoder
| readState
| restoreState
| saveRULModelForCoder