我必须尝试使用我的LIMEST工具。与任何自适应工具一样,它可能会被愚弄,但它通常很不错。
fun = @(x) (exp(x) - 1)./x;
正如你所看到的,有趣的问题在零。
fun(0)
ans =
NaN
但如果我们接近零评估的乐趣,我们看到这是近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使用多项式逼近的序列,加上自适应理查森外推,以产生两个极限估计和对限制不确定性的量度。
那么你看到了什么问题?你看到的失败是简单的减法取消错误。因此,看的
即使格式长克,实验值(1E-20)的双精度值的值是简单地过于接近1,当我们减去关闭1,其结果是精确的零。除以任何非零值,我们得到零。当然,当x实际上为零时,我们有一个0/0的条件,所以当我尝试时,结果是NaN。
让我们看看高精度会发生什么。我将使用我的HPF工具进行计算,并使用64位十进制数字。
DefaultNumberOfDigits 64
exp(hpf('1e-20'))
ans =
1.000000000000000000010000000000000000000050000000000000000000166
看到,当我们sutract断1,1和指数值之间的差小于EPS(1),因此必须MATLAB产生零值。
exp(hpf('1e-20')) - 1
ans =
1.000000000000000000005000000000000000000016666666666670000000000e-20
的没有提出的问题是我怎么会选择精确地产生在MATLAB该功能。显然,你不想像我那样使用强力和定义乐趣,因为你失去了很多准确性。我可能只是在零点附近的有限区域内扩展泰勒级数,并且如上所述使用有趣的x来显着区别于零。
好点 - 我总是忘记的功能就是在那里。 – 2012-04-04 01:37:26
还有'log1p(x)'给''log(1 + x)'很好地适用于小'x'。 – Ramashalanka 2012-04-04 01:42:29