私のプロジェクトの 1 つで、一般的な超幾何関数を含む式を繰り返し評価する必要があります。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,1])
、2 番目のプロットを示していますfp.plot(f_low,[0,1])
。誰かが疑問に思っている場合: 関数は見苦しく見えますが、一方は他方のコピーであり、 にmp
置き換えられているだけfp
なので、他の方法で異なる可能性はありません。
私もMathematicaでプロットしましたが、絵は上のものに似ています(高精度)。
関数の実装に間違いがあるようfp.hyper
ですね。