Политика численных граничных случаев¶
Статус¶
Реализованный контракт v2. Задача #64 установила политику, задача #66 устранила устаревающее состояние центроида, вычисленное при создании объекта, а задачи #79 и #80 реализовали аналитическую и адаптивную стратегию центроида, явную точность, ошибку сходимости и поведение при нулевой площади.
Допуски¶
Глобальный epsilon не допускается. У каждой операции есть явный численный контракт:
- алгебраические тождества функций принадлежности и нечётких операторов используют точный результат, когда формула точна в двоичной арифметике с плавающей точкой; иначе задаются абсолютный и относительный допуски конкретного теста;
- операции поиска корня или обращения функции принадлежности объявляют критерий остановки, предельный объём работы и границу невязки;
- численное интегрирование объявляет целевую абсолютную и относительную погрешность, адаптивный критерий остановки и детерминированный способ сообщения о неудаче.
Вырожденные входные данные¶
Конфигурация функции принадлежности недопустима, если необходимые ширины или упорядоченные опорные точки вырождены. Конструктор должен выбросить ValueError до вычисления, не полагаясь на деление на ноль, нулевой результат или последующий сбой кэша.
Центроидная дефаззификация не определена, если площадь под функцией принадлежности
на объявленной области интегрирования равна нулю. Требуется ValueError (современный
UndefinedResultError сохраняет этот контракт перехвата); запрещено возвращать середину
интервала, ноль, NaN, бесконечность или ранее кэшированное значение.
Точность интегрирования — настройка алгоритма, принадлежащая методу интегрирования. Она не является изменяемым параметром конфигурации функции принадлежности; фиксированное число точек само по себе не обосновывает корректность.
Проверяемые свидетельства¶
Тесты в tests/test_numerical_edge_policy.py и tests/test_defuzzification.py
проверяют реализованное поведение. Исторический метод правых прямоугольников
на 1000 точках сохранён только как независимо воспроизведённая база сравнения в задаче #78.