Каталог libs/math/minimax содержит программу командной строки для генерации приближений minimax с использованием алгоритма Remez. Поддерживаются как полиномиальные, так и рациональные приближения, хотя последние сложно сходятся: нередко конвергенция рациональных форм терпит неудачу. Нет таких ограничений для полиномиальных приближений, которые всегда должны плавно сходиться.
Стоит подчеркнуть, что разработка рациональных приближений к функциям часто является непростой задачей, которой посвящены многие книги. Чтобы использовать этот инструмент, вам нужно будет иметь разумное представление о том, что такое алгоритм Ремеза и общая форма приближения, которую вы хотите достичь.
Если вы уже не знакомы с методом Ремеза, вы должны сначала прочитать краткую справочную статью, объясняющую принципы алгоритма Ремеза..
Программа состоит из двух частей:
main.cpp
Содержит парсер командной строки и все вызовы к коду Remez.
f.cpp
Содержит функцию приближения.
Поэтому, чтобы использовать этот инструмент, вы должны изменить f.cpp, чтобы вернуть функцию приблизительной. Инструменты поддерживают несколько приближений функций в одной и той же компилируемой программе: каждый в отдельном варианте:
NTL::RRf(constNTL::RR&x,intvariant);
возвращает значение функциивариантв точкех. Таким образом, если вы хотите, вы можете просто добавить функцию в качестве нового варианта после существующих примеров.
Обратите внимание, что функцияfдолжна возвращать рациональную часть аппроксимации: например, если вы аппроксимируете функциюf(x), то ее довольно часто используют:
f(x)=g(x)(Y+R(x))
гдеg(x)является доминирующей частьюf(x),Yявляется некоторой постоянной, аR(x)является частью рационального приближения, обычно оптимизированной для низкой абсолютной ошибки по сравнению с |Y |.
В этом случае вы определитеf, чтобы вернутьf(x)/g(x), а затем установите Y-набор приближения к.Y(см. варианты командной строки ниже).
Возможны многие другие формы, но во всех случаях цель состоит в том, чтобы разделитьf(x)в доминирующую часть, которую можно легко оценить, используя стандартные математические функции, и плавную и медленно меняющуюся часть рационального приближения. Обратитесь к своему любимому учебнику для получения дополнительных примеров.
Варианты командной строки для программы следующие:
variant N
Установите текущий вариант функции на N. Это позволяет скомпилировать несколько функций, которые должны быть приближены, в один и тот же исполняемый файл. По умолчанию 0.
range a b
Устанавливает домен для приближения к диапазону [a,b], по умолчанию к [0,1].
relative
Устанавливает код Remez для оптимизации относительной ошибки. Это дефолт при запуске программы. Относительная ошибка может быть использована только в том случае, если f(x) не имеет корней в оптимизированном диапазоне.
absolute
Устанавливает код Remez для оптимизации по абсолютной ошибке.
pin [true|false]
«Устанавливает» код так, что рациональное приближение проходит через происхождение. Очевидно, чтоистинно, если R(0) должен быть равен нулю. Это обычно используется при попытке сохранить корень при [0,0], а также для оптимизации относительной ошибки.
order N D
Устанавливает порядок приближения кNв числителе иDв знаменателе. ЕслиDравно нулю, то результатом будет полиномиальное приближение. Всего будут коэффициенты N+D+2, первый коэффициент числителя равен нулю, еслипинбыл установлен на истинность, а первый коэффициент знаменателя всегда один.
working-precision N
Устанавливает рабочую точность NTL::RR доNдвоичных цифр. Дефолты до 250.
target-precision N
Устанавливает точность печатного вывода наNдвоичных цифр: устанавливается на то же количество цифр, что и тип, который будет использоваться для оценки приближения. По умолчанию 53 (для двойной точности).
skew val
«Перемещает» начальные интерполированные контрольные точки в сторону одного конца или другого диапазона. Положительные значения искажают исходные контрольные точки в сторону левой стороны диапазона, а отрицательные — в сторону правой стороны. Если приближение не сходится (обычная ситуация), попробуйте отрегулировать параметр перекоса, пока первый шаг не даст наименьшую возможную ошибку.валдолжен находиться в диапазоне [-100,+100], по умолчанию равен нулю.
brake val
Устанавливает тормоз на каждом шаге так, чтобы изменение точек управления тормозилось навал%. По умолчанию 50, попробуйте более высокое значение, если приближение не сходится, или более низкое значение, чтобы получить более быструю конвергенцию.
x-offset val
Устанавливает x-оффсет наval: приближение будет генерироваться для<f(S*(x+X))+Y>, гдеXявляется x-оффсетом,Sявляется x-масштабом иYявляется y-оффсетом. Дефолты до нуля. Чтобы избежать ошибок округления, позаботьтесь о том, чтобы указать значение, которое может быть точно представлено как число с плавающей точкой.
x-scale val
Устанавливает x-шкалу навал: приближение будет генерироваться для<f(S*(x+X))+Y>, гдеSявляется x-шкалой,Xявляется x-оффсетом, аYявляется y-оффсетом. По умолчанию один. Чтобы избежать ошибок округления, позаботьтесь о том, чтобы указать значение, которое может быть точно представлено как число с плавающей точкой.
y-offset val
Устанавливает y-оффсет навал:<f(S*(x+X))+Y>, гдеXявляется x-offset,Sявляется x-scale иYявляется y-offset. Дефолты до нуля. Чтобы избежать ошибок округления, позаботьтесь о том, чтобы указать значение, которое может быть точно представлено как число с плавающей точкой.
y-offset auto
Устанавливает y-оффсет на среднее значение f(x), оцениваемое в двух конечных точках диапазона плюс среднюю точку диапазона. Расчетное значение намеренно усечено допоплавкаточности (и должно храниться какпоплавкав вашем коде). Приближение будет сгенерировано для<f(x+X)+Y>, гдеXявляется x-offset иYявляется y-offset. Дефолты до нуля.
graph N
Печатает N оценок f(x) в равномерно распределенных точках в оптимизированном диапазоне. Если не указано, тоNпо умолчанию 3. Используйте, чтобы проверить, что f(x) действительно плавно в диапазоне интересов.
step N
ВыполняетNшаги, или один шаг, еслиNне указан. После каждого шага печатается: ошибка заглядывания на крайность функции ошибки аппроксимации, теоретический термин ошибки, решаемый для последнего шага, и максимальное относительное изменение местоположения контрольных точек Чебышева. Приближение сходится на решении minimax, когда два условия ошибки (приблизительно) равны, а изменение контрольных точек уменьшилось до достаточно малого значения.
test [float|double|long]
Тестирует текущее приближение с плавающей, двойной или длинной двойной точностью. Полезно проверять ошибки округления при оценке приближения с фиксированной точностью. Испытания проводятся на экстремуме функции ошибки приближения и на нулях функции ошибки.
test [float|double|long] N
Тестирует текущее приближение с плавающей, двойной или длинной двойной точностью. Полезно проверять ошибки округления при оценке приближения с фиксированной точностью. Испытания проводятся в N равномерно расположенных точках в диапазоне приближения. Если ни один из [float |double |long] не указан, то тесты с использованием NTL::RR могут быть использованы для получения функции ошибки приближения.
rescale a b
Берет текущие контрольные точки Чебешева и перемасштабирует их за новый интервал [a,b]. Иногда это может быть использовано для получения начальных контрольных точек для приближения, которое иначе не может быть конвергентным.
rotate
Переносит один термин из числителя в знаменатель, но сохраняет контрольные точки Чебышева прежними. Иногда это может быть использовано для получения начальных контрольных точек для приближения, которое иначе не может быть конвергентным.
info
Распечатывает текущее приближение: расположение нулей функции ошибки, расположение контрольных точек Чебышева, смещения x и y и, конечно, коэффициенты полиномов.
Статья Minimax Approximations and the Remez Algorithm раздела Math Toolkit 2.5.0 Internal tools может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.