![]() |
![]() ![]() ![]() ![]() ![]() |
![]() |
Bessel Functions of the First and Second KindsBoost , Math Toolkit 2.5.0 , Bessel Functions
|
Microsoft Visual C++ версия 12.0 |
GNU C++ версия 5.1.0 |
GNU C++ версия 5.1.0 |
Солнечный компилятор версии 0x5130 |
|
---|---|---|---|---|
Bessel J0: Mathworld Data (целая версия) |
Макс = 2,52ε (Средний = 1,2ε) |
Max = 6.55ε (Mean = 2.89ε) |
Max = 0ε (Mean = 0ε) |
Макс = 6.55ε (Средний = 2.86ε) |
Bessel J0: Mathworld Data (Tricky cases) (целая версия) |
Max = 1e+007ε (Mean = 4.09e+006ε) |
Макс = 1,63e+08ε (Средний = 6,67e+07ε) |
Макс = 7.98e+04ε (Средний = 3.26e+04ε) |
Макс = 1,64e+08ε (Средний = 6,69e+07ε) |
Бессел J1: Mathworld Data (целая версия) |
Макс = 1,73ε (Средний = 0,976ε) |
Max = 2.66ε (Mean = 1.38ε) |
Макс = 0ε (Mean = 0ε) |
Макс = 1,44ε (Средний = 0,637ε) |
Bessel J1: Mathworld Data (неудобные случаи) (целая версия) |
Макс = 3,23e+004ε (Средний = 1,45e+004ε) |
Макс = 2.18e+05ε (Средний = 9.76e+04ε) |
Макс = 106ε (Mean = 47.5ε) |
Макс = 2,18e+05ε (Средний = 9,76e+04ε) |
Бессель JN: Mathworld Data (целая версия) |
Макс = 14,7ε (Mean = 5,4ε) |
Max = 6.85ε (Mean = 3.41ε) |
Max = 0ε (Mean = 0ε) |
Макс = 463ε (Средний = 112ε) |
Table 6.41. Error rates for cyl_bessel_j
Microsoft Visual C++ версия 12.0 |
GNU C++ версия 5.1.0 |
GNU C++ версия 5.1.0 |
Солнечный компилятор версии 0x5130 |
|
---|---|---|---|---|
Бессел J0: Mathworld Data |
Макс = 2,52ε (Средний = 1,2ε) |
Макс = 6.55ε (Средний = 2.89ε) |
Макс = 0ε (Mean = 0ε) |
Макс = 6.55ε (Средний = 2.86ε) |
Бессел J0: Mathworld Data |
Макс = 1e+007ε (Средний = 4.09e+006ε) |
Макс = 1,63e+08ε (Средний = 6,67e+07ε) |
Макс = 7.98e+04ε (Mean = 3.26e+04ε) Цефес:Макс = 2,54e+08ε (Mean = 1.04e+08ε] |
Макс = 1,64e+08ε (Средний = 6,69e+07ε) |
Бессел J1: Mathworld Data |
Макс = 1,73ε (Средний = 0,976ε) |
Max = 2.66ε (Mean = 1.38ε) |
Макс = 0ε (Mean = 0ε) |
Макс = 1,44ε (Средний = 0,637ε) |
Bessel J1: Mathworld Data (неудобные случаи) (целая версия) |
Макс = 3,23e+004ε (Средний = 1,45e+004ε) |
Макс = 2.18e+05ε (Средний = 9.76e+04ε) |
Макс = 106ε (Mean = 47.5ε) |
Макс = 2,18e+05ε (Средний = 9,76e+04ε) |
Бессел JN: Mathworld Data |
Макс = 14,7ε (Средний = 5,4ε) |
Max = 6.85ε (Mean = 3.41ε) |
Макс = 0ε (Mean = 0ε) |
Макс = 463ε (Средний = 112ε) |
Бессел Дж: Данные математического мира |
Макс = 14,9ε (Средний = 3,82ε) |
Макс = 14,7ε (Mean = 4.05ε) |
Max = 10ε (Mean = 2.19ε) |
Макс = 14,7ε (Средний = 4,12ε) |
Бессель Дж: Данные математического мира (большие значения) |
Макс = 9.31ε (Средний = 5.52ε) |
Max = 607ε (Mean = 305ε) |
Max = 0,536ε (Mean = 0,268ε) |
Макс = 607ε (Средний = 305ε) |
Бессел JN: Случайные данные |
Макс = 17.5ε (Средний = 1,46ε) |
Макс = 50.8ε (Средний = 4.15ε) |
Макс = 0ε (Mean = 0ε) |
Макс = 99,6ε (Средний = 22ε) |
Бессель Дж: Случайные данные |
Макс = 9.24ε (Средний = 1.36ε) |
Max = 9.81ε (Mean = 1.59ε) |
Макс = 0ε (Mean = 0ε) |
Макс = 260ε (Средний = 34ε) |
Бессель Дж. Данные (Tricky big values) |
Макс = 59,2ε (Средний = 8,67ε) |
Макс = 785ε (Mean = 94.2ε) |
Макс = 0ε (Mean = 0ε) |
Макс = 785ε (Средний = 97,4ε) |
Table 6.42. Error rates for cyl_neumann (integer orders)
Microsoft Visual C++ версия 12.0 |
GNU C++ версия 5.1.0 |
GNU C++ версия 5.1.0 |
Солнечный компилятор версии 0x5130 |
|
---|---|---|---|---|
Y0: Mathworld Data (целая версия) |
Max = 4.61ε (Mean = 2.29ε) |
Макс = 0ε (Mean = 0ε) |
Макс = 5.59ε (Mean = 2.54ε) |
Макс = 5.53ε (Средний = 2.4ε) |
Y1: Mathworld Data (целая версия) |
Макс = 4,75ε (Средний = 1,72ε) |
Макс = 0ε (Mean = 0ε) |
Макс = 12,7ε (Mean = 4,34ε) |
Макс = 6.33ε (Средний = 2,29ε) |
Yn: Mathworld Data (целая версия) |
Max = 35ε (Mean = 11.8ε) |
Макс = 0.993ε (Средний = 0.314ε) |
Max = 55.2ε (Mean = 17.7ε) |
Макс = 55.2ε (Средний = 17.8ε) |
Table 6.43. Error rates for cyl_neumann
Microsoft Visual C++ версия 12.0 |
GNU C++ версия 5.1.0 |
GNU C++ версия 5.1.0 |
Солнечный компилятор версии 0x5130 |
|
---|---|---|---|---|
Y0: Mathworld Data |
Макс = 4.61ε (Средний = 2,29ε) |
Макс = 0ε (Mean = 0ε) |
Макс = 5.59ε (Mean = 2.54ε) |
Макс = 5.53ε (Средний = 2.4ε) |
Y1: Mathworld Data |
Макс = 4,75ε (Средний = 1,72ε) |
Макс = 0ε (Mean = 0ε) |
Макс = 12,7ε (Mean = 4,34ε) |
Макс = 6.33ε (Средний = 2,29ε) |
Yn: Mathworld Data |
Макс = 35ε (Средний = 11.8ε) |
Max = 0.993ε (Mean = 0.314ε) |
Max = 55.2ε (Mean = 17.7ε) |
Макс = 55.2ε (Средний = 17.8ε) |
Yv: Mathworld Data |
Макс = 7.89ε (Средний = 3.27ε) |
Max = 10ε (Mean = 3.02ε) |
Max = 10,7ε (Mean = 4,92ε) |
Макс = 10,7ε (Средний = 5,1ε) |
Yv: Mathworld Data (большие значения) |
Макс = 0,682ε (Средний = 0,35ε) |
Макс = 0ε (Mean = 0ε) |
Макс = 1.57ε (Mean = 1.17ε) |
Макс = 1.57ε (Средний = 1.24ε) |
Y0 и Y1: Случайные данные |
Макс = 4.17ε (Средний = 1.24ε) |
Макс = 0ε (Mean = 0ε) |
Макс = 11.8ε (Средний = 3.28ε) |
Макс = 10,8ε (Средний = 3,04ε) |
Yn: Случайные данные |
Макс = 117ε (Средний = 10.2ε) |
Макс = 0ε (Mean = 0ε) |
Max = 338ε (Mean = 28.2ε) |
Макс = 338ε (Средний = 27,5ε) |
Yv: Случайные данные |
Макс = 1.23e+003ε (Средний = 69.9ε) |
Макс = 1,53ε (Средний = 0,102ε) |
Макс = 2.08e+03ε (Mean = 149ε) |
Макс = 2.08e+03ε (Средний = 149ε) |
Обратите внимание, что для большиххэти функции во многом зависят от точности функций<std::sin
>и<std::cos
>.
Сравнение с GSL иCephesинтересно: какCephes, так и эта библиотека оптимизируют случай целого порядка — приводя к идентичным результатам — просто используя общий случай, по большей части немного более точный, хотя, как отмечено лучшей точностью GSL в случаях целых аргументов. Эта реализация, как правило, работает намного лучше, когда аргументы становятся большими,Цефес, в частности, дает некоторые удивительно неточные результаты с некоторыми тестовыми данными (без существенных правильных цифр), и даже GSL работает плохо с некоторыми входами в Jv. Обратите внимание, что при двойной проверке этих результатов были пересчитаны наихудшие показателиЦефеси случаи GSL с использованием функций.wolfram.com, и результат был проверен на основе наших тестовых данных: ошибок в тестовых данных обнаружено не было.
Реализация в основном заключается в отфильтровке различных особых случаев:
Еслиxявляется отрицательным, то порядокvдолжен быть целым числом или результатом является ошибка домена. Если порядок является целым числом, то функция является нечетной для нечетных ордеров и даже для четных ордеров, поэтому мы отражаем вx >0.
Если порядокvотрицательный, то формулы отражения можно использовать для перехода кv >0:
Обратите внимание, что если порядок является целым числом, то эти формулы сводятся к:
J-n= (-1)nJn
Y-n= (-1)nYn
Однако в целом отрицательный порядок подразумевает, что нам нужно будет вычислить и J, и Y.
Когдаxявляется большим по сравнению с порядкомv, то используются асимптотические расширения для большихxв М. Абрамовице и И. А. Стегуне,9.2.19 (они оказались более надежными, чем те, что в A&S 9.2.5).
Когда порядокvявляется целым числом, способ сначала связывает результат с J0, J1, Y0и #160; и Y1и #160; используя либо прямое, либо обратное повторение (алгоритм Миллера) в зависимости от того, какой из них стабилен. Значения для J0, J1, Y0& #160; и Y1& #160; вычисляются с использованием рациональных минимаксных приближений на интервалах корневых скобок для малых|x |и асимптотического расширения Ханкеля для больших|x |. Коэффициенты исходят из:
У. Джей КодиАлгоритм 715: SPECFUN - Портативный Фортран Package of Special Function Routines and Test Drivers, ACM Transactions on Mathematical Software, vol 19, 22 (1993).
и
J.F. Hart et al,Компьютерные приближения, Джон Wiley & Sons, Нью-Йорк, 1968.
Эти приближения точны примерно к 19 десятичным цифрам: поэтому эти методы не используются, когда тип T имеет более 64 двоичных цифр.
Когдаxменьше, чем машинный эпсилон, можно использовать следующие приближения для Y0(x), Y1(x), Y2(x) и Yn(x) (см.:http://functions.wolfram.com/03.03.06.0037.01,http://functions.wolfram.com/03.03.06.0038.01,http://functions.wolfram.com/03.03.06.0039.01иhttp://functions.wolfram.com/03.03.06.0040.01:
Когдаxневелик по сравнению сvиvне является целым числом, то для Yv(x) может быть использовано следующее последовательное приближение, это также область, где другие приближения часто слишком медленные, чтобы сходиться для использования (см.http://functions.wolfram.com/03.03.06.0034.01):
Когдаxмало по сравнению сv, Jvx & #160; лучше всего вычисляется непосредственно из серии:
В общем случае мы вычисляем Jv& #160; и Yv& #160; одновременно.
Чтобы получить начальные значения, пусть μ = ν - пол(ν + 1/2), затем μ является дробной частью ν так что |μ |<= 1/2 (это нам нужно для конвергенции позже). Идея состоит в том, чтобы вычислить J& #956;(x), J& #956; +1(x), Y& #956;(x), Y& #956; +1(x) и использовать их для получения J& #957;(x), Y& #957;(x).
Алгоритм называется методом Стида, который требует двух непрерывных фракций, а также Вронского:
См.: F.S. Acton,Numerical Methods that Work, The Mathematical Association of America, Washington, 1997.
Продолжающиеся фракции вычисляются с использованием модифицированного метода Ленца (W.J. Lentz,).Генерация функций Бесселя в расчетах рассеяния Ми с использованием непрерывных фракций, Applied Optics, vol 15, 668 (1976) . Их коэффициенты конвергенции зависят отx, поэтому нам нужны различные стратегии для большихxи малыхx.
x >v, CF1 нуждается в Ox) итерациях для конвергенции, CF2 быстро сходится
x<= v, CF1 быстро сходится, CF2 не сходится, когдаx<->
>0
Когдаxявляется большимx>2), обе непрерывные фракции сходятся (CF1 может быть медленным для действительно большихx. J& #956;, J& #956; +1, Y& #956; Y& #956; +1можно вычислить по
где
J& #957;и Y& #956;затем вычисляются с использованием обратного (алгоритма Миллера) и обратного рецидива соответственно.
Когдаxневеликx<2, конвергенция CF2 может потерпеть неудачу (но CF1 работает очень хорошо). Решением здесь является серия Temme:
где
gk& #160; и hk& #160; также вычисляются рекурсиями (с участием гамма-функций), но формулы немного сложны, читатели ссылаются на Н.М. Темме,О численной оценке обычной функции Бесселя второго рода, Journal of Computational Physics, vol 21, 343 (1976). Примечание: Серия Темме сходится только для |μ |<= 1/2.
Как и в предыдущем случае, Y& #957;& #160; вычисляется из форвардного повторения, так и Y& #957; +1. С этими двумя значениями и f& #957;, Вронский дает J& #957;(x) непосредственно без обратного повторения.
Статья Bessel Functions of the First and Second Kinds раздела Math Toolkit 2.5.0 Bessel Functions может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.
:: Главная :: Bessel Functions ::
реклама |