mpmath
是一個夢幻般的庫是去高精密的計算方式。值得注意的是,這些功能可以從更基本的組成部分來計算。因此,你不會被迫遵守scipy的限制,你可以使用一個不同的高精度庫。下面小例子:
import numpy as np
from scipy.special import *
X = np.random.random(3)
v = 2.000000000
print "Bessel Function J"
print jn(v,X)
print "Modified Bessel Function, Iv"
print ((1j**(-v))*jv(v,1j*X)).real
print iv(v,X)
print "Modified Bessel Function of the second kind, Kv"
print (iv(-v,X)-iv(v,X)) * (np.pi/(2*sin(v*pi)))
print kv(v,X)
print "Modified spherical Bessel Function, in"
print np.sqrt(np.pi/(2*X))*iv(v+0.5,X)
print [sph_in(floor(v),x)[0][-1] for x in X]
print "Modified spherical Bessel Function, kn"
print np.sqrt(np.pi/(2*X))*kv(v+0.5,X)
print [sph_kn(floor(v),x)[0][-1] for x in X]
print "Modified spherical Bessel Function, in"
print np.sqrt(np.pi/(2*X))*iv(v+0.5,X)
print [sph_in(floor(v),x)[0][-1] for x in X]
這給:
Bessel Function J
[ 0.01887098 0.00184202 0.08399226]
Modified Bessel Function, Iv
[ 0.01935808 0.00184656 0.09459852]
[ 0.01935808 0.00184656 0.09459852]
Modified Bessel Function of the second kind, Kv
[ 12.61494864 135.05883902 2.40495388]
[ 12.61494865 135.05883903 2.40495388]
Modified spherical Bessel Function, in
[ 0.0103056 0.00098466 0.05003335]
[0.010305631072943869, 0.00098466280846548084, 0.050033450286650107]
Modified spherical Bessel Function, kn
[ 76.86738631 2622.98228411 6.99803515]
[76.867205587011171, 2622.9730878542782, 6.998023749439338]
Modified spherical Bessel Function, in
[ 0.0103056 0.00098466 0.05003335]
[0.010305631072943869, 0.00098466280846548084, 0.050033450286650107]
這將失敗你正在尋找除基礎數據精度高的較大值。
我不認爲它是一個Python的問題,這麼多雙浮點範圍問題。 scipy提供了一個實際實現bessel函數的C代碼包裝器。因此,它僅限於雙倍可以容納的範圍。 – sizzzzlerz
是的,我只是做了sys.float_info並猜測是什麼? max_10_exp = 308,這或多或少正好是限制條件下bessel函數的答案。這對我來說是個壞消息。 Wolfram Alpha如何能夠解決這個問題? – Rapid
魔法?我不知道,但我很確定Alpha從Wolfram的Mathematica中獲得它的代碼庫,這是一個非常複雜的工具。他們已經實現了一些算法,使他們能夠返回基本上無限的精度和範圍,像bessel這樣的超越函數。 – sizzzzlerz