用非常小的值计算matlab中的函数

时间:2012-04-04 00:43:11

标签: matlab precision exponential epsilon

我在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

3 个答案:

答案 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

答案 1 :(得分: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使用一系列多项式近似,并结合自适应Richardson外推法生成极限估计值和对该极限值的不确定性度量。

那你看到了什么问题?您看到的失败是简单的减法取消错误。因此,请查看

的值
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中准确生成该函数。显然,你不想使用蛮力并定义我的乐趣,因为你失去了很多准确性。我可能只是在零附近的有限区域扩展泰勒系列,并使用如上所述的乐趣x与0显着不同。

答案 2 :(得分:-1)

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