Mpmath гипергеометрическая функция показывает различное поведение для высокой и низкой точности

Для одного из моих проектов мне нужно многократно оценивать выражение, включающее общую гипергеометрическую функцию. Хотя SciPy не поддерживает общую функцию HypGeo, MPMath поддерживает. Однако, используя mp.hyper(..) очень много времени. Поэтому вместо этого я решил использовать их библиотеку быстрой точности fp.hyper(..), К сожалению, поведение кажется совершенно другим. Мой пример ниже:

from mpmath import mp, fp
from math import sin, cos, pi

H = 0.2
k = 2

A = 4 * sqrt(H) / (1 + 2 * H)
B = 4 * pi / (3 + 2 * H)
C = H/2 + 3/4


f_high = lambda t: (B * k * t * sin(pi * k) *
                   mp.hyper([1], [C+1/2, C+1], -(k*pi*t)**2) +
                   cos(pi * k) * mp.hyper([1], [C, C + 1/2],
                   -(k*pi*t)**2)) * A * t**(H + 1/2)


f_low = lambda t: (B * k * t * sin(pi * k) *
                   fp.hyper([1], [C+1/2, C+1], -(k*pi*t)**2) +
                   cos(pi * k) * fp.hyper([1], [C, C + 1/2],
                   -(k*pi*t)**2)) * A * t**(H + 1/2)

Получено с помощью fp.plot (f_high, [0,5

Получается через fp.plot (f_low, [0,5

Первый сюжет показывает fp.plot(f_high,[0,1]), второй fp.plot(f_low,[0,1]), В случае, если кому-то интересно: функции выглядят некрасиво, но одна является копией другой, просто mp заменен на fpтак что нет никаких шансов, что они будут отличаться друг от друга.

Я также нарисовал это в Mathematica, и картинка больше похожа на верхнюю (высокая точность).

Похоже, есть ошибка с реализацией fp.hyper функция, верно?

1 ответ

Решение

Документация для fp говорит (акцент добавлен):

Из-за промежуточных ошибок округления и отмены результаты, вычисленные с помощью арифметики fp, могут быть гораздо менее точными, чем результаты, вычисленные с использованием mp с эквивалентной точностью (mp.prec = 53), поскольку последний часто использует повышенную внутреннюю точность. Точность сильно зависит от проблемы: для некоторых функций fp почти всегда дает 14-15 правильных цифр; для других результаты могут быть точными до 2-3 цифр или даже полностью неверными. Поэтому рекомендуется использовать fp для ускорения крупномасштабных вычислений, где точность может быть проверена заранее на подмножестве входного набора или где результаты могут быть проверены впоследствии.

Если fp были просто заменой для mp с более быстрым вычислением и без недостатков, не было бы никаких причин для mp существовать. В этом случае оказывается, что fp не подходит для вашей задачи, поэтому вам придется использовать mp,

Другие вопросы по тегам