システムの再起動に対し RUL モデルの状態を保持するコードの生成
この例では、予測アルゴリズムが停止して再起動する際に RUL モデルの状態を保持する、残存耐用期間 (RUL) を予測するためのコードを生成する方法を説明します。この例は、残存耐用期間の予測用コードの生成で説明したワークフローを基にしています。
この例のワークフローは、劣化ベースの RUL モデル linearDegradationModel
および exponentialDegradationModel
に使用できます。データの着信に応じた RUL 予測の更新で説明されているように、これらのモデルでは、update
コマンドを使用して、システムの動作中に受信データで RUL モデルを更新できます。展開された予測アルゴリズムでこのような更新を行うと、システムのシャットダウンに際して、動作中にモデルに加えた更新がすべて失われる危険があります。この例では、実行時にモデルに加えられた更新を保持するエントリポイント関数の記述方法を示します。そのためには、エントリポイント関数に readState
コマンドと restoreState
コマンドを組み込みます。
RUL モデルの当てはめ
RUL 予測のコードを生成する前に、履歴データを使用して RUL モデルを当てはめなければなりません。この例では、linTrainTables.mat
のデータを読み込みます。このファイルには、経時的に取得されたいくつかの状態インジケーターの測定値が含まれ、列ラベル "Time"
および "Condition"
をもつ table にまとめられています。これらのデータを使用して線形劣化モデルの学習を行います。(このタイプの RUL モデルの構成と学習の詳細については、linearDegradationModel
を参照してください。)
load('linTrainTables.mat') mdl = linearDegradationModel; fit(mdl,linTrainTables,"Time","Condition")
コード生成に向けたモデルの準備
残存耐用期間の予測用コードの生成で説明されているように、モデルをコード生成用に準備するには、saveRULModelForCoder
を使用して RUL モデルをデータ構造体として MAT ファイルに保存します。後に、エントリポイント関数内で loadRULModelForCoder
を使用して linearDegradationModel
オブジェクトを読み込み、再構成します。
saveMATfilename = 'savedModel.mat';
saveRULModelForCoder(mdl,saveMATfilename);
オプションとして、学習データの後で収集された追加データを使用して、モデル パラメーターを更新することができます。この例では、時間と状態インジケーター値からなる 121 行の table である、linTestData1
を読み込みます。この table にある最初の 2 つのエントリを使用して、モデルを更新します。
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
この関数は、新たな入力データを指定して呼び出されるたびに、update
コマンドを使用して RUL 予測モデルを更新します。mdl
を persistent
変数として宣言することで、関数がメモリ内に留まっている間、更新されたモデル パラメーターは呼び出し間で保持されます。この関数は、更新されたモデル パラメーターを出力引数 newState
に書き込みます。この値をエントリポイント関数の外部で保存して、関数がメモリからクリアされる際に、更新されたモデルの状態を保持します。したがって、たとえばシステム シャットダウンの後に予測アルゴリズムを再起動する際に、restoreStateFlag
を true
に設定して、直近に savedState
として保存された状態値を渡すことができ、システムは直近に更新されたモデル パラメーターを使用して予測を確実に再開するようになります。
コードの生成
コードを生成するには、エントリポイント関数で必要とされる各入力引数のデータ型と形式をもつサンプル データを指定する必要があります。この例では、linTestData1
の次の行を使用します。また、restoreStateFlag
を論理値 true
に設定します。
sampleData = linTestData1(3,:); restoreStateFlag = true;
これで、次のcodegen
(MATLAB Coder)コマンドを使用してコードを生成することができます。変数リスト {sampleData,restoreStateFlag,savedState}
は、codegen
コマンドに、この関数が時刻と数値からなる table 行、論理値、readState
が返す形式 savedState
の構造体を引数として受け取ることを示します。
codegen degradationRULPreserveState -args {sampleData,restoreStateFlag,savedState} -nargout 3
Code generation successful.
このコマンドは MEX ファイルを生成します。MEX ファイルは MATLAB® 内から呼び出すことができる実行可能ファイルです。この例と同様の手順を使用して、codegen
がサポートする他の任意のターゲット用のコードを生成することができます。あるいは、残存耐用期間の予測用コードの生成で示されているように、MATLAB Coder™ アプリを使用することができます。
生成コードの検証
生成コードを検証するには、MATLAB コマンド プロンプトで、サンプル データを指定して MATLAB エントリポイント関数を実行します。次に、同じデータに対して生成された MEX ファイルを実行し、結果が同じであることを確認します。
[estRUL,ci,newState] = degradationRULPreserveState(sampleData,restoreStateFlag,savedState); [estRUL_mex,ci_mex,newState_mex] = degradationRULPreserveState_mex(sampleData,restoreStateFlag,savedState);
たとえば、MATLAB 関数と生成された MEX ファイルそれぞれを使用して取得した推定 RUL を比較します。
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
の次のデータ点を取得し、それを使用して予測を更新します。その際、前回の MEX ファイルの呼び出しで生成されたモデルの状態 newState_mex
から開始します。
nextData = linTestData1(4,:); [estRUL2_mex,ci2_mex,newState2_mex] = degradationRULPreserveState_mex(nextData,restoreStateFlag,newState_mex); estRUL2_mex,ci2_mex
estRUL2_mex = 104.4336
ci2_mex = 1×2
77.8216 154.1263
MATLAB 関数と MEX ファイルは、それぞれが独自の永続変数を管理することに注意してください。したがって、この時点で MEX ファイルの mdl
値には nextData
からの更新が組み込まれている一方で、関数の mdl
値には組み込まれていません。これら永続変数の値をリセットするには、関数と MEX ファイルを明示的にメモリからクリアします。
clear degradationRULPreserveState clear degradationRULPreserveState_mex
参考
loadRULModelForCoder
| saveRULModelForCoder
| readState
| restoreState
| linearDegradationModel
| exponentialDegradationModel
| covariateSurvivalModel
| reliabilitySurvivalModel
| pairwiseSimilarityModel
| hashSimilarityModel
| residualSimilarityModel