exponenta event banner

класс 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