オフライン推定のための周波数応答実験データの収集
この例では、Frequency Response Estimator ブロックを使用して周波数応答の推定実験を実行し、後でオフライン推定を行うためにデータを保存する方法を説明します。実際には、展開先の環境でオンライン推定計算を行うためのリソースが不足している場合に、この方法を使用して物理プラントに対する実験をリアルタイムで実行することができます。ここでは例示のために、Simulink® でモデル化されたプラントに対して実験を実行します。
モデルと実験パラメーター
この例では、オフライン推定のために実験データを収集するよう構成されている Frequency Response Estimator ブロックを既に含んでいるモデルを使用します。
モデルを開きます。
mdl = "CollectFreqRespEstimDataEx.slx";
open_system(mdl)

モデルには PI コントローラーをもつ閉ループ構成のプラントが含まれています。Frequency Response Estimator ブロックは制御信号を入力 u として受け入れます。その制御信号に摂動を加えてプラント入力へと送ります。
Frequency Response Estimator ブロックは、シミュレーション中の周波数応答のオンライン推定の例で使用された同じ実験パラメーターを用いて、sinestream モードで実験を実行するように構成されています。ただし、この例では [推定モード] パラメーターが [オフライン] に設定されます。この構成では、ブロックが指定の摂動信号を挿入して応答データを収集しますが、推定は実行しません。ブロックは周波数 w = logspace(0,2,20) において sinestream 信号を使用するように構成されています。
実験データの収集
モデルのシミュレーションを実行します。ブロックが実験を実行して応答データを収集します。適用される sinestream 信号とシステム応答がスコープに表示されます。
sim(mdl)
open_system('CollectFreqRespEstimDataEx/Scope1')

モデルは、ブロック出力端子 data での推定データをログに記録するように構成されています (データ ログの詳細については、信号ログを使用した信号データの保存を参照)。このデータは MATLAB ワークスペースに Simulink.SimulationData.Dataset オブジェクト logsout として保存されます。ログに記録される端子は data だけなので、logsout の最初のエントリでログ データにアクセスできます。このエントリの Values フィールドは、4 つのフィールドを含む構造体です。
logdata = logsout{1}.Values
logdata =
struct with fields:
Ready: [1×1 timeseries]
Perturbation: [1×1 timeseries]
PlantInput: [1×1 timeseries]
PlantOutput: [1×1 timeseries]
Info: [1×1 struct]
u: [1×1 timeseries]
y: [1×1 timeseries]
Ready フィールドは timeseries で、これは推定に使用するデータがどのタイム ステップに含まれるかを示す論理信号を含んでいます。sinestream 信号の場合はこのフィールドに、推定で破棄される摂動周期 (整定周期) が示されます。Perturbation にはプラントに適用される sinestream 摂動が含まれます。PlantInput および PlantOutput の timeseries には、ブロックの入力 u と y での信号がそれぞれ含まれます。
周波数応答の推定
このデータを演算リソースの限られている展開先環境で収集する場合、このデータを使用して、frestimate コマンドを使った周波数応答のオフライン推定を行うことができます。frestimate に logdata 構造体と、ブロックの [周波数] パラメーターで使用した同じ周波数を指定します。frestimate は logdata を処理して、それらの周波数で推定された応答を含む周波数応答データ (frd) モデルを取得します。
sys_estim = frestimate(logdata,w,'rad/s');
size(sys_estim)
FRD model with 1 outputs, 1 inputs, and 20 frequency points.
推定された周波数応答を調べます。
figure
bode(sys_estim,'b*')
