10

我正在 matlab 中创建一个函数来计算以下函数:

在此处输入图像描述

对于这个功能,我们有:

在此处输入图像描述

这是我在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
4

3 回答 3

11

问题是exp(x)approx ,但由于与浮点表示无法区分1+x而被评估。有一个 MATLAB 函数(针对 small 实现)可以避免该问题并且适用于小参数:111+xexpm1(x)exp(x)-1x

>> x=1e-100;expm1(x)/x
ans =
     1
于 2012-04-04T01:35:03.163 回答
5

我不得不尝试我的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。

于 2012-04-04T01:12:11.220 回答
-1

我认为这与您的数字的准确性有关。简而言之,MATLAB 的默认精度是 5 位。您可以使用 将其扩展到 15 format long。查看本文以获取有关 MATLAB 精度的更多信息

于 2012-04-04T00:51:35.917 回答