Добавил к сумме интегральную оценку хвоста в виде .
Получается довольно точно для не очень больших порядков. Вот для порядков от 0 до 20:
В приложении zip архив с матлаб файлом таких оценок для порядков от 0 до 10000.
(Он текстовый, можно и без Matlab/Octave читать.)
Ускорение сходимости ряда
Ускорение сходимости ряда
zykov писал(а):Source of the post Сам Бессель в Matlab вычисляется встроенной функцией besselj.
В Matlab/Octave значение функции Бесселя считает какая-то библиотечная функция. Видимо считает точно и для больших аргументов тоже, т.к. в описании ничего не сказано, что не применять при аргументе больше такого-то.
В C++ в стандарте 2017 года такую функцию добавили в стандартную бибилотеку cmath - cyl_bessel_j.
Как именно считает - не знаю. Зависит от конкретной библиотеки. Наверно сейчас для этого уже есть стандартный алгоритм.
Тут в описании они дают ссылку на вольфрам, там есть описание Frobenius method. Наверно так и считают. Мне правда не ясно, что они делают для больших аргументов...
Ещё есть ссылка на библиотеку boost, там эта функция была ещё до стандарта 2017 года. По этой ссылке есть некоторые данные по точности и кое-какие детали по алгоритму.
Ускорение сходимости ряда
peregoudov писал(а):Source of the post Численно найти 10000 корней Бесселя? Как? Для этого нужно Бесселя уметь считать. Как? Суммированием степенного ряда? По асимптотике (а вы где-то видели ее далее первого члена)? По готовым асимптотическим формулам для корней? И во что в итоге выльются все промежуточные численные погрешности: в расчете самого Бесселя, в нахождении корня, в суммировании ряда из степеней корней?
Вобщем вывод такой.
Сам Бессель считается стандартной бибилотекой. Считается точно и довольно быстро. Даже для больших аргументов.
Имея функцию расчёта можно осуществить поиск нуля по начальному приближению. Люди использовали Halley's method (аналог метода Ньютона, только второго порядка). Таким образом можно довольно быстро и точно найти какое-то количество первых нулей (например первые 1000 или первый 100 000). Наверно делать это "на лету" будет несколько медленно. Но можно заранее табличку обсчитать.
Далее по таблице уже легко считать суммы. Самая простая оптимизация тут - это где-то оборвать сумму и добавить туда интегральное приближение для суммы хвоста.
Ускорение сходимости ряда
peregoudov писал(а):Source of the post По асимптотике (а вы где-то видели ее далее первого члена)?
По той ссылке на boost есть упоминание:
When is large compared to the order then the asymptotic expansions for large in M. Abramowitz and I.A. Stegun, Handbook of Mathematical Functions 9.2.19 are used (these were found to be more reliable than those in A&S 9.2.5).
Видимо в этой книге (pdf) есть хорошая асимптотика.
Ускорение сходимости ряда
Кратко, идея там такая.
В целях вычисления функции Бесселя при больших аргументах рассматривают функцию (известную как Hankel function или функция Бесселя третьего рода). Это комплексная линейная комбинация функций Бесселя первого и второго родов.
Для этой комплексной функции рассматривают полярное разложение на амплитуду и фазу .
И амплитуда, и фаза имеют понятную асимптотику на бесконечности. Фаза растёт почти линейно. Амплитуда падает примерно как степень , но уже гладко, без нулей.
После замены переменных можно разложить амплитуду и фазу при в ряд (т.е. получить сколько угодно порядков асимптотики). Потом просто нужно взять столько членов ряда, сколько нужно для требуемой точности.
Функция Бесселя первого рода будет .
В целях вычисления функции Бесселя при больших аргументах рассматривают функцию (известную как Hankel function или функция Бесселя третьего рода). Это комплексная линейная комбинация функций Бесселя первого и второго родов.
Для этой комплексной функции рассматривают полярное разложение на амплитуду и фазу .
И амплитуда, и фаза имеют понятную асимптотику на бесконечности. Фаза растёт почти линейно. Амплитуда падает примерно как степень , но уже гладко, без нулей.
После замены переменных можно разложить амплитуду и фазу при в ряд (т.е. получить сколько угодно порядков асимптотики). Потом просто нужно взять столько членов ряда, сколько нужно для требуемой точности.
Функция Бесселя первого рода будет .
Ускорение сходимости ряда
zykov писал(а):Source of the post В приложении zip архив с матлаб файлом таких оценок для порядков от 0 до 10000.
Оценил ошибку для таких значений (абсолютную и относительную) для некоторых порядков:
Код: Выбрать все
order abs rel
2 1.03e-13 9.69e-12
4 5.47e-14 1.38e-11
8 -8.77e-15 -6.96e-12
16 -9.90e-14 -2.75e-10
32 -3.90e-13 -4.05e-09
64 -1.48e-12 -5.91e-08
128 -5.25e-12 -8.26e-07
256 -1.68e-11 -1.05e-05
512 -4.49e-11 -1.11e-04
1024 -9.20e-11 -9.11e-04
10000 -8.19e-11 -7.72e-02
Для порядков под 10000 относительная ошибка уже 8%.
Ускорение сходимости ряда
zykov писал(а):Source of the post Потом просто нужно взять столько членов ряда, сколько нужно для требуемой точности.
Функция Бесселя первого рода будет .
Вот из любопытства повозился немного, чтобы получить разложение дальше:
Тут и из дифура не находятся, но они были как-то найдены из условия в нуле: и .
-
- Сообщений: 620
- Зарегистрирован: 29 дек 2015, 13:17
Ускорение сходимости ряда
Это похоже на известное разложение
Для бесселей есть аналогичное.
Для бесселей есть аналогичное.
Кто сейчас на форуме
Количество пользователей, которые сейчас просматривают этот форум: нет зарегистрированных пользователей и 2 гостей