2016-08-17 87 views
1

我在Matlab的函數erf/erfc函數的準確性方面存在問題。在matlab中erf/erfc函數的問題

正如我們所知,erf(x)只有等於1,如果x是無窮大。

但是,在Matlab中,令我感到驚訝的是erf(6)已經等於1,而6甚至不是很大!

erfc(x)更好一點,因爲erfc(27)非零,而erfc(28)爲零。

有沒有辦法提高這個函數的數值性能?即,增加erf(x)的值的範圍以獲得不完全是1的值? (並且erfc也是0)

+1

你需要多少位數的精度? erf提供15位數字,erfc下降到「e-300」。如果您需要更高的精確度,那麼您可能錯誤地使用了該功能 – Trogdor

+0

您是否有理由要求這樣一個精度值大的參數值? –

回答

1

您處理double precision floating pointerfc的執行方式不同,因爲值的間隔比0更接近於0。如果您確實需要更高的精度(您不清楚爲什麼會這麼做),則需要用不同的數字系統表示值。如果您有符號數學工具箱,請嘗試使用variable precision arithmetic。嘗試

erf(vpa(6)) 

它返回符號值0.99999999999999997848026328750109。隨着參數變大,您需要使用digits。當然,如果你用double將結果轉換回浮點數,你將失去所有額外的精度。

+0

不幸的是,我需要使用erf/erfc的輸出進行優化。我實際上必須記錄erfc的日誌。如果erfc的值爲0,那麼優化算法將不會運行。 – user1237300

+2

@ user1237300在這種情況下,您可能需要查看指數級縮放互補錯誤函數「erfcx」。 – njuffa

+0

@njuffa是對的。試試'x = 30;'log(erfcx(x)) - x。^ 2'來實現'log(erfc(x))'。你可以用'double(log(erfc(vpa(30))))'驗證結果。 – horchler