Für eines meiner Projekte muss ich wiederholt einen Ausdruck mit der allgemeinen hypergeometrischen Funktion auswerten. Während SciPy die allgemeine HypGeo-Funktion nicht unterstützt, tut dies MPMath. Die Verwendung von mp.hyper(..)
ist jedoch sehr zeitaufwendig. Stattdessen entschied ich mich, ihre schnelle Präzisions-Bibliotheksfunktion fp.hyper(..)
zu verwenden. Leider scheint das Verhalten völlig anders zu sein. Mein Beispiel unten:Mpmath hypergeometrische Funktion zeigt unterschiedliches Verhalten für hohe und niedrige Präzision
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)
Die erste Kurve zeigt fp.plot(f_high,[0,1])
, die zweite fp.plot(f_low,[0,1])
. Falls jemand sich fragt: Die Funktionen sehen hässlich aus, aber eine ist eine Kopie der anderen, nur mp
ersetzt durch fp
, also gibt es keine Chance, dass sie sich auf andere Weise unterscheiden.
Ich habe es auch in Mathematica geplottet und das Bild ist eher wie das obere (hohe Präzision).
Sieht aus wie es ist ein Fehler bei der Implementierung der fp.hyper
Funktion, richtig?
Natürlich ist klar, dass es einen Kompromiss zwischen Präzision und Rechenzeit gibt, aber die fp.implementation zeigt ein völlig anderes Verhalten? – sbm
Ich weiß nicht, was ich Ihnen sagen soll, außer was die Dokumentation schon sagt. Beachten Sie, wo es heißt "oder sogar völlig falsch". Vermutlich gibt es zu einem entscheidenden Zeitpunkt in Ihrer Berechnung einen Genauigkeitsverlust, der zu "völlig falschen" Ergebnissen führt. – BrenBarn
@sbm: Es gibt einen Kompromiss. Sie haben im Wesentlichen * alle * Ihrer Präzision gehandelt. Sie wurden gewarnt, dass dies passieren könnte. – user2357112