我不得不尝试我的LIMEST工具。与任何自适应工具一样,它可能会被愚弄,但它通常非常好。
fun = @(x) (exp(x) - 1)./x;
如您所见,乐趣的问题为零。
fun(0)
ans =
NaN
虽然如果我们评估 fun 接近 0,我们会看到它接近 1。
format long g
fun(1e-5)
ans =
1.00000500000696
LIMEST 成功,甚至能够提供限制的错误估计。
[lim,err] = limest(fun,0,'methodorder',3)
lim =
1
err =
2.50668568491927e-15
LIMEST 使用一系列多项式近似值,并结合自适应理查森外推法来生成极限估计和对该极限不确定性的测量。
那么你看到了什么问题?您看到的失败是简单的减法取消错误。因此,看价值
exp(1e-20)
ans =
1
即使使用 long g 格式,exp(1e-20) 的双精度值也太接近 1,以至于当我们减去 1 时,结果是精确的零。将其除以任何非零值,我们得到零。当然,当 x 实际上为零时,我们有一个 0/0 条件,所以当我尝试这样做时,结果是 NaN。
让我们看看高精度会发生什么。我将使用我的 HPF 工具进行计算,并以 64 位十进制数字工作。
DefaultNumberOfDigits 64
exp(hpf('1e-20'))
ans =
1.000000000000000000010000000000000000000050000000000000000000166
看到当我们减去 1 时,1 和指数值之间的差小于 eps(1),所以 MATLAB 必须产生一个零值。
exp(hpf('1e-20')) - 1
ans =
1.000000000000000000005000000000000000000016666666666670000000000e-20
未提出的问题是我将如何选择在 MATLAB 中准确地生成该函数。显然,您不想像我一样使用蛮力并定义乐趣,因为您会失去很多准确性。我可能只是在零附近的有限区域内扩展泰勒级数,并使用上面的 fun 来表示与零显着不同的 x。