Main Content

システムの再起動に対し 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 予測モデルを更新します。mdlpersistent 変数として宣言することで、関数がメモリ内に留まっている間、更新されたモデル パラメーターは呼び出し間で保持されます。この関数は、更新されたモデル パラメーターを出力引数 newState に書き込みます。この値をエントリポイント関数の外部で保存して、関数がメモリからクリアされる際に、更新されたモデルの状態を保持します。したがって、たとえばシステム シャットダウンの後に予測アルゴリズムを再起動する際に、restoreStateFlagtrue に設定して、直近に 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

参考

| | | | | | | | | |

関連するトピック