Странное поведение fsum mpmath при оценке модифицированных бесселевых функций большого аргумента - PullRequest
0 голосов
/ 14 июня 2019

Добрый вечер.

Я оцениваю некоторые (бесконечные) суммы модифицированных функций Бесселя первого рода.Я пытаюсь аппроксимировать эти суммы, рассматривая только конечное количество терминов и оценивая сумму, используя функцию mpmath.fsum () .Я использую вычисление произвольной точности mpmath, так как значение функций Бесселя может быть достаточно большим для больших аргументов.Мой код выглядит следующим образом:

import mpmath as mpm

# Some initial assignments
x = mpm.mpf(1000)
u = mpm.mpf(1000)

print(mpm.besseli(0, x) * mpm.besseli(0, u) + mpm.fsum([2 * (-1)**m * mpm.besseli(2*m, x) * mpm.besseli(2*m, u) for m in range(1, 199)]))
print(mpm.besseli(0, x) * mpm.besseli(0, u) + mpm.fsum([2 * (-1)**m * mpm.besseli(2*m, x) * mpm.besseli(2*m, u) for m in range(1, 99)]) + mpm.fsum([2 * (-1)**m * mpm.besseli(2*m, x) * mpm.besseli(2*m, u) for m in range(99, 199)]))
print(mpm.besseli(0, x) * mpm.besseli(0, u) + mpm.fsum([2 * (-1)**m * mpm.besseli(2*m, x) * mpm.besseli(2*m, u) for m in range(1, 49)]) + mpm.fsum([2 * (-1)**m * mpm.besseli(2*m, x) * mpm.besseli(2*m, u) for m in range(49, 99)]) + mpm.fsum([2 * (-1)**m * mpm.besseli(2*m, x) * mpm.besseli(2*m, u) for m in range(99, 199)]))

Это дает вывод:

0.0
7.13684036512805e+848
2.15550546580361e+847

, что, очевидно, странно, поскольку, насколько я понимаю, все три должны давать одно и то же значение.

Кроме того, до тех пор, пока одно из значений x или u мало (например, u = 10), отклонения, по-видимому, не возникают или являются чрезвычайно маленькими.

Кто-нибудь имеет какие-либо идеи по этому странномуповедение?

Любая помощь очень ценится.

С уважением.

...