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 つ以上の Name,Value のペアの引数で指定したオプションを使用して runID1 および runID2 に対応するシミュレーション実行を比較します。オプションの比較への影響の詳細については、シミュレーション データ インスペクターでデータを比較する方法を参照してください。

すべて折りたたむ

この例では、シミュレーション データ インスペクターのプログラムによるインターフェイスを使用して、シミュレーション データの実行を比較し、解析して、結果を保存する方法を示します。

シミュレーション データの作成

まず、データを記録するモデルのシミュレーションを行ってシミュレーション データを作成します。この例では ex_sldemo_absbrake モデルを使用し、Desired relative slip の値を変更する場合の影響を解析します。

モデルを読み込みます。関数 set_param を使用して、相対すべりの初期値を指定し、モデルのシミュレーションを行います。

load_system('ex_sldemo_absbrake')

set_param('ex_sldemo_absbrake/Desired relative slip','Value','0.24')
out_1 = sim('ex_sldemo_absbrake');

関数 set_param を使用して、相対すべりの異なる値を指定し、再度モデルのシミュレーションを行います。

set_param('ex_sldemo_absbrake/Desired relative slip','Value','0.25')
out_2 = sim('ex_sldemo_absbrake');

グローバル許容誤差値を使用した実行の比較

まず、関数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: 2
      WithinTolerance: 2
            Unaligned: 0
        UnitsMismatch: 0
                Empty: 0
             Canceled: 0
          EmptySynced: 0
     DataTypeMismatch: 0
         TimeMismatch: 0
    StartStopMismatch: 0
          Unsupported: 0

実行内で 2 つの信号の比較が許容範囲内、2 つが許容範囲外でした。

比較結果のプロット

プロットを使用して比較結果を解析できます。関数getResultByIndexを使用して、比較の結果を含む DiffRunResult オブジェクトからの Ww 信号の信号結果にアクセスします。Simulink.sdi.DiffSignalResult オブジェクトの Status プロパティをチェックします。

signalResult_Ww = getResultByIndex(runResult,1)
signalResult_Ww = 
  DiffSignalResult with properties:

           Status: OutOfTolerance
          AlignBy: 'Path'
        SignalID1: 43582
        SignalID2: 43628
    MaxDifference: 12.4878
            Sync1: [1x1 timeseries]
            Sync2: [1x1 timeseries]
             Diff: [1x1 timeseries]

signalResult_Ww.Status
ans = 
OutOfTolerance

Ww 信号の比較の結果は許容範囲外です。差分信号をプロットして結果を解析します。

figure(1)
plot(signalResult_Ww.Diff)

比較結果の保存

比較の結果を MLDATX ファイルに保存して、後で解析したり、同僚と共有したりできます。関数saveResultを使用して実行データと比較結果を保存できます。

saveResult(runResult,'desiredSlipResults')

MLDATX ファイル desiredSlipResults は作業ディレクトリに作成されます。関数Simulink.sdi.loadまたは関数openを使用して MLDATX ファイルの結果を表示します。

シミュレーション データ インスペクターのプログラムによるインターフェイスを使用して、比較で使用するための信号の許容誤差値を指定できます。この例では slexAircraftExample モデルとシミュレーション データ インスペクターを使用し、制御入力の後にローパス フィルターの時定数を変更することによる影響を評価します。

モデルの設定

モデルを読み込んで、関心のある信号をログ記録用にマークします。この例では、q 信号と alpha 信号のデータを記録します。

load_system('slexAircraftExample')

Simulink.sdi.markSignalForStreaming('slexAircraftExample/Aircraft Dynamics Model',3,'on')
Simulink.sdi.markSignalForStreaming('slexAircraftExample/Aircraft Dynamics Model',4,'on')

シミュレーションの実行

異なるローパス フィルターの時定数でシミュレーションを実行し、比較する結果を生成します。slexAircraftExample モデルは、そのモデルに関連付けられている変数をモデル ワークスペースに格納します。時定数値を変更するには、モデル ワークスペースにアクセスして関数 assignin を使用します。

out1 = sim('slexAircraftExample');

modelWorkspace = get_param('slexAircraftExample','modelworkspace');
assignin(modelWorkspace,'Ts',1)

out2 = sim('slexAircraftExample');

シミュレーション結果へのアクセスと比較

シミュレーション データ インスペクターのプログラムによるインターフェイスを使用して、シミュレーション結果にアクセスします。各シミュレーションによって、一意の実行 ID をもつ実行がシミュレーション データ インスペクターに作成されます。実行 ID を使用して、シミュレーション結果を比較します。

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

関数 Simulink.sdi.compareRuns を使用して、シミュレーションで得たデータを比較します。次に、信号結果の Status プロパティを検査し、信号が既定の許容誤差 0 の範囲内にあるかどうかを確認します。

diffRun1 = Simulink.sdi.compareRuns(runIDTs1,runIDTs2);

sig1Result1 = getResultByIndex(diffRun1,1);
sig2Result1 = getResultByIndex(diffRun1,2);

sig1Result1.Status
ans = 
OutOfTolerance
sig2Result1.Status
ans = 
OutOfTolerance

信号の許容誤差を使用して実行を比較

既定では、信号はすべての許容誤差値に 0 を使用するため、信号が同一でない場合は、比較によって許容誤差外の結果が返されます。時定数の変更の影響をさらに解析するために、信号の許容誤差値を指定します。比較する実行内の Simulink.sdi.Signal オブジェクトのプロパティを使用して、プログラムによる比較の許容誤差を指定できます。比較ではベースラインの Signal オブジェクトに対して指定された許容誤差が使用されます。この例では、時間の許容誤差と絶対許容誤差の組み合わせを指定します。

許容誤差を指定するには、まず比較する必要がある実行内の各信号に対応する Simulink.sdi.Signal オブジェクトにアクセスします。

run1 = Simulink.sdi.getRun(runIDTs1);
sigID1 = getSignalIDByIndex(run1,1);
sigID2 = getSignalIDByIndex(run1,2);

sig1 = Simulink.sdi.getSignal(sigID1);
sig2 = Simulink.sdi.getSignal(sigID2);

Name プロパティをチェックして、各 Signal オブジェクトを特定します。

sig1.Name
ans = 
'q, rad/sec'
sig2.Name
ans = 
'alpha, rad'

ベースラインの実行で q 信号オブジェクトの AbsTol プロパティと TimeTol プロパティを使用する q 信号に対して、0.1 の絶対許容誤差と 0.6 の時間の許容誤差を指定します。

sig1.AbsTol = 0.1;
sig1.TimeTol = 0.6;

ベースラインの実行で alpha 信号オブジェクトの AbsTol プロパティと TimeTol プロパティを使用する alpha 信号に対して、0.2 の絶対許容誤差と 0.8 の時間の許容誤差を指定します。

sig2.AbsTol = 0.2;
sig2.TimeTol = 0.8;

実行を再度比較し、結果にアクセスします。

diffRun2 = Simulink.sdi.compareRuns(runIDTs1,runIDTs2);
sig1Result2 = getResultByIndex(diffRun2,1);
sig2Result2 = getResultByIndex(diffRun2,2);

比較結果が指定された許容誤差の範囲内にあるかどうかを判断するには、各信号の Status プロパティをチェックします。

sig1Result2.Status
ans = 
WithinTolerance
sig2Result2.Status
ans = 
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 になります。

この例では、実行間での信号の整列で目標とする基準を使用して実行を比較する方法を説明します。

比較用のシミュレーション データの生成

まず、slexAircraftExample システムを読み込んで、関心のある信号をログ記録用にマークします。

load_system('slexAircraftExample')

Simulink.sdi.markSignalForStreaming('slexAircraftExample/Pilot',1,'on')
Simulink.sdi.markSignalForStreaming('slexAircraftExample/Aircraft Dynamics Model',... 
    4,'on')

この例では、変数 Ts のさまざまな値で slexAircraftExample モデルの 2 つのシミュレーションを実行します。get_param を使用して、slexAircraftExample モデルのモデル ワークスペースにアクセスします。次に、変数の値を割り当てて、最初のシミュレーションを実行します。

modelWorkspace = get_param('slexAircraftExample','modelworkspace');
modelWorkspace.assignin('Ts',0.1);

out_1 = sim('slexAircraftExample');

Ts の値を変更して、2 番目のシミュレーションを実行します。次のようになります。

modelWorkspace.assignin('Ts',0.2);

out_2 = sim('slexAircraftExample');
 

関数 Simulink.sdi.getAllRunIDs を使用して、slexAircraftExample モデルのシミュレーションを行ったときに作成された 2 つのシミュレーション実行の実行 ID にアクセスします。

runIDs = Simulink.sdi.getAllRunIDs;
runID1 = runIDs(end-1);
runID2 = runIDs(end);

比較のための整列基準を定義

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

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

指定した整列基準で実行を比較

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

diffResults = Simulink.sdi.compareRuns(runID1,runID2,'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 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 を取得できます。

名前と値のペアの引数

オプションのコンマ区切りされた Name,Value の引数ペアを指定します。ここで、Name は引数名、Value は対応する値です。Name は引用符で囲まなければなりません。Name1,Value1,...,NameN,ValueN のように、複数の名前と値のペア引数を任意の順序で指定できます。

例: 'abstol',x,'align',alignOpts

信号の整列オプション。'Align' と、string 配列または文字ベクトルの配列で構成されるコンマ区切りのペアとして指定します。

比較対象の実行からの信号のペアリングに使用する整列オプションを指定する配列。シミュレーション データ インスペクターでは、最初に配列内の最初の要素、次に配列内の 2 番目の要素といった順で信号が整列されます。詳細については、信号の整列を参照してください。

整列基準
Simulink.sdi.AlignType.BlockPath信号のソース ブロックへのパス
Simulink.sdi.AlignType.SIDSimulink® 識別子 Simulink 識別子を使用したブロック線図コンポーネントの検索
Simulink.sdi.AlignType.SignalName信号名
Simulink.sdi.AlignType.DataSourceMATLAB® ワークスペース内の変数のパス

例: [Simulink.sdi.AlignType.SignalName,Simulink.sdi.AlignType.SID] は、信号を名前で整列してから SID で整列するように指定します。

実行比較ですべての信号に使用されるグローバルな絶対許容誤差 (正の値)。'AbsTol' とスカラーで構成されるコンマ区切りのペアとして指定します。許容誤差が比較でどのように使用されるかの詳細については、許容誤差の指定を参照してください。

例: 0.5

データ型: double

実行比較ですべての信号に使用されるグローバルな相対許容誤差 (正の値)。'RelTol' とスカラーで構成されるコンマ区切りのペアとして指定します。相対許容誤差は非整数乗数として表されます。たとえば、0.1 は 10 パーセントの許容誤差を指定します。シミュレーション データ インスペクターで相対許容誤差が適用される方法の詳細については、許容誤差の指定を参照してください。

例: 0.1

データ型: double

実行比較ですべての信号に使用されるグローバルな時間の許容誤差 (正の値)。'TimeTol' とスカラーで構成されるコンマ区切りのペアとして指定します。秒単位で時間の許容誤差を指定します。シミュレーション データ インスペクターにおける許容誤差の詳細については、許容誤差の指定を参照してください。

例: 0.2

データ型: double

比較される信号のデータ型の不一致について、比較が影響を受けるようにするには、名前と値のペア 'DataType','MustMatch' を指定します。この名前と値のペアを指定すると、信号データを同期して比較する前に、整列された信号について、アルゴリズムによってデータ型の比較が行われます。

関数 Simulink.sdi.compareRuns は、この名前と値のペアを指定しない限り、整列された信号のデータ型を比較しません。この比較アルゴリズムでは、異なるデータ型をもつ信号を比較することができます。

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

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

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

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

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

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

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

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

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

最初に検出された不一致で、残りの信号の比較を行うことなく比較が停止するかどうか。'StopOnFirstMismatch' と、'Metadata' または 'Any' で構成されるコンマ区切りのペアとして指定します。停止した比較では、すべての信号について必ずしも結果が計算されない可能性があり、不一致となった結果をより迅速に返す可能性があります。

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

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

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

出力引数

すべて折りたたむ

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

R2011b で導入