![]() |
![]() ![]() ![]() ![]() ![]() |
![]() |
The Lanczos ApproximationBoost , Math Toolkit 2.5.0 , Chapter 17. Backgrounders
|
![]() |
Note |
---|---|
Некоторые авторы определяют сумму от k=1 до N и, следовательно, получают коэффициенты N+1. Это приводит к путанице как следующего обсуждения, так и кода (поскольку C++ имеет дело с полуоткрытыми диапазонами массивов, а не с закрытым диапазоном суммы). Это соглашение согласуется сГодфри, но не сПью, поэтому будьте осторожны, когда ссылаетесь на литературу в этой области. |
Коэффициенты C0..CN-1 необходимо вычислить изNиgс высокой точностью, а затем сохранить как часть программы. Расчет коэффициентов производится методомГодфри; пусть константы содержатся в векторе столбца Р, тогда:
P = D B C F
где B - матрица NxN:
D - матрица NxN:
C - матрица NxN:
и F - вектор столбца элемента N:
Обратите внимание, что матрицы B, D и C содержат все целые термины и зависят только отN, этот продукт следует вычислить сначала, а затем умножить наFв качестве последнего шага.
Хитрость состоит в том, чтобы выбратьNиg, чтобы дать желаемый уровень точности: выбор небольшого значения дляgприводит к строго конвергентному ряду, но тот, который сходится только медленно. Выбор большего значениягприводит к тому, что термины серии являются большими и/или расходящиеся примерно для первыхг-1терминов, а затем внезапно сходятся с «сжатием».
Пьюопределил оптимальное значениегдляNв диапазоне1<= N<= 60: к сожалению, на практике выбор этих значений приводит к ошибкам отмены в сумме Ланчоса, так как наибольший срок в (переменный) ряд примерно в 1000 раз больше результата. Эти оптимальные значения, по-видимому, не будут полезны на практике, если оценка не может быть выполнена с помощью ряда защитных цифри, коэффициенты хранятся с более высокой точностью, чем это требуется в результате. Эти значения лучше всего зарезервировать для, скажем, вычислений с плавающей точностью с двойной точностью арифметики.
Table 17.1. Optimal choices for N and g when computing with guard digits (source: Pugh)
Значение и размер |
N |
г |
Макс Ошибка |
---|---|---|---|
24 |
6 |
5.581 |
9.51e-12 |
53 |
13 |
13.144565 |
9.2213e-23 |
Альтернативой, описаннойГодфри, является выполнение исчерпывающего поискаNиgпространства параметров для определения оптимальной комбинации для данногоpцифрового типа с плавающей точкой. Повторение этой работы нашло хорошее приближение для двухточной арифметики (близко к найденномуГодфри), но не нашло действительно хороших приближений для 80 или 128-битных длинных двойников. Кроме того, было отмечено, что полученные приближения имеют тенденцию к оптимизации для малых значений z (1< z< 200), используемых для проверки реализации против факториалов. Было отмечено, что вычислительные соотношения гамма-функций с большими аргументами страдают от ошибок, возникающих в результате усечения ряда Ланкозо.
Пьюопределил все места, где теоретическая ошибка приближения была минимальной, но, к сожалению, опубликовал только самое большое из этих минимумов. Тем не менее, он делает замечание, что минимумы близко совпадают с местом, где первый забытый термин (aN) в серии Ланчоса Sg(z) меняет знак. Эти места довольно легко найти, хотя и со значительным компьютерным временем. Эти «сладкие пятна» нужно вычислить только один раз, свести в таблицу, а затем искать, когда это необходимо для приближения, которое обеспечивает требуемую точность для некоторого фиксированного типа точности.
К сожалению, следуя этому пути, не удалось найти действительно хорошее приближение для 128-битных длинных двойников, а для 64-битных и 80-битных реалов потребовалось чрезмерное количество терминов. Здесь есть две конкурирующие проблемы: высокая точность требует большого значенияг, но для избежания ошибок отмены в оценке требуется небольшоег.
На этом этапе отметим, что сумма Ланчоса может быть преобразована в рациональную форму (соотношение двух полиномов, полученное из формы частичного дробления с использованием полиномиальной арифметики), и при этом изменяет коэффициенты так, чтовсе они являются положительными. Это означает, что сумма в рациональной форме может быть оценена без ошибки отмены, хотя и с удвоением числа коэффициентов для данного N. Повторяя поиск «сладких пятен», на этот раз оценивая сумму Ланчоса в рациональной форме, и испытывая только те «сладкие пятна», теоретическая ошибка которых меньше, чем у машинного эпсилона для тестируемого типа, давала хорошие приближения для всех тестируемых типов. Оптимальные найденные значения были довольно близки к лучшим случаям, сообщаемымPugh(просто немного большеNи немного меньшеgдля заданной точности, чемPughотчетов), и хотя преобразование в рациональную форму удваивает количество хранимых коэффициентов, следует отметить, что половина из них являются целыми числами (и, следовательно, требуют меньше места для хранения), и приближения требуют меньшегоN, чем в противном случае требовалось бы, поэтому в целом может потребоваться меньше операций с плавающей точкой.
В следующей таблице показаны оптимальные значения дляNиgпри вычислении с фиксированной точностью. Они должны приниматься за работу в процессе: нет значений для 106-битных знаковых и машин (Darwin long doubles & NTL quad_float), и возможна дальнейшая оптимизация значенийг. Ошибки, приведенные в таблице, являются оценками ошибки, обусловленной усечением бесконечного ряда Ланчоса доNтерминов. Они вычисляются из суммы первых пяти забытых терминов - и, как известно, являются довольно пессимистическими оценками - хотя заметно, что лучшие комбинацииNиgпроизошли, когда предполагаемая ошибка усечения почти точно соответствует эпсилону машины для рассматриваемого типа.
Table 17.2. Optimum value for N and g when computing at fixed precision
Значение и размер |
Используемая платформа/компилятор |
N |
г |
Ошибка Max Truncation |
---|---|---|---|---|
24 |
Win32, VC++ 7.1 |
6 |
1.428456135094165802001953125 |
9.41e-007 |
53 |
Win32, VC++ 7.1 |
13 |
6.024680040776729583740234375 |
3.23e-016 |
64 |
Использование Linux 9 IA64, gcc-3.3.3 |
17 |
12.2252227365970611572265625 |
2.34e-024 |
116 |
HP Tru64 Unix 5.1B / Alpha, Compaq C++ V7.1-006 |
24 |
20.3209821879863739013671875 |
4.75e-035 |
Наконец, обратите внимание, что приближение Ланчоса можно записать следующим образом, удалив коэффициент exp(g) из знаменателя, а затем разделив все коэффициенты на exp(g):
Эта форма более удобна для вычисления lgamma, но для гамма-функции деление наeпревращает возможно точное качество в неточное значение: это снижает точность в общем случае, когда вход точен, и поэтому не используется для гамма-функции.
Статья The Lanczos Approximation раздела Math Toolkit 2.5.0 Chapter 17. Backgrounders может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.
:: Главная :: Chapter 17. Backgrounders ::
реклама |