fra*_*a66 10 precision matlab epsilon exponential
我在matlab中创建一个函数来计算以下函数:

对于这个功能,我们有:

这是我在matlab中实现的功能:
function [b]= exponential(e)
%b = ?
b= (exp (e) -1)/e;
Run Code Online (Sandbox Code Playgroud)
当我用非常小的值测试函数时,实际上函数的极限是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
Run Code Online (Sandbox Code Playgroud)
Ram*_*nka 11
问题是exp(x)约为1+x,但正在评估,1因为在浮点表示中1无法区分1+x.有一个MATLAB函数expm1(x)(exp(x)-1实现为小x),可以避免这个问题并适用于小参数:
>> x=1e-100;expm1(x)/x
ans =
1
Run Code Online (Sandbox Code Playgroud)
小智 5
我不得不试试我的LIMEST工具.与任何自适应工具一样,它可以被愚弄,但通常都很好.
fun = @(x) (exp(x) - 1)./x;
Run Code Online (Sandbox Code Playgroud)
正如你所看到的,乐趣在零时存在问题.
fun(0)
ans =
NaN
Run Code Online (Sandbox Code Playgroud)
虽然如果我们评估接近零的乐趣,我们看到它接近1.
format long g
fun(1e-5)
ans =
1.00000500000696
Run Code Online (Sandbox Code Playgroud)
LIMEST成功,甚至能够提供极限的误差估计.
[lim,err] = limest(fun,0,'methodorder',3)
lim =
1
err =
2.50668568491927e-15
Run Code Online (Sandbox Code Playgroud)
LIMEST使用一系列多项式近似,并结合自适应Richardson外推法生成极限估计和该极限上的不确定性度量.
那么你看到了什么问题?您看到的失败是简单的减法取消错误.因此,看看的价值
exp(1e-20)
ans =
1
Run Code Online (Sandbox Code Playgroud)
即使格式为long g,exp(1e-20)的双精度值也非常接近于1,当我们减去1时,结果就是精确的零.除以任何非零值,我们得到零.当然,当x实际上为零时,我们有一个0/0条件,所以NaN在我尝试时产生了.
让我们看看高精度会发生什么.我将使用我的HPF工具进行计算,并以64位十进制数字工作.
DefaultNumberOfDigits 64
exp(hpf('1e-20'))
ans =
1.000000000000000000010000000000000000000050000000000000000000166
Run Code Online (Sandbox Code Playgroud)
看到当我们断开1时,1和指数值之间的差值小于eps(1),因此MATLAB必须产生零值.
exp(hpf('1e-20')) - 1
ans =
1.000000000000000000005000000000000000000016666666666670000000000e-20
Run Code Online (Sandbox Code Playgroud)
未提出的问题是我如何选择在MATLAB中准确生成该函数.显然,你不想使用蛮力并定义我所拥有的乐趣,因为你失去了很多准确性.我可能只是在零附近的有限区域扩展泰勒系列,并使用如上所述的乐趣x与0显着不同.