Main Content

Simulink.sdi.compareRuns

2 つのシミュレーション実行でデータを比較

説明

diffResult = Simulink.sdi.compareRuns(runID1,runID2) は、runID1 および runID2 に対応する実行のデータを比較し、結果を Simulink.sdi.DiffRunResult オブジェクト diffResult に返します。比較アルゴリズムの詳細については、シミュレーション データ インスペクターでデータを比較する方法を参照してください。

diffResult = Simulink.sdi.compareRuns(runID1,runID2,Name=Value) は、1 つ以上の名前と値の引数で指定したオプションを使用して runID1 および runID2 に対応するシミュレーション実行を比較します。比較オプションの詳細については、シミュレーション データ インスペクターでデータを比較する方法を参照してください。

すべて折りたたむ

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

関数 Simulink.sdi.compareRuns を使用して、データ型と開始時間および終了時間を含む信号データとメタデータを比較できます。単一の比較で 1 つ以上のメタデータに不一致があるかどうかをチェックする場合があります。信号メタデータに不一致があるかどうかをチェックすると、Simulink.sdi.DiffSignalResult オブジェクトの Status プロパティがメタデータの不一致を示している可能性があるため、Simulink.sdi.DiffRunResult オブジェクトの Summary プロパティが基本的な比較と異なる場合があります。関数 Simulink.sdi.compareRuns を使用して、インポートされたデータとシミュレーションからログ記録されたデータの比較を構成できます。

この例では、DiffSignalResult オブジェクトの Summary が信号の不一致に関する特定の情報をどのように提供できるのかを示す、ワークスペース データから 3 つの方法で作成された実行の比較を構成します。

ワークスペース データの作成

関数 Simulink.sdi.compareRuns は時系列データを比較します。ベースライン信号として使用する正弦波のデータを timeseries 形式を使用して作成します。timeseriesWave Data という名前を付けます。

time = 0:0.1:20;
sig1vals = sin(2*pi/5*time);
sig1_ts = timeseries(sig1vals,time);
sig1_ts.Name = 'Wave Data';

2 つ目の正弦波を作成してベースライン信号と比較します。少し異なる時間ベクトルを使用して信号を減衰し、2 つの信号が同一でなくなるようにします。信号データを single データ型にキャストします。この timeseries オブジェクトにも Wave Data という名前を付けます。シミュレーション データ インスペクターの比較アルゴリズムは名前を使用した比較のためにこれらの信号を整列します。

time2 = 0:0.1:22;
sig2vals = single(0.98*sin(2*pi/5*time2));
sig2_ts = timeseries(sig2vals,time2);
sig2_ts.Name = 'Wave Data';

シミュレーション データ インスペクターでの実行の作成と比較

関数 Simulink.sdi.compareRunsSimulink.sdi.Run オブジェクトに含まれるデータを比較します。関数 Simulink.sdi.createRun はシミュレーション データ インスペクターでデータ用に実行を作成します。関数 Simulink.sdi.createRun は作成された各実行について実行 ID を返します。

runID1 = Simulink.sdi.createRun('Baseline Run','vars',sig1_ts);
runID2 = Simulink.sdi.createRun('Compare to Run','vars',sig2_ts);

関数 Simulink.sdi.compareRuns を使用して実行を比較できます。比較アルゴリズムは信号データを double データ型に変換し、差分信号を計算する前に信号データを同期します。

basic_DRR = Simulink.sdi.compareRuns(runID1,runID2);

返された Simulink.sdi.DiffRunResult オブジェクトの Summary プロパティをチェックし、比較の結果を確認します。

basic_DRR.Summary
ans = struct with fields:
       OutOfTolerance: 1
      WithinTolerance: 0
            Unaligned: 0
        UnitsMismatch: 0
                Empty: 0
             Canceled: 0
          EmptySynced: 0
     DataTypeMismatch: 0
         TimeMismatch: 0
    StartStopMismatch: 0
          Unsupported: 0

信号間の差が許容誤差から外れています。

実行を比較してデータ型の一致をチェック

システム要件に応じて、比較する信号のデータ型を一致させる場合があります。関数 Simulink.sdi.compareRuns を使用し、データ型に不一致があるかどうかをチェックしてレポートする比較アルゴリズムを構成できます。

dataType_DRR = Simulink.sdi.compareRuns(runID1,runID2,'DataType','MustMatch');
dataType_DRR.Summary
ans = struct with fields:
       OutOfTolerance: 0
      WithinTolerance: 0
            Unaligned: 0
        UnitsMismatch: 0
                Empty: 0
             Canceled: 0
          EmptySynced: 0
     DataTypeMismatch: 1
         TimeMismatch: 0
    StartStopMismatch: 0
          Unsupported: 0

ベースライン信号のデータは double データ型であるのに対し、ベースラインと比較した信号のデータが single データ型であるため、信号比較の結果は DataTypeMismatch になります。

実行を比較し、開始時間と終了時間の一致をチェック

関数 Simulink.sdi.compareRuns を使用して、整列された信号の開始時間と終了時間が同じであるかどうかをチェックする比較アルゴリズムを構成できます。

startStop_DRR = Simulink.sdi.compareRuns(runID1,runID2,'StartStop','MustMatch');
startStop_DRR.Summary
ans = struct with fields:
       OutOfTolerance: 0
      WithinTolerance: 0
            Unaligned: 0
        UnitsMismatch: 0
                Empty: 0
             Canceled: 0
          EmptySynced: 0
     DataTypeMismatch: 0
         TimeMismatch: 0
    StartStopMismatch: 1
          Unsupported: 0

ワークスペースで作成された信号に異なる終了時間があるため、信号の比較結果は StartStopMismatch になります。

シミュレーション データ インスペクターを使用して実行を比較する際、信号をどのような組み合わせで比較するかを決定する整列基準を指定できます。この例では、航空機用縦方向制御システムのモデルのシミュレーション データを比較します。シミュレーションには矩形波入力が使用されました。1 回目のシミュレーションで使用された入力フィルターの時定数は 0.1s、2 回目のシミュレーションで使用された入力フィルターの時定数は 0.5s です。

まず、この例のデータを含むセッション ファイルからシミュレーション データを読み込みます。

Simulink.sdi.load('AircraftExample.mldatx');

セッション ファイルには 4 つのシミュレーションについてのデータが含まれています。この例では、最初の 2 つの実行からのデータを比較します。セッション ファイルから読み込まれた最初の 2 つの実行について、実行 ID にアクセスします。

runIDs = Simulink.sdi.getAllRunIDs;
runIDTs1 = runIDs(end-3);
runIDTs2 = runIDs(end-2);

比較を実行する前に、シミュレーション データ インスペクターで実行間で信号を整列する方法を定義します。この例では、名前、ブロック パス、Simulink 識別子の順に信号を整列します。

alignMethods = [Simulink.sdi.AlignType.SignalName
               Simulink.sdi.AlignType.BlockPath
               Simulink.sdi.AlignType.SID];

指定した整列基準を使用して、2 つの実行でシミュレーション データを比較します。この比較では、矩形波入力の遷移時にソルバーによって使用されるステップ サイズの差異がもたらす影響を説明するために、小さな時間許容誤差が使用されます。

diffResults = Simulink.sdi.compareRuns(runIDTs1,runIDTs2,'align',alignMethods,...
    'timetol',0.005);

関数 getResultByIndex を使用して、比較した実行に含まれる整列した信号の比較結果にアクセスできます。Simulink.sdi.DiffRunResult オブジェクトの Count プロパティを使用して、各 Simulink.sdi.DiffSignalResult オブジェクトについて Status プロパティをチェックする for ループを設定できます。

numComparisons = diffResults.count;

for k = 1:numComparisons
    resultAtIdx = getResultByIndex(diffResults,k);
    
    sigID1 = resultAtIdx.signalID1;
    sigID2 = resultAtIdx.signalID2;
    
    sig1 = Simulink.sdi.getSignal(sigID1);
    sig2 = Simulink.sdi.getSignal(sigID2);
    
    displayStr = 'Signals %s and %s: %s \n';
    fprintf(displayStr,sig1.Name,sig2.Name,resultAtIdx.Status);
end
Signals q, rad/sec and q, rad/sec: OutOfTolerance 
Signals alpha, rad and alpha, rad: OutOfTolerance 
Signals Stick and Stick: WithinTolerance 

入力引数

すべて折りたたむ

比較におけるベースライン実行の数値識別子。シミュレーション データ インスペクター内の実行に対応する実行 ID として指定します。シミュレーション データ インスペクターは実行の作成時に実行 ID を割り当てます。Simulink.sdi.Run オブジェクトの ID プロパティ、関数 Simulink.sdi.getAllRunIDs、または関数 Simulink.sdi.getRunIDByIndex を使用して、実行の実行 ID を取得できます。

比較する実行の数値識別子。シミュレーション データ インスペクターの実行に対応する実行 ID として指定します。シミュレーション データ インスペクターは実行の作成時に実行 ID を割り当てます。Simulink.sdi.Run オブジェクトの ID プロパティ、関数 Simulink.sdi.getAllRunIDs、または関数 Simulink.sdi.getRunIDByIndex を使用して、実行の実行 ID を取得できます。

名前と値の引数

引数のオプションのペアを Name1=Value1,...,NameN=ValueN として指定します。Name は引数名、Value は対応する値です。名前と値の引数は他の引数の後に表示されなければなりませんが、ペアの順序は重要ではありません。

R2021a より前は、名前と値をそれぞれコンマを使って区切り、Name を引用符で囲みます。

例: AbsTol=x,Align=alignOpts

信号の整列オプション。Simulink.sdi.AlignType スカラーまたはベクトルとして指定します。Simulink.sdi.AlignType 列挙型には、ベースライン実行の各信号を比較実行の信号とペアリングするために使用できる各オプションの値が含まれます。比較に対して 1 つ以上の整列オプションを指定できます。1 つを超える整列オプションを使用するには、配列を指定します。複数の整列オプションを指定する場合、シミュレーション データ インスペクターでは、最初に配列内の最初の要素のオプション、次に 2 番目の要素配列のオプションといった順で信号が整列されます。詳細については、信号の整列を参照してください。

整列基準
Simulink.sdi.AlignType.BlockPath信号のソース ブロックへのパス
Simulink.sdi.AlignType.SID

自動的に割り当てられる Simulink® 識別子

Simulink.sdi.AlignType.SignalName信号名
Simulink.sdi.AlignType.DataSourceMATLAB® ワークスペース内の変数のパス

例: [Simulink.sdi.AlignType.SignalName,Simulink.sdi.AlignType.BlockPath] は、信号の名前、次にブロック パスによって信号の整列を指定します。

比較のためのグローバル絶対許容誤差。正の値のスカラーとして指定します。

グローバル許容誤差は実行比較のすべての信号に適用されます。比較の信号に対して異なる許容誤差値を使用するには、ベースライン実行の Simulink.sdi.Signal オブジェクトで使用する許容誤差を指定して、その信号の OverrideGlobalTol プロパティを true に設定します。

許容誤差が比較でどのように使用されるかの詳細については、許容誤差の指定を参照してください。

例: 0.5

データ型: double

比較のためのグローバル相対許容誤差。正の値のスカラーとして指定します。相対許容誤差は非整数乗数として表されます。たとえば、0.1 は 10 パーセントの許容誤差を指定します。

グローバル許容誤差は実行比較のすべての信号に適用されます。比較の信号に対して異なる許容誤差値を使用するには、ベースライン実行の Simulink.sdi.Signal オブジェクトで使用する許容誤差を指定して、その信号の OverrideGlobalTol プロパティを true に設定します。

許容誤差が比較でどのように使用されるかの詳細については、許容誤差の指定を参照してください。

例: 0.1

データ型: double

比較のためのグローバル時間許容誤差。秒単位を使用した正の値のスカラーとして指定します。

グローバル許容誤差は実行比較のすべての信号に適用されます。比較の信号に対して異なる許容誤差値を使用するには、ベースライン実行の Simulink.sdi.Signal オブジェクトで使用する許容誤差を指定して、その信号の OverrideGlobalTol プロパティを true に設定します。

シミュレーション データ インスペクターにおける許容誤差の詳細については、許容誤差の指定を参照してください。

例: 0.2

データ型: double

信号のデータ型に対する比較の感度。"MustMatch" として指定します。比較される信号の数値データ型の不一致について、比較が影響を受けるようにするには、DataType="MustMatch" を指定します。

信号のデータ型が一致しない場合、結果に対する Simulink.sdi.DiffSignalResult オブジェクトの Status プロパティは DataTypeMismatch に設定されます。

関数 Simulink.sdi.compareRuns は、信号データを同期して比較する前に、整列された信号のデータ型を比較します。この名前と値の引数を指定しない場合、比較によるデータ型のチェックで string と数値データの比較の検出のみが行われます。string と数値データの比較では、結果は計算されず、結果のステータスは DataTypeMismatch になります。異なる数値データ型をもつ整列された信号については、比較で結果が計算されます。

最初の不一致で停止するように比較を構成すると、データ型の不一致によって比較は停止します。停止した比較では、すべての信号について必ずしも結果が計算されない可能性があります。

信号の時間ベクトルに対する比較の感度。"MustMatch" として指定します。比較される信号の時間ベクトルの不一致について、比較が影響を受けるようにするには、Time="MustMatch" を指定します。この名前と値の引数を指定すると、信号データを同期して比較する前に、整列された信号について、アルゴリズムによって時間ベクトルの比較が行われます。

信号の時間ベクトルが一致しない場合、結果に対する Simulink.sdi.DiffSignalResult オブジェクトの Status プロパティは TimeMismatch に設定されます。

この名前と値の引数を指定しない限り、比較では信号時間ベクトルの差異に影響を受けません。時間ベクトルの差異に影響を受けない比較では、比較の前に比較アルゴリズムによって信号の同期が行われます。同期の動作の詳細については、シミュレーション データ インスペクターでデータを比較する方法を参照してください。

時間ベクトルが一致しなければならないよう指定し、また最初の不一致で停止するように比較を構成すると、時間ベクトルの不一致によって比較は停止します。停止した比較では、すべての信号について必ずしも結果が計算されない可能性があります。

信号の開始時間と終了時間に対する比較の感度。"MustMatch" として指定します。信号の開始時間と終了時間の不一致について、比較が影響を受けるようにするには、StartStop="MustMatch" を指定します。この名前と値の引数を指定すると、信号データを同期して比較する前に、整列された信号について、アルゴリズムによって開始時間と終了時間の比較が行われます。

開始時間と終了時間が一致しない場合、結果に対する Simulink.sdi.DiffSignalResult オブジェクトの Status プロパティは StartStopMismatch に設定されます。

開始時間と終了時間が一致しなければならないよう指定し、また最初の不一致で停止するように比較を構成すると、開始時間と終了時間の不一致によって比較は停止します。停止した比較では、すべての信号について必ずしも結果が計算されない可能性があります。

最初に検出された不一致で、残りの信号を比較せずに比較が停止するかどうか。"Metadata" または "Any" として指定します。停止した比較では、すべての信号について必ずしも結果が計算されない可能性があり、不一致となった結果をより迅速に返す可能性があります。

  • "Metadata" - 整列された信号に対するメタデータの不一致によって比較が停止します。メタデータの比較は信号データの比較の前に行われます。

    シミュレーション データ インスペクターでは、常に信号を整列して信号単位を比較します。最初の不一致で停止するよう比較を構成すると、整列されていない信号、または単位の不一致により、常に比較が停止します。追加の名前と値の引数を指定して、信号のデータ型、開始時間と終了時間、および時間ベクトルなどの追加のメタデータをチェックし、その最初の不一致で停止するよう、比較を構成できます。

  • "Any" - 整列された信号に対するメタデータまたは信号データの不一致によって比較が停止します。

多次元信号の各チャネルの比較結果を計算するかどうか。logical true (1) または false (0) として指定します。

  • true または 1 - 非スカラーのサンプル値をもつ単一の信号として表される多次元信号をスカラーのサンプル値をもつ一連の信号に展開し、各信号の比較結果を計算します。

    多次元信号が非スカラーのサンプル値をもつ単一の信号として表されるシミュレーション データ インスペクターでの表現は変わりません。

  • false または 0 — 非スカラーのサンプル値をもつ単一の信号として表される多次元信号の比較結果を計算しません。

出力引数

すべて折りたたむ

比較の結果。Simulink.sdi.DiffRunResult オブジェクトとして返されます。

制限

シミュレーション データ インスペクターは以下の比較をサポートしていません。

  • R2020a より前: データ型 int64 または uint64 の信号。

  • 可変サイズの信号。

バージョン履歴

R2011b で導入