首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python中使用大指数的Bessel函数

Python中使用大指数的Bessel函数
EN

Stack Overflow用户
提问于 2012-12-05 23:20:40
回答 4查看 7.6K关注 0票数 8

我有一些代码,它使用了修改后的一阶和二阶贝塞尔函数(iv和kv)。这对我来说是一个问题,因为我需要使用比这个更高的值,通常高达2000或更多。

我正在使用scipy bessel functions,有没有更好的函数可以处理更小和更大的数字,或者修改Python来处理这些大数字。我不确定真正的问题是什么,为什么Python不能在超过700的情况下解决这些问题,是函数还是Python?

我不知道Python是否已经在这么做了,但我只需要前5-10位数字*例如10^x;也就是说我不需要所有的1000位数字,也许这就是Python如何解决它与Wolfram Alpha如何解决它的问题?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-12-06 00:56:13

如果使用双精度机器浮点,Scipy中的ivkv函数或多或少是最好的。正如在上面的注释中所指出的,您正在从浮点范围溢出结果的范围中工作。

您可以使用mpmath库来解决这个问题,该库实现了可调精度(软件)浮点运算。(它类似于MPFR,但在Python中):

代码语言:javascript
复制
In [1]: import mpmath

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

In [3]: mpmath.besselk(0, 1714)
mpf('1.2597398974570405e-746')
票数 8
EN

Stack Overflow用户

发布于 2012-12-06 01:31:53

mpmath是一个很棒的库,是实现高精度计算的理想选择。值得注意的是,这些函数可以从它们更基本的组成部分计算出来。因此,您不会被迫遵守scipy的限制,您可以使用不同的高精确库。下面是最小的例子:

代码语言:javascript
复制
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]

这提供了:

代码语言:javascript
复制
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]

对于您正在寻找的大值,这将失败,除非底层数据具有高精度。

票数 3
EN

Stack Overflow用户

发布于 2018-06-16 05:34:21

您可以使用指数级扩展的修改过的Bessel函数直接执行此操作,该函数不会溢出。它们被实现为special.ivespecial.kve。例如,修改后的第一类贝塞尔函数special.iv(0, 1714)将溢出。但是,只要你没有记录已经溢出的东西,它的对数就会被很好地定义:

代码语言:javascript
复制
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

其他容易溢出的函数也可以作为日志或扩展版本使用。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13726464

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档