我有一些代码使用了修改后的贝塞尔函数的一阶和二阶(iv和kv)。令人恼火的是,它们似乎有极限,它们是iv(0713)和kv(0697),每加一个,分别得到无穷和0。这对我来说是个问题,因为我需要使用高于此值的值,通常高达2000或更多。当我试图除以这些值时,我最终得到了0或无穷大,这意味着我要么得到了错误,要么得到了0,这都不是我想要的。
我使用的是scipy bessel functions,有没有更好的函数可以处理更小、更大的数字,或者是修改Python以处理这些大数字的方法。我不确定这里真正的问题是什么,为什么Python不能在700之后解决这些问题,是函数还是Python?
我不知道Python是否已经这样做了,但我只需要前5-10个数字*10^x;也就是说,我不需要所有1000个数字,也许这就是Python是如何工作的问题,而Wolfram Alpha是如何工作的?
mpmath
是一个非常棒的库,是进行高精度计算的途径。值得注意的是,这些函数可以从它们更基本的组成部分计算出来。因此,您不必遵守scipy的限制,您可以使用不同的高精度库。下面是最简单的例子:这就提供了:
除非底层数据具有高精度,否则对于要查找的大值,这将失败。
可能是函数有问题。对于大正x,任何nu都有渐近的kv(nu,x)~e^{-x}/\sqrt{x}。所以对于大x,最终得到的是非常小的值。如果您能够使用贝塞尔函数的日志,问题将消失。Scilab利用了这种渐近性:它的参数ice默认为0,但当设置为1时,将返回exp(x)*kv(nu,x),这将保持所有内容的大小合理。
实际上,在scipy-scipy.special.kve中也有相同的功能
Scipy中的
iv
和kv
函数或多或少都是使用双精度机器浮点时可以得到的。如上所述,您正在结果从浮点范围溢出的范围内工作。您可以使用
mpmath
库(它执行可调精度(软件)浮点)来解决这个问题。(类似于MPFR,但在Python中):相关问题 更多 >
编程相关推荐