-1

私のプロジェクトの 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,5 を使用して取得

fp.plot(f_low,[0,5 で取得

最初のプロットはfp.plot(f_high,[0,1])、2 番目のプロットを示していますfp.plot(f_low,[0,1])。誰かが疑問に思っている場合: 関数は見苦しく見えますが、一方は他方のコピーであり、 にmp置き換えられているだけfpなので、他の方法で異なる可能性はありません。

私もMathematicaでプロットしましたが、絵は上のものに似ています(高精度)。

関数の実装に間違いがあるようfp.hyperですね。

4

1 に答える 1

1

ドキュメントには次のように書かれていfpます(強調を追加):

中間の丸め誤差と取り消し誤差のため、fp 演算で計算された結果は、同等の精度 (mp.prec = 53) を使用して mp で計算された結果よりもはるかに正確ではない場合があります。精度は問題に大きく依存します。関数によっては、ほとんどの場合、fp は 14 ~ 15 桁の正しい数字を返します。他の人にとっては、結果はわずか 2 ~ 3 桁の正確さであったり、完全に間違っていたりすることさえあります。したがって、fp の推奨される使用法は、入力セットのサブセットで事前に精度を検証できる場合、または結果を後で検証できる場合に、大規模な計算を高速化することです。

fpより高速な計算を使用し、マイナス面がなく、単なるドロップインの代替品である場合mp、 が存在する理由はありませんmp。この場合、fpはあなたのタスクに適していないように見えるため、 を使用する必要がありますmp

于 2016-05-27T19:16:16.713 に答える