2016-07-30 85 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'數字化處理接近限制點。 –