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