matlab.unittest.constraints. Класс AbsoluteTolerance

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

Абсолютный числовой допуск

Описание

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

Конструкция

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

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

Чтобы задать различные значения допуска для различных типов данных, можно передать несколько значений допуска конструктору. Например, построения AbsoluteTolerance(10*eps, 10*eps('single'), int8(1)) объект AbsoluteTolerance применяют следующие абсолютные допуски:

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

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

  • int8(1) применяет абсолютный допуск 1 для числовых массивов типа int8.

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

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

tolVals

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

Свойства

Values

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

Примеры

свернуть все

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

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

testCase = TestCase.forInteractiveUse;

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

testCase.assertThat(4.1, IsEqualTo(4.5, ...
    'Within', AbsoluteTolerance(0.5)))
Assertion passed.

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

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

testCase = TestCase.forInteractiveUse;

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

act = {'abc', 123, single(106), int8([1, 2, 3])};
exp = {'abc', 122, single(105), int8([2, 4, 6])};

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

testCase.verifyThat(act, IsEqualTo(exp, ...
    'Within', AbsoluteTolerance(2)))
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]    [1×3 int8]
Expected cell:
        'abc'    [122]    [105]    [1×3 int8]

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

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

tolObj = AbsoluteTolerance(2, single(3), int8([2, 3, 5]));

Допуск 2 является примененным, double оценил данные. Допуск 3 применяется к оцененным данным single. Допуск [2 3 5] применяется к соответствующим элементам массива оцененных данных int8.

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

testCase.verifyThat(act, IsEqualTo(exp, 'Within', tolObj))
Interactive 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

Для просмотра документации необходимо авторизоваться на сайте