matlab.unittest.constraints.RelativeTolerance class

Пакет: matlab.unittest.constraints
Суперклассы: matlab.unittest.constraints.Tolerance

Относительный числовой допуск

Описание

Это числовое Tolerance оценивает величину различия между фактическими и ожидаемыми значениями относительно ожидаемого значения. Чтобы допуск был удовлетворен, abs(expVal - actVal) <= relTol.*abs(expVal) должно быть true.

Конструкция

RelativeTolerance(tolVals) создает объект относительной погрешности, который оценивает величину различия между фактическими и ожидаемыми значениями относительно ожидаемого значения.

Типы данных входов в RelativeTolerance конструктор определяет, какие типы данных поддерживает допуск. Для примера, RelativeTolerance(10*eps) создает RelativeTolerance для сравнения числовых массивов с двойной точностью во время RelativeTolerance(single(2)) создает RelativeTolerance для сравнения числовых массивов с одной точностью. Если сравниваемые фактическое и ожидаемые значения содержат более одного типы числовых данных, допуск применяется только к типам данных, заданным значениями, переданными в конструктор.

Чтобы задать различные значения допуска для различных типов данных, можно передать конструктору несколько значений допуска. Для примера, RelativeTolerance(10*eps, 10*eps('single')) создает RelativeTolerance при этом применяются следующие абсолютные погрешности:

  • 10*eps применяет относительную погрешность 10*eps для числовых массивов с двойной точностью.

  • 10*eps('single') применяет относительную погрешность 10*eps для числовых массивов с одной точностью.

Можно задать несколько допусков для определенного типа данных путем объединения допусков с & и | операторы. Чтобы объединить два допуска, размеры значений допусков для каждого типа данных должны быть совместимыми.

Входные параметры

tolVals

Числовые допуски, заданные как разделенный запятыми список массивов, содержащих числа с плавающей запятой. Каждый входной параметр содержит спецификацию допуска для определенного типа данных. Каждый числовой массив может быть скаляром или массивом того же размера, что и фактическое и ожидаемые значения.

Свойства

Values

Числовые допуски, заданные tolVals входной параметр

Копировать семантику

Значение. Чтобы узнать, как классы значений влияют на операции копирования, см. раздел «Копирование объектов».

Примеры

свернуть все

Создайте тест для интерактивных проверок.

import matlab.unittest.TestCase
import matlab.unittest.constraints.IsEqualTo
import matlab.unittest.constraints.RelativeTolerance

testCase = TestCase.forInteractiveUse;

Утверждайте, что различие между фактическим значением, 4.1и ожидаемое значение, 4.5, меньше 10%.

testCase.assertThat(4.1, IsEqualTo(4.5, ...
    'Within', RelativeTolerance(0.1)))
Assertion passed.

Создайте тест для интерактивных проверок.

import matlab.unittest.TestCase
import matlab.unittest.constraints.IsEqualTo
import matlab.unittest.constraints.RelativeTolerance

testCase = TestCase.forInteractiveUse;

Создайте следующие фактические и ожидаемые массивы ячеек.

act = {'abc', 123, single(106)};
exp = {'abc', 122, single(105)};

Проверяйте, что массивы удовлетворяют RelativeTolerance ограничение внутри 2%.

testCase.verifyThat(act, IsEqualTo(exp, ...
    'Within', RelativeTolerance(0.02)))
Verification failed.

---------------------
Framework Diagnostic:
---------------------
IsEqualTo failed.
--> Path to failure: <Value>{3}
    --> NumericComparator failed.
        --> The numeric values are not equal using "isequaln".
        --> The tolerance was ignored. The tolerance as specified does not support comparisons of single values.
        --> Failure table:
                    Actual    Expected    Error    RelativeError
                    ______    ________    _____    _____________
                
                    106       105         1        0.00952381   
        
        Actual single:
               106
        Expected single:
               105

Actual cell:
        'abc'    [123]    [106]
Expected cell:
        'abc'    [122]    [105]

Тест не пройден, потому что допуск применяется только к double тип данных.

Создайте объект допуска, который задает различные допуски для различных типов данных.

tolObj = RelativeTolerance(0.02, single(0.02));

Допуск на 2% применяется к double и single оцененные данные.

Проверьте, что ожидаемое и фактические значения удовлетворяют RelativeTolerance ограничение.

testCase.verifyThat(act, IsEqualTo(exp, 'Within', tolObj))
Verification passed.

Создайте тест для интерактивных проверок.

import matlab.unittest.TestCase
import matlab.unittest.constraints.IsEqualTo
import matlab.unittest.constraints.AbsoluteTolerance
import matlab.unittest.constraints.RelativeTolerance

testCase = TestCase.forInteractiveUse;

Задайте фактическое значение приближения для pi.

act = 3.14;

Создайте объект допуска, чтобы проверить, что различие между фактическим и ожидаемым значениями находится в пределах 0.001 и внутри 0.25%.

tolObj = AbsoluteTolerance(0.001) & RelativeTolerance(0.0025);

Проверьте, что фактическое значение находится в допуске от ожидаемого значения pi.

testCase.verifyThat(act, IsEqualTo(pi, 'Within', tolObj))
Verification failed.

---------------------
Framework Diagnostic:
---------------------
IsEqualTo failed.
--> NumericComparator failed.
    --> The numeric values are not equal using "isequaln".
    --> AndTolerance failed.
        --> AbsoluteTolerance failed.
            --> The error was not within absolute tolerance.
        --> RelativeTolerance passed.
            --> The error was within relative tolerance.
        --> Failure table:
                    Actual        Expected               Error                RelativeError        AbsoluteTolerance    RelativeTolerance
                    ______    ________________    ____________________    _____________________    _________________    _________________
                
                    3.14      3.14159265358979    -0.00159265358979299    -0.000506957382897213    0.001                0.0025           
    
    Actual double:
           3.140000000000000
    Expected double:
           3.141592653589793

Фактическое значение не удовлетворяет AbsoluteTolerance ограничение.

Создайте ограничение, которое будет выполнено, если значения находятся внутри 0.001 или 0.25%, а затем повторите проверку фактического значения.

tolObj = AbsoluteTolerance(0.001) | RelativeTolerance(0.0025);
testCase.verifyThat(act, IsEqualTo(pi, 'Within', tolObj))
Verification passed.

Объедините допуски, так что, когда вы проверяете равенство значений, абсолютный (этаж) допуск доминирует, когда значения близки к нулю, и относительная погрешность доминирует для больших значений.

Создайте тест для интерактивных проверок.

import matlab.unittest.TestCase
import matlab.unittest.constraints.IsEqualTo
import matlab.unittest.constraints.AbsoluteTolerance
import matlab.unittest.constraints.RelativeTolerance

testCase = TestCase.forInteractiveUse;

Задайте две структуры, содержащие электромагнитные свойства вакуума. Одна структура, approxVacuumProps, содержит приблизительные значения проницаемости и скорости света в вакууме.

approxVacuumProps.Permeability = 1.2566e-06; % Approximate
approxVacuumProps.Permitivity = 8.854187817*10^-12;
approxVacuumProps.LightSpeed = 2.9979e+08; % Approximate

baselineVacuumProps.Permeability = 4*pi*10^-7;
baselineVacuumProps.Permitivity = 8.854187817*10^-12;
baselineVacuumProps.LightSpeed = 1/sqrt(...
    baselineVacuumProps.Permeability*baselineVacuumProps.Permitivity);

Проверяйте, что относительное различие между приблизительным и базовым значениями находится внутри eps*1e11.

testCase.verifyThat(approxVacuumProps, IsEqualTo(baselineVacuumProps, ...
    'Within', RelativeTolerance(eps*1e11)))
Verification failed.

---------------------
Framework Diagnostic:
---------------------
IsEqualTo failed.
--> Path to failure: <Value>.Permeability
    --> NumericComparator failed.
        --> The numeric values are not equal using "isequaln".
        --> RelativeTolerance failed.
            --> The error was not within relative tolerance.
            --> Failure table:
                          Actual            Expected                  Error                RelativeError         RelativeTolerance  
                        __________    ____________________    _____________________    _____________________    ____________________
                    
                        1.2566e-06    1.25663706143592e-06    -3.70614359173257e-11    -2.94925536216295e-05    2.22044604925031e-05
        
        Actual double:
                 1.256600000000000e-06
        Expected double:
                 1.256637061435917e-06

Actual struct:
        Permeability: 1.256600000000000e-06
         Permitivity: 8.854187816999999e-12
          LightSpeed: 299790000
Expected struct:
        Permeability: 1.256637061435917e-06
         Permitivity: 8.854187816999999e-12
          LightSpeed: 2.997924580105029e+08

Тест завершается неудачно, потому что относительное различие в проницаемости не входит в допуск. Различия между этими двумя значениями небольшая, но числа близки к нулю, поэтому различия относительно их размера недостаточно малы, чтобы удовлетворить допуску.

Создайте объект допуска, чтобы проверить, что абсолютное различие между приблизительными и базовыми значениями находится внутри 1e-4.

testCase.verifyThat(approxVacuumProps, IsEqualTo(baselineVacuumProps, ...
    'Within', AbsoluteTolerance(1e-4)))
Verification failed.

---------------------
Framework Diagnostic:
---------------------
IsEqualTo failed.
--> Path to failure: <Value>.LightSpeed
    --> NumericComparator failed.
        --> The numeric values are not equal using "isequaln".
        --> AbsoluteTolerance failed.
            --> The error was not within absolute tolerance.
            --> Failure table:
                         Actual          Expected              Error             RelativeError        AbsoluteTolerance
                        _________    ________________    _________________    ____________________    _________________
                    
                        299790000    299792458.010503    -2458.01050287485    -8.1990404935028e-06    0.0001           
        
        Actual double:
               299790000
        Expected double:
                 2.997924580105029e+08

Actual struct:
        Permeability: 1.256600000000000e-06
         Permitivity: 8.854187816999999e-12
          LightSpeed: 299790000
Expected struct:
        Permeability: 1.256637061435917e-06
         Permitivity: 8.854187816999999e-12
          LightSpeed: 2.997924580105029e+08

Тест не проходит, потому что абсолютное различие в скорости света не входит в допуск. Различие между этими двумя значениями является маленькой относительно их размера, но слишком большой, чтобы удовлетворить допуску.

Создайте логическое смещение объектов допуска, чтобы проверить, что абсолютное различие между приблизительным и базовым значениями находится внутри 1e-4 или относительное различие внутри eps*1e11. Тест использует этот допуск, поэтому значения проницаемости, которые близки к нулю, удовлетворяют абсолютному (полу) допуску, а скорость значений света, которые являются большими, удовлетворяют относительной погрешности.

testCase.verifyThat(approxVacuumProps, IsEqualTo(baselineVacuumProps, ...
    'Within', RelativeTolerance(eps*1e11)| AbsoluteTolerance(1e-4)))
Verification passed.
Введенный в R2013a