Для справки, вот еще несколько приближений, перечисленных примерно в
увеличение порядка сложности и точности. Все они предполагают, что 0 ≤ a ≤ b.
h = b + 0.337 * a // max error ≈ 5.5 %
h = max(b, 0.918 * (b + (a>>1))) // max error ≈ 2.6 %
h = b + 0.428 * a * a / b // max error ≈ 1.04 %
Редактировать : чтобы ответить на вопрос Экира Ханы, вот как я получил эти
приближения.
Первый шаг . Аппроксимация функции двух переменных может быть
сложная проблема. Таким образом, я сначала превратил это в проблему
аппроксимирует функцию переменной one . Это можно сделать, выбрав
самая длинная сторона в качестве «масштабного» фактора, а именно:
ч = √ (б 2 + а 2 )
= b √ (1 + (a / b) 2 )
= b f (a / b) где f (x) = √ (1 + x 2 )
Добавление ограничения 0 ≤ a ≤ b означает, что нас интересует только
аппроксимируя f (x) в интервале [0, 1].
Ниже приведен график зависимости f (x) в соответствующем интервале вместе с
приближение, данное Мэтью Слэттери (а именно (√2−1) x + 1).
Второй шаг . Следующим шагом будет посмотреть на этот сюжет, спрашивая
Задайте себе вопрос «как я могу приблизить эту функцию дешево?».
Поскольку кривая выглядит примерно параболично, моей первой идеей было использовать
квадратичная функция (третье приближение). Но так как это все еще
относительно дорогой, я также смотрел на линейный и кусочно-линейный
приближения. Вот мои три решения:
Числовые константы (0,337, 0,918 и 0,428) изначально были свободны
параметры. Конкретные значения были выбраны для минимизации
максимальная абсолютная погрешность приближений. Минимизация могла
конечно, можно сделать по какому-то алгоритму, но я просто сделал это «вручную»,
построение абсолютной ошибки и настройка постоянной, пока она не станет
сведено к минимуму. На практике это работает довольно быстро. Написание кода для
автоматизировать это заняло бы больше времени.
Третий шаг - вернуться к первоначальной проблеме аппроксимации
функция двух переменных:
- h ≈ b (1 + 0,337 (a / b)) = b + 0,337 a
- h ≈ b max (1, 0,918 (1 + (a / b) / 2)) = max (b, 0,918 (b + a / 2))
- ч ≈ b (1 + 0,428 (a / b) 2 ) = b + 0,428 a 2 / b