由于存在溢出错误,使用具有指数项的数值计算进行处理通常会很痛苦。例如,假设您有一个概率密度P(x)=C*exp(f(x)/k)
,其中k是一个很小的数字,例如10^(-5)
的量级。
要找到C
的值,必须积分P(x)
。出现溢出错误。我知道这也取决于f(x)
的形式。但是现在让我们假设f(x)=sin(x)
。
如何处理此类问题?
我们可以使用哪些技巧来避免它们?
此类问题的严重性是否取决于语言?如果是,应该用哪种语言编写代码?
答案 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。如前所述,最好在可能的情况下使用分析解决方案。