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

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

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

Описание

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

Конструкция

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