主要内容

Simulink.sdi.compareRuns

比较两次仿真运行中的数据

说明

diffResult = Simulink.sdi.compareRuns(runID1,runID2) 比较对应于 runID1runID2 的运行中的数据,并在 Simulink.sdi.DiffRunResult 对象 diffResult 中返回结果。有关比较算法的详细信息,请参阅仿真数据检查器如何比较数据

示例

diffResult = Simulink.sdi.compareRuns(runID1,runID2,Name=Value) 使用由一个或多个名称-值参量指定的选项比较对应于 runID1runID2 的仿真运行。有关比较选项的详细信息,请参阅仿真数据检查器如何比较数据

示例

示例

全部折叠

您可以指定在比较两个仿真运行时使用的全局容差值。全局容差值应用于运行中的所有信号。此示例说明如何为运行比较指定全局容差值,以及如何分析和保存比较结果。

加载包含要比较的数据的仿真数据检查器会话文件。该会话文件包含一个飞机纵向飞行控制器的四次仿真的数据。此示例比较使用不同输入滤波器时间常数的两次运行的数据。

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

要访问要比较的运行数据,请使用 Simulink.sdi.getAllRunIDs 函数获取对应于最后两次仿真运行的运行 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

所有三个信号比较结果都在指定的全局容差内。

您可以使用 saveResult 函数将比较结果保存到一个 MLDATX 文件中。

saveResult(runResult,"InputFilterComparison");

您可以通过编程方式指定信号容差值,以便在使用仿真数据检查器进行比较时使用。在此示例中,您将比较通过仿真飞机纵向飞行控制系统模型收集的数据。每次仿真使用不同的输入滤波器时间常数值,并记录输入和输出信号。通过使用仿真数据检查器和信号容差比较结果,可以分析时间常数变化的影响。

首先,加载包含仿真数据的会话文件。

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

该会话文件包含四次运行。在此示例中,您将比较文件中前两次运行的数据。访问从文件加载的前两次运行的 Simulink.sdi.Run 对象。

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

在不指定任何容差的情况下比较这两次运行。

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

使用 getResultByIndex 函数访问 qalpha 信号的比较结果。

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');

对于 q 信号,分别使用 AbsTolTimeTol 属性指定绝对容差 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 函数来比较信号数据和元数据,包括数据类型以及开始和停止时间。单个比较可以检查一个或多个元数据片段中的不匹配。当您检查信号元数据中的不匹配时,Simulink.sdi.DiffRunResult 对象的 Summary 属性可能不同于基本比较,因为 Simulink.sdi.DiffSignalResult 对象的 Status 属性可以指示元数据不匹配。您可以使用 Simulink.sdi.compareRuns 函数为导入的数据和从仿真记录的数据配置比较。

此示例以三种方式配置从工作区数据创建的运行比较,以显示 DiffSignalResult 对象的 Summary 如何提供有关信号不匹配的特定信息。

创建工作区数据

Simulink.sdi.compareRuns 函数比较时间序列数据。使用 timeseries 格式创建正弦波数据以用作基线信号。将 timeseries 命名为 Wave Data

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

创建第二个正弦波以与基线信号进行比较。使用稍微不同的时间向量并衰减信号,使这两个信号有所不同。将信号数据转换为 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.compareRuns 函数比较 Simulink.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

信号比较的结果现在是 DataTypeMismatch,因为基线信号的数据是 double 数据类型,而与基线比较的信号的数据是 single 数据类型。

比较运行并检查开始和停止时间匹配情况

您可以使用 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,因为在工作区中创建的信号具有不同停止时间。

当您使用仿真数据检查器比较各次运行时,您可以指定对齐条件,以确定信号如何相互配对来进行比较。此示例比较一个飞机纵向控制系统模型的仿真数据。这些仿真使用方波输入。第一次仿真使用的输入滤波器时间常数为 0.1s,第二次仿真使用的输入滤波器时间常数为 0.5s

首先,从包含此示例数据的会话文件中加载仿真数据。

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

会话文件包含四个仿真的数据。此示例比较前两次运行的数据。访问从会话文件加载的前两次运行的运行 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];

使用您指定的对齐条件比较两次运行中的仿真数据。考虑到求解器使用的步长差异对方波输入转换的影响,该比较使用较小的时间容差。

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

您可以使用 getResultByIndex 函数访问所比较的各次运行中对齐信号的比较结果。您可以使用 Simulink.sdi.DiffRunResult 对象的 Count 属性来设置 for 循环,以检查每个 Simulink.sdi.DiffSignalResult 对象的 Status 属性。

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 枚举包括可用于将基线运行中的每个信号与比较运行中的信号配对的每个选项的值。您可以为比较指定一个或多个对齐选项。要使用多个对齐选项,请指定数组。当您指定多个对齐选项时,仿真数据检查器会先按数组的第一个元素中的选项对齐信号,然后按数组中第二个元素中的选项对齐信号,依此类推。有关详细信息,请参阅信号对齐

对齐方式
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 函数将先比较对齐信号的数据类型,再同步和比较信号数据。如果不指定此名称-值参量,数据类型检查只用于检测是否为字符串和数值数据之间的比较。对于字符串和数值数据之间的比较,不计算结果,且结果的状态为 DataTypeMismatch。对于具有不同数值数据类型的对齐信号,比较会计算结果。

如果您将比较配置为在遇到第一次不匹配时停止,则数据类型不匹配会停止比较。停止的比较可能不会计算所有信号的结果。

比较时对信号时间向量的敏感度,指定为 "MustMatch"。当您希望比较对所比较信号的时间向量中的不匹配敏感,请指定 Time="MustMatch"。当您指定此名称-值参量时,算法会先比较对齐信号的时间向量,再同步和比较信号数据。

当信号的时间向量不匹配时,Simulink.sdi.DiffSignalResult 结果对象的 Status 属性设置为 TimeMismatch

除非指定此名称-值参量,否则比较对信号时间向量的差异不敏感。如果比较对时间向量的差异不敏感,比较算法会在比较之前同步信号。有关同步如何工作的详细信息,请参阅仿真数据检查器如何比较数据

如果您指定时间向量必须匹配并将比较配置为在遇到第一次不匹配时停止,则时间向量不匹配会停止比较。停止的比较可能不会计算所有信号的结果。

比较时对信号开始和停止时间的敏感度,指定为 "MustMatch"。如果您希望比较对信号开始和停止时间的不匹配敏感,请指定 StartStop="MustMatch"。当您指定此名称-值参量时,算法会在同步和比较信号数据之前比较对齐的信号的开始和停止时间。

当开始时间和停止时间不匹配时,Simulink.sdi.DiffSignalResult 结果对象的 Status 属性设置为 StartStopMismatch

如果您指定开始和停止时间必须匹配并将比较配置为在第一次不匹配时停止,则开始或停止时间不匹配会停止比较。停止的比较可能不会计算所有信号的结果。

比较时对信号单位的敏感度,由 "Ignore" 指定。如果您要在比较时忽略信号单位不匹配,请指定 Units="Ignore"

除非指定此名称-值参量,否则比较对对齐的信号单位的差异不敏感。当您未指定此名称-值参量且基线信号和比较信号都具有不匹配的单位时,结果的 Simulink.sdi.DiffSignalResult 对象的 Status 属性设置为 UnitsMismatch。如果仅一个信号具有单位,则比较对差异不敏感。

如果您指定比较时忽略信号单位不匹配并将比较配置为在遇到第一次不匹配时停止,则单位不匹配不会停止比较。停止的比较可能不会计算所有信号的结果。

比较是否在第一次检测到不匹配时停止而不比较其余信号,指定为 "Metadata""Any"。停止的比较可能不会计算所有信号的结果,并且会更快地返回不匹配的结果。

  • "Metadata" - 对齐信号的元数据不匹配会停止比较。元数据比较发生在比较信号数据之前。

    仿真数据检查器始终对齐信号。如果您将比较配置为在遇到第一次不匹配时停止,则未对齐的信号始终会停止比较。

    默认情况下,当基线信号和比较信号都具有单位时,仿真数据检查器会比较对齐信号的单位。如果您将比较配置为在遇到第一次不匹配时停止,则不匹配的单位会停止比较。要忽略信号单位的不匹配,请指定 Units="Ignore"

    您可以指定额外的名称-值参量来配置比较,以检查是否存在额外元数据(如信号数据类型、开始和停止时间以及时间向量)的不匹配,并在第一次遇到该不匹配时停止。

  • "Any" - 对齐信号的元数据或信号数据不匹配会停止比较。

是否计算多维信号中每个通道的比较结果,指定为逻辑值 true (1) 或 false (0)。

  • true1 - 比较将表示为具有非标量采样值的单个信号的多维信号扩展为一组具有标量采样值的信号,并计算每个信号的比较结果。

    该多维信号在仿真数据检查器中仍将表示为含非标量采样值的单个信号,这并不会有所改变。

  • false0 - 比较不计算表示为具有非标量采样值的单个信号的多维信号的结果。

输出参量

全部折叠

比较结果,以 Simulink.sdi.DiffRunResult 对象形式返回。

限制

仿真数据检查器不支持比较以下项:

  • int64uint64 数据类型的信号

  • 可变大小信号

版本历史记录

在 R2011b 中推出