2012-04-04 99 views
10

我在Matlab做一個函數來計算下面的函數功能:計算的MATLAB與非常小的值

enter image description here

此功能有:

enter image description here

這是我在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 

回答

11

的問題是,exp(x)約爲1+x,但被評價爲1由於1是從浮點表示1+x難以區分。有一個MATLAB函數expm1(x)(這是exp(x)-1實施了小x)避免這個問題,非常適用於小型的論點:

>> x=1e-100;expm1(x)/x 
ans = 
    1 
+0

好點 - 我總是忘記的功能就是在那裏。 – 2012-04-04 01:37:26

+2

還有'log1p(x)'給''log(1 + x)'很好地適用於小'x'。 – Ramashalanka 2012-04-04 01:42:29

-1

我認爲這與你的數字的精度有關。總之,MATLAB的默認精度是5位數。您可以使用format long將其擴展到15。檢查出this article有關MATLAB精度的更多信息

+0

我不認爲有浮點算術表示的精度做的數字,我認爲它與機器epsilon有關,並且可能1e-020小於機器的epsilon因此不能在MATLAB中運行,但我不確定假設是否爲真 – franvergara66 2012-04-04 01:10:10

+4

'格式'只處理輸出到控制檯的數字。它不會更改基礎編號。 – tmpearce 2012-04-04 01:11:17

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使用多項式逼近的序列,加上自適應理查森外推,以產生兩個極限估計和對限制不確定性的量度。

那麼你看到了什麼問題?你看到的失敗是簡單的減法取消錯誤。因此,看的

即使格式長克,實驗值(1E-20)的雙精度值的值是簡單地過於接近1,當我們減去關閉1,其結果是精確的零。除以任何非零值,我們得到零。當然,當x實際上爲零時,我們有一個0/0的條件,所以當我嘗試時,結果是NaN。

讓我們看看高精度會發生什麼。我將使用我的HPF工具進行計算,並使用64位十進制數字。

DefaultNumberOfDigits 64 
exp(hpf('1e-20')) 
ans = 
1.000000000000000000010000000000000000000050000000000000000000166 

看到,當我們sutract斷1,1和指數值之間的差小於EPS(1),因此必須MATLAB產生零值。

exp(hpf('1e-20')) - 1 
ans = 
1.000000000000000000005000000000000000000016666666666670000000000e-20 

的沒有提出的問題是我怎麼會選擇精確地產生在MATLAB該功能。顯然,你不想像我那樣使用強力和定義樂趣,因爲你失去了很多準確性。我可能只是在零點附近的有限區域內擴展泰勒級數,並且如上所述使用有趣的x來顯着區別於零。

+0

什麼是HPF工具?包含在MatLab中? – franvergara66 2012-04-04 01:40:50

+0

@ Melkhiah66 - nope。它是我在MATLAB中編寫的高精度工具箱。我仍在完善它。但是,您也可以使用符號工具箱進行類似的計算。 – 2012-04-04 03:57:59

+0

@ Melkhiah66 HPF現在正在進行文件交換 – 2012-05-19 12:50:43