2012-04-04 98 views
10

我在Matlab做一个函数来计算下面的函数功能:计算的MATLAB与非常小的值

enter image description here

此功能有:

enter image description here

这是我在matlab中实现的函数:

function [b]= exponential(e) 
%b = ? 
b= (exp (e) -1)/e; 

当我用非常小的值测试函数时,实际上函数的极限值为1,但是当数值非常小(例如1 * e-20)时,极限值为零?这种现象的解释是什么?难道我做错了什么?。

x= 10e-1 , f (x)= 1.0517 

x= 10e-5 , f (x)= 1.0000 

x= 10e-10 , f (x)= 1.0000 

x= 10e-20 , f (x)= 0 

回答

11

的问题是,exp(x)约为1+x,但被评价为1由于1是从浮点表示1+x难以区分。有一个MATLAB函数expm1(x)(这是exp(x)-1实施了小x)避免这个问题,非常适用于小型的论点:

>> x=1e-100;expm1(x)/x 
ans = 
    1 
+0

好点 - 我总是忘记的功能就是在那里。 – 2012-04-04 01:37:26

+2

还有'log1p(x)'给''log(1 + x)'很好地适用于小'x'。 – Ramashalanka 2012-04-04 01:42:29

-1

我认为这与你的数字的精度有关。总之,MATLAB的默认精度是5位数。您可以使用format long将其扩展到15。检查出this article有关MATLAB精度的更多信息

+0

我不认为有浮点算术表示的精度做的数字,我认为它与机器epsilon有关,并且可能1e-020小于机器的epsilon因此不能在MATLAB中运行,但我不确定假设是否为真 – franvergara66 2012-04-04 01:10:10

+4

'格式'只处理输出到控制台的数字。它不会更改基础编号。 – tmpearce 2012-04-04 01:11:17

5

我必须尝试使用​​我的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来显着区别于零。

+0

什么是HPF工具?包含在MatLab中? – franvergara66 2012-04-04 01:40:50

+0

@ Melkhiah66 - nope。它是我在MATLAB中编写的高精度工具箱。我仍在完善它。但是,您也可以使用符号工具箱进行类似的计算。 – 2012-04-04 03:57:59

+0

@ Melkhiah66 HPF现在正在进行文件交换 – 2012-05-19 12:50:43