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

时间:2018-07-27 11:16:55

标签: 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)

如何处理此类问题?

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

此类问题的严重性是否取决于语言?如果是,应该用哪种语言编写代码?

2 个答案:

答案 0 :(得分:1)

正如我在评论中提到的,我强烈建议您尽可能使用分析方法。但是,如果要计算形式的积分

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}]

这是一个丑陋的把戏,但是至少您的指数在积分中会很小。

注意::刚刚意识到这是roygvib

的评论

答案 1 :(得分:0)

其中一种选择是使用GSL-GNU科学库(提供python和fortran包装器)。 根据文档,有一个功能gsl_sf_exp_e10_e

  

使用gsl_sf_result_e10类型计算指数\ exp(x)以返回扩展范围的结果。如果\ exp(x)的值会使double的数字范围溢出,则此功能可能会有用。

但是,我要指出的是,由于评估过程中进行了额外的检查,速度很慢。

P.S。如前所述,最好在可能的情况下使用分析解决方案。