我有一些代码,它使用了修改后的一阶和二阶贝塞尔函数(iv和kv)。这对我来说是一个问题,因为我需要使用比这个更高的值,通常高达2000或更多。
我正在使用scipy bessel functions,有没有更好的函数可以处理更小和更大的数字,或者修改Python来处理这些大数字。我不确定真正的问题是什么,为什么Python不能在超过700的情况下解决这些问题,是函数还是Python?
我不知道Python是否已经在这么做了,但我只需要前5-10位数字*例如10^x;也就是说我不需要所有的1000位数字,也许这就是Python如何解决它与Wolfram Alpha如何解决它的问题?
发布于 2012-12-06 00:56:13
如果使用双精度机器浮点,Scipy中的iv和kv函数或多或少是最好的。正如在上面的注释中所指出的,您正在从浮点范围溢出结果的范围中工作。
您可以使用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-06 01:31:53
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]对于您正在寻找的大值,这将失败,除非底层数据具有高精度。
发布于 2018-06-16 05:34:21
您可以使用指数级扩展的修改过的Bessel函数直接执行此操作,该函数不会溢出。它们被实现为special.ive和special.kve。例如,修改后的第一类贝塞尔函数special.iv(0, 1714)将溢出。但是,只要你没有记录已经溢出的东西,它的对数就会被很好地定义:
In [1]: import numpy as np
In [2]: from scipy import special
In [3]: np.log(special.iv(0, 1714))
Out[3]: inf
In [4]: np.log(special.kv(0, 1714))
Out[4]: -inf
In [5]: np.log(special.ive(0, 1714)) + 1714
Out[5]: 1709.3578418673253
In [6]: np.log(special.kve(0, 1714)) - 1714
Out[6]: -1717.4975741044941其他容易溢出的函数也可以作为日志或扩展版本使用。
https://stackoverflow.com/questions/13726464
复制相似问题