2016-07-30 55 views
2

我有一个非常小的数字除以非常小的数字,MATLAB给我Inf(当x太小)或NaN(当x为零时)。但正确的极限值应该是2.如何解决这个问题?要得到j为2太小xx = 0MATLAB:非常小的数字除以非常小的数字

X = 0.000001

>> x = 0.000001 
x = 
    1.0000e-06 
>> j = 2*x*(1+(-1)*exp(-x))^(-1)*exp(-x) 
j = 
    2.0000 

X = 0.01

>> x = 0.01 
x = 
    0.0100 
>> j = 2*x*(1+(-1)*exp(-x))^(-1)*exp(-x) 
j = 
    1.9900 

X = 1E-19

>> x = 1e-19 
x = 
    1.0000e-19 
>> j = 2*x*(1+(-1)*exp(-x))^(-1)*exp(-x) 
j = 
    Inf 

x = 0的

>> x = 0 
x = 
    0 
>> j = 2*x*(1+(-1)*exp(-x))^(-1)*exp(-x) 
j = 
    NaN 
+0

你能清理公式?我不明白你想要计算什么。我只能看到(-1)。* x,它是-x和exp(1)^某物只是exp(某物)。请不要让它过于复杂 –

+0

@Andreas H.我已经做到了。你可以帮我吗? – kyle

+0

“Inf”边界的快速解决方法。使用'min'函数:'f = @(x)min(2,2 * x * exp(-x)/(1-exp(-x)));' – Hoki

回答

1

你可以使用符号数学工具箱:

syms x; 
limit(2*x*(1+(-1)*exp(-x))^(-1)*exp(-x), 0) 
+0

还有另一种方法吗?象征性的数学工具箱让我的代码变得更慢。 – kyle

+0

学习[答]。你需要提供一个解释。 –

+0

@kww对不起,对于迟到的回复。这是我想到的。 – rahnema1

2

,你得到NaNx=0是正确的,因为你不能除以零的事实。该限制仅在x->0而非x=0时有效。

它的工作达X〜= 10^-12,问题只是你迅速开始失去精度当指数接近1由于浮点算术的细节:

f = @(x) 2*x*exp(-x)/(1-exp(-x)); 
pow = (-1)*(1:19); 
X = 10.^pow; % 10^-1 to 10^-19 
[pow', arrayfun(f, X)'] 

ans = 
    -1.0000 1.9017 
    -2.0000 1.9900 
    -3.0000 1.9990 
    -4.0000 1.9999 
    -5.0000 2.0000 
    -6.0000 2.0000 
    -7.0000 2.0000 
    -8.0000 2.0000 
    -9.0000 2.0000 
    -10.0000 2.0000 
    -11.0000 2.0000 
    -12.0000 2.0000 
    -13.0000 1.9994 
    -14.0000 2.0016 
    -15.0000 2.0016 
    -16.0000 1.8014 
    -17.0000  Inf 
    -18.0000  Inf 
    -19.0000  Inf 

一个办法来解决那就是使用符号数学,正如另一个答案中所建议的那样。如果你想以数字的方式来做,你必须找到在距离极限尚未达到的极限点远的地方进行评估和评估过于靠近数值误差超过结果的极限点之间的折衷。

在FEX上有很好的Adaptive numerical limit (and residue) estimation提交,试图实现这一点。 approach it takes有点类似于Richardson extrapolation方法。特别是:

  1. 极限值是在一系列接近极限点的几何间隔点处评估的。
  2. 多项式用于拟合所得到的值序列。诀窍是找到步骤1中选择的点的平衡点。它们越接近限制点,多项式拟合变得越失真。
  3. 取多项式模型的常数项作为极限。

在你的特殊情况下,工具就像魅力一样,不需要调整点的顺序。请注意,它期望你的函数要矢量,即能够评估结果在输入点的矢量,所以使用逐元素的运营商定义它的时候:

>> f = @(x) 2.*x.*exp(-x)./(1-exp(-x)); 
[lim, err] = limest(f, 0) 

lim = 
    2.0000 
err = 
    5.5161e-12 
+0

如何解决Inf和NaN这个问题? – kyle

+0

再次,在'x = 0'的'NaN'不是问题,这是唯一合理的结果。扩展了我的答案,就如何用'x'数字化处理接近限制点。 –