Python 如何避免指数项的数值溢出错误?

Python 如何避免指数项的数值溢出错误?,python,fortran,numerical-methods,integer-overflow,exponential,Python,Fortran,Numerical Methods,Integer Overflow,Exponential,由于溢出错误,处理具有指数项的数值计算通常会变得很痛苦。例如,假设你有一个概率密度,P(x)=C*exp(f(x)/k),其中k是非常小的数字,比如说10^(-5) 要找到C的值,必须积分p(x)。下面是溢出错误。我知道这也取决于f(x)的形式。但是现在让我们假设,f(x)=sin(x) 如何处理这些问题 我们可以使用哪些技巧来避免它们 这些问题的严重程度是否取决于语言?如果是,应该用哪种语言编写代码 正如我在评论中提到的,我强烈建议尽可能使用分析方法。然而,如果你想计算这种形式的积分 I=In

由于溢出错误,处理具有指数项的数值计算通常会变得很痛苦。例如,假设你有一个概率密度,
P(x)=C*exp(f(x)/k)
,其中k是非常小的数字,比如说
10^(-5)

要找到
C
的值,必须积分
p(x)
。下面是溢出错误。我知道这也取决于
f(x)
的形式。但是现在让我们假设,
f(x)=sin(x)

如何处理这些问题

我们可以使用哪些技巧来避免它们


这些问题的严重程度是否取决于语言?如果是,应该用哪种语言编写代码

正如我在评论中提到的,我强烈建议尽可能使用分析方法。然而,如果你想计算这种形式的积分

I=Integral[Exp[f(x)],{x,a,b}]
如果f(x)可能会溢出指数,那么您可能希望通过以下方式重新规范化系统:

假设f(c)是域[a,b]中f(x)的最大值,则可以写入:

I=Exp[f(c)] Integral[Exp[f(x)-f(c)],{x,a,b}]
这是一个丑陋的把戏,但至少你的指数在积分中会很小


注意:刚刚意识到这是

的评论,其中一个选项是使用GSL-GNU科学库(python和fortran包装器可用)。 有一个功能
gsl\u sf\u exp\u e10\u e
,根据文档

使用gsl\u sf\u result\u e10类型计算指数\exp(x),以返回扩展范围的结果。如果\exp(x)的值会溢出double的数值范围,则此函数可能很有用

但是,我想指出的是,由于在评估期间进行了额外的检查,所以速度很慢


另外,正如前面所说,如果可能的话,最好使用解析解

用实际值的对数计算,并使用
+
而不是
*
,这难道不是一个常见的技巧吗?这听起来像是一个更适合的问题,特别是询问要使用哪种编程语言显然是离题的。这也是相当广泛的,在这里询问具体的和有重点的问题来解决,而不是可能的技巧!在您的例子中,以下积分非常方便
integral[exp(i*b*sin(x))cos^(2n)(x),{x,-Pi/2,Pi/2}]=Sqrt(Pi)(2/b)^n Gamma(n+1/2)J_n(b)
b
n
a复数和
J_n(x)
第一类贝塞尔函数。(参考Gradshteyn和Ryzhik中的等式3.915.3)对于什么样的问题,您需要如此巨大的评估???这看起来是病态的。还有另一种方法。。。如果我们考虑p(x)=d*EXP(a*(正弦(x)- 1))(其中d是标准化常数和a=1/k),那么EXP(a*(x(x)- 1))的正交可以更容易。对于一般f(x),可以考虑p(x)=d*EXP(a*(f(x)-c))与c=max f(x)等…@ RoGyvib可以自由地写这个作为答案,并且我将删除这一个!嗨,没问题。我尝试了一些数值实验,它对“不太大”的f(x)有效。但当涉及到10^5等时,被积函数变得像一个delta函数,这对于数值求积来说可能是个问题(因为宽度太窄)。。。但无论如何,对问题进行一些(预先)调整可能会有所帮助。(否则,我想可能需要一种更简洁的方法(针对问题),如评论中所示的论文。)