9

1 次と 2 次 (iv と kv) の両方の修正ベッセル関数を使用するコードがあります。迷惑なことに、それらには制限があるようです。それらは iv(0,713) と kv(0,697) で、それぞれに 1 を追加すると、それぞれ無限大と 0 になります。これよりも高い値を使用する必要があるため、多くの場合 2000 以上の値を使用する必要があるため、これは私にとって問題です。これらで除算しようとすると、最終的に 0 または無限大で除算されます。つまり、エラーまたはゼロが発生しますが、どちらも必要ありません。

私はscipy bessel functionsを使用しています。はるかに小さい数値とはるかに大きい数値に対応できるより優れた関数、またはこれらの大きな数値を処理するように Python を変更する方法はありますか。なぜPythonが700をはるかに超えてこれらをうまく処理できないのか、ここでの本当の問題が何であるかはわかりません.それは関数ですか、それともPythonですか?

Python が既にそれを行っているかどうかはわかりませんが、たとえば、最初の 5 ~ 10 桁 *10^x だけが必要です。つまり、1000桁すべてを必要とするわけではありません。おそらくこれは、Wolfram Alphaの計算方法と比較して、Pythonの計算方法に問題があるのでしょうか?

4

4 に答える 4

8

Scipyのivandkv関数は、倍精度の機械浮動小数点を使用する場合とほぼ同じです。上記のコメントで述べたように、結果が浮動小数点範囲からオーバーフローする範囲で作業しています。

mpmathこれを回避するには、調整可能な精度 (ソフトウェア) 浮動小数点を行うライブラリを使用できます。(MPFR に似ていますが、Python の場合):

In [1]: import mpmath

In [2]: mpmath.besseli(0, 1714)
mpf('2.3156788070459683e+742')

In [3]: mpmath.besselk(0, 1714)
mpf('1.2597398974570405e-746')
于 2012-12-05T16:56:12.603 に答える
3

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]

基になるデータの精度が高い場合を除き、探している大きな値に対しては失敗します。

于 2012-12-05T17:31:53.170 に答える