计算差异时如何避免舍入误差erfc (a)- erfc (b)erfc(a)−erfc(b)?

计算科学 数值分析 计算机算术
2021-12-24 10:45:45

在这个出色的答案中,建议使用函数来避免计算处理(大约)时的舍入误差。缩放他们的答案,然后缩小,我想(?)恢复他们真正想要的数字?erfcxx<25ex2

如果我们有需要计算的情况怎么办?我可以写:erfc(a)erfc(b)

erfcx(a)erfcx(b)=ea2erfc(a)eb2erfc(b)

但如果我想对函数进行数值积分(),这并不是特别有用:x,a,bR

abex2(erf(x)erf(a))dx=abex2(erfc(a)erfc(x))dx

如果的大小足够接近/足够大(就符号而言不是很大),那么我们会得到灾难性的抵消。例如,尝试在被积函数内部重新缩放似乎没有帮助,而不是有帮助!aba=16.85b=16.08

做什么?

如果你有 Python,这里是 Github Gist 上的玩具问题脚本它实现了此答案中提供的许多建议以避免溢出错误,但仍会遇到下溢问题。

1个回答

我不确定您到底要做什么。我假设您想使用某种求积来评估积分。这将为此工作。

请注意,我们有

x=abexp(x2)(erf(x)erf(a))dx=2πx=abexp(x2)τ=axexp(τ2)dτdx=2πx=abτ=axexp(x2τ2)dτdx

在积分三角形中,被积函数是严格正数,所以你不应该有任何取消。