このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
プログラムによるデータの検証と比較
シミュレーション データ インスペクター API を使用して、MATLAB® コマンド ラインからシミュレーション データ インスペクターの機能を利用できます。
シミュレーション データ インスペクターでは実行と信号のデータを整理し、各実行と信号に固有の数値識別子を割り当てます。シミュレーション データ インスペクター API 関数は、実行または信号そのものを入力として受け入れるのではなく、実行 ID および信号 ID を使用してデータを参照します。ワークスペースの実行 ID にアクセスするには、Simulink.sdi.getAllRunIDs
または Simulink.sdi.getRunIDByIndex
を使用できます。getSignalIDByIndex
メソッドを使って Simulink.sdi.Run
オブジェクトにより信号 ID にアクセスできます。
Simulink.sdi.Run
クラスと Simulink.sdi.Signal
クラスはデータへのアクセスを提供し、実行および信号メタデータの表示と変更を可能にします。Simulink.sdi.setSubPlotLayout
、Simulink.sdi.setRunNamingRule
、Simulink.sdi.setMarkersOn
などの関数を使用してシミュレーション データ インスペクターの基本設定を変更できます。シミュレーション データ インスペクターの既定の設定に戻すには、Simulink.sdi.clearPreferences
を使用します。
実行の作成とデータの表示
実行を作成してそこにデータを追加してから、シミュレーション データ インスペクターでデータを表示します。
実行のデータの作成
timeseries
オブジェクトを作成し、正弦信号と余弦信号のデータを含めます。各 timeseries
オブジェクトに説明的な名前を付けます。
time = linspace(0,20,100); sine_vals = sin(2*pi/5*time); sine_ts = timeseries(sine_vals,time); sine_ts.Name = "Sine, T=5"; cos_vals = cos(2*pi/8*time); cos_ts = timeseries(cos_vals,time); cos_ts.Name = "Cosine, T=8";
実行の作成とデータの追加
関数 Simulink.sdi.view
を使用して、シミュレーション データ インスペクターを開きます。
Simulink.sdi.view
データをワークスペースからシミュレーション データ インスペクターにインポートするには、関数 Simulink.sdi.Run.create
を使用して Simulink.sdi.Run
オブジェクトを作成します。Run
オブジェクトの Name
プロパティと Description
プロパティを使用して、実行に関する情報をそのメタデータに追加します。
sinusoidsRun = Simulink.sdi.Run.create; sinusoidsRun.Name = "Sinusoids"; sinusoidsRun.Description = "Sine and cosine signals with different frequencies";
関数 add
を使用して、ワークスペースで作成したデータを空の実行に追加します。
add(sinusoidsRun,"vars",sine_ts,cos_ts);
シミュレーション データ インスペクターでのデータのプロット
関数 getSignalByIndex
を使用して、信号データが含まれる Simulink.sdi.Signal
オブジェクトにアクセスします。Simulink.sdi.Signal
オブジェクトのプロパティを使用して、信号のライン スタイルと色を指定し、シミュレーション データ インスペクターに信号をプロットできます。各信号の LineColor
プロパティと LineDashed
プロパティを指定します。
sine_sig = getSignalByIndex(sinusoidsRun,1); sine_sig.LineColor = [0 0 1]; sine_sig.LineDashed = "-."; cos_sig = sinusoidsRun.getSignalByIndex(2); cos_sig.LineColor = [1 0 0]; cos_sig.LineDashed = "--";
関数 Simulink.sdi.setSubPlotLayout
を使用して、シミュレーション データ インスペクターのプロット領域で 2
行 1
列のサブプロット レイアウトを設定します。次に、関数 plotOnSubplot
を使用して、上のサブプロットに正弦信号をプロットし、下のサブプロットに余弦信号をプロットします。
Simulink.sdi.setSubPlotLayout(2,1); plotOnSubPlot(sine_sig,1,1,true); plotOnSubPlot(cos_sig,2,1,true);
シミュレーション データ インスペクターを閉じてデータを保存
プロットされた信号データの検査が完了したら、シミュレーション データ インスペクターを閉じて、セッションを MLDATX ファイルに保存できます。
Simulink.sdi.close("sinusoids.mldatx")
同じ実行内に含まれる 2 つの信号の比較
シミュレーション データ インスペクターのプログラムによるインターフェイスを使用して、同じ実行内の信号を比較できます。この例では、航空機用縦方向コントローラーの入力信号と出力信号を比較します。
最初に、データを含むセッションを読み込みます。
Simulink.sdi.load('AircraftExample.mldatx');
関数 Simulink.sdi.Run.getLatest
を使用してデータ内の最新の実行にアクセスします。
aircraftRun = Simulink.sdi.Run.getLatest;
次に、関数 Simulink.sdi.getSignalsByName
を使用して、コントローラーへの入力を表す Stick
信号と、出力を表す alpha, rad
信号にアクセスできます。
stick = getSignalsByName(aircraftRun,'Stick'); alpha = getSignalsByName(aircraftRun,'alpha, rad');
信号を比較する前に、比較に使用する許容誤差値を指定できます。比較のベースライン信号に指定された許容誤差値が使用されるため、Stick
信号に 0.1
の絶対許容誤差値を設定します。
stick.AbsTol = 0.1;
ここで、関数 Simulink.sdi.compareSignals
を使用して信号を比較します。Stick
信号はベースラインで、alpha, rad
信号はベースラインと比較される信号です。
comparisonResults = Simulink.sdi.compareSignals(stick.ID,alpha.ID); match = comparisonResults.Status
match = ComparisonSignalStatus enumeration OutOfTolerance
比較結果は許容誤差の範囲外です。関数 Simulink.sdi.view
を使用して、シミュレーション データ インスペクターを開き、比較結果を表示および解析できます。
グローバル許容誤差を使用して実行を比較
2 つのシミュレーション実行の比較に使用するグローバル許容誤差値を指定できます。グローバル許容誤差値は実行内のすべての信号に適用されます。この例では、実行比較のグローバル許容誤差値を指定する方法と、比較結果を解析して保存する方法を説明します。
まず、比較するデータを含むセッション ファイルを読み込みます。セッション ファイルには航空機用縦方向コントローラーの 4 つのシミュレーションに対するデータが含まれます。この例では、さまざまな入力フィルターの時定数を使用する 2 つの実行のデータを比較します。
Simulink.sdi.load('AircraftExample.mldatx');
比較する実行データにアクセスするには、関数Simulink.sdi.getAllRunIDs
を使用して、最新の 2 つのシミュレーション実行に対応する実行 ID を取得します。
runIDs = Simulink.sdi.getAllRunIDs; runID1 = runIDs(end - 1); runID2 = runIDs(end);
関数Simulink.sdi.compareRuns
を使用して実行を比較します。グローバル相対許容誤差の値 0.2
およびグローバル時間許容誤差の値 0.5
を指定します。
runResult = Simulink.sdi.compareRuns(runID1,runID2,'reltol',0.2,'timetol',0.5);
返された Simulink.sdi.DiffRunResult
オブジェクトの Summary
プロパティをチェックし、信号が許容誤差値の範囲内または範囲外のどちらであるのかを確認します。
runResult.Summary
ans = struct with fields:
OutOfTolerance: 0
WithinTolerance: 3
Unaligned: 0
UnitsMismatch: 0
Empty: 0
Canceled: 0
EmptySynced: 0
DataTypeMismatch: 0
TimeMismatch: 0
StartStopMismatch: 0
Unsupported: 0
3 つの信号の比較結果はすべて指定したグローバル許容誤差の範囲内にあります。
関数saveResult
を使用して、比較の結果を MLDATX ファイルに保存できます。
saveResult(runResult,'InputFilterComparison');
信号の許容誤差を使用したシミュレーション データの解析
シミュレーション データ インスペクターを使用して、実行した比較で使用する信号の許容誤差値をプログラムによって指定できます。この例では、航空機用縦方向飛行制御システムのモデルをシミュレーションして収集したデータを比較します。各シミュレーションは入力フィルターの時定数に異なる値を使用して、入出力信号をログに記録します。シミュレーション データ インスペクターと信号許容誤差を使用して結果を比較し、時定数の変更の影響を解析します。
まず、シミュレーション データを含むセッション ファイルを読み込みます。
Simulink.sdi.load('AircraftExample.mldatx');
セッション ファイルには 4 つの実行が含まれます。この例では、ファイル内の最初の 2 つの実行からデータを比較します。ファイルから読み込まれた最初の 2 つの実行について、Simulink.sdi.Run
オブジェクトにアクセスします。
runIDs = Simulink.sdi.getAllRunIDs; runIDTs1 = runIDs(end-3); runIDTs2 = runIDs(end-2);
次に、許容誤差を指定しないで 2 つの実行を比較します。
noTolDiffResult = Simulink.sdi.compareRuns(runIDTs1,runIDTs2);
関数 getResultByIndex
を使用して q
信号と alpha
信号の比較結果にアクセスします。
qResult = getResultByIndex(noTolDiffResult,1); alphaResult = getResultByIndex(noTolDiffResult,2);
各信号結果の Status
をチェックし、比較結果が許容誤差の範囲内または範囲外にあるかどうかを判断します。
qResult.Status
ans = ComparisonSignalStatus enumeration OutOfTolerance
alphaResult.Status
ans = ComparisonSignalStatus enumeration OutOfTolerance
比較では、すべての許容誤差に 0
の値を使用するため、OutOfTolerance
の結果は信号が同一でないことを意味します。
信号の許容誤差値を指定して、時定数の影響をさらに解析できます。比較対象の信号に対応する Simulink.sdi.Signal
オブジェクトのプロパティを設定し、許容誤差を指定します。比較ではベースライン信号に対して指定された許容誤差が使用されます。この例では、時間の許容誤差と絶対許容誤差を指定します。
許容誤差を指定するには、最初にベースライン実行から Signal
オブジェクトにアクセスします。
runTs1 = Simulink.sdi.getRun(runIDTs1); qSig = getSignalsByName(runTs1,'q, rad/sec'); alphaSig = getSignalsByName(runTs1,'alpha, rad');
AbsTol
プロパティと TimeTol
プロパティを使用して、q
信号に対して 0.1
の絶対許容誤差と 0.6
の時間の許容誤差を指定します。
qSig.AbsTol = 0.1; qSig.TimeTol = 0.6;
alpha
信号に対して、0.2
の絶対許容誤差と 0.8
の時間の許容誤差を指定します。
alphaSig.AbsTol = 0.2; alphaSig.TimeTol = 0.8;
結果を再度比較します。比較の結果にアクセスし、各信号の Status
プロパティをチェックします。
tolDiffResult = Simulink.sdi.compareRuns(runIDTs1,runIDTs2); qResult2 = getResultByIndex(tolDiffResult,1); alphaResult2 = getResultByIndex(tolDiffResult,2); qResult2.Status
ans = ComparisonSignalStatus enumeration WithinTolerance
alphaResult2.Status
ans = ComparisonSignalStatus enumeration WithinTolerance