我有以下功能:
import scipy.misc
import scipy.special
def wave_func(x, n):
pre = 1. / ((2**n * scipy.misc.factorial(n) * numpy.sqrt(numpy.pi))**.5)
return pre * numpy.exp(-x**2 / 2.) * scipy.special.eval_hermite(n, x)
此功能收敛。我想对{n, 0, 500}
的这个函数进行求和。我希望n
的最大值甚至可以大于500
,即15000
。
虽然函数收敛,但pre
变得非常小,scipy.special.eval_hermite(n, x)
对于大n
变得非常大。 Python似乎无法处理这些值。非常小的值将返回0.0
,而较大的值将返回为inf
。将这些单独的结果相乘将返回0
。
Mathematica
等程序可以输出结果。这是如何运作的?它们不受float64
的限制吗?
是否有人有解决方案或解决方法,以便我能够评估我的大n
函数?
答案 0 :(得分:1)
Mathematica和类似的程序对所涉及的数字的大小敏感。他们重新排列因子以保持准确性:从e ^( - x ^ 2/2)/ pi ^ 0.25开始,然后循环i = 1到n ...乘以i,除以x(或兼容的任何东西)在hermite函数中循环),...
他们努力使值的大小合理地接近1.0,这有助于保持准确性。他们会从小端收集汇总。他们......嗯,有几个基本的数值分析技巧。
那是否足够详细?