我在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)
我在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)
您處理double precision floating point。 erfc
的執行方式不同,因爲值的間隔比0更接近於0。如果您確實需要更高的精度(您不清楚爲什麼會這麼做),則需要用不同的數字系統表示值。如果您有符號數學工具箱,請嘗試使用variable precision arithmetic。嘗試
erf(vpa(6))
它返回符號值0.99999999999999997848026328750109
。隨着參數變大,您需要使用digits
。當然,如果你用double
將結果轉換回浮點數,你將失去所有額外的精度。
不幸的是,我需要使用erf/erfc的輸出進行優化。我實際上必須記錄erfc的日誌。如果erfc的值爲0,那麼優化算法將不會運行。 – user1237300
@ user1237300在這種情況下,您可能需要查看指數級縮放互補錯誤函數「erfcx」。 – njuffa
@njuffa是對的。試試'x = 30;'log(erfcx(x)) - x。^ 2'來實現'log(erfc(x))'。你可以用'double(log(erfc(vpa(30))))'驗證結果。 – horchler
你需要多少位數的精度? erf提供15位數字,erfc下降到「e-300」。如果您需要更高的精確度,那麼您可能錯誤地使用了該功能 – Trogdor
您是否有理由要求這樣一個精度值大的參數值? –