我試圖將以下函數從-infinity集成到infinity。答案應該是0.2,但是R給出了一個可笑的小數字。怎麼了?R中的integrate()給出了非常錯誤的答案
>f=function(x){exp(-10*abs(x-25))}
>integrate(f,-Inf,Inf)
5.329164e-15 with absolute error < 1e-14
我試圖將以下函數從-infinity集成到infinity。答案應該是0.2,但是R給出了一個可笑的小數字。怎麼了?R中的integrate()給出了非常錯誤的答案
>f=function(x){exp(-10*abs(x-25))}
>integrate(f,-Inf,Inf)
5.329164e-15 with absolute error < 1e-14
我將需要更長的時間來解釋這一點,並希望其他用戶將添加到此維基。
從?integrate
,所述abs.tol
參數被定義爲
要求絕對準確度。
進一步回落是下面的註釋:
當集成了無限區間明確地這樣做,而不是僅僅使用了大量的端點。這增加了正確答案的機會 - 任何在無窮區間內有限的積分都是有限的函數在該區間的大部分時間內必須接近零。
所以,如果你想要,而不是相對精度(其定義爲從.Machine$double.eps^0.25
結果)絕對精度,那麼你可以做
> integrate(f, Inf, -Inf, abs.tol = 0L)
0.2 with absolute error < 8.4e-06
爲abs.tol
默認參數爲從rel.tol
傳遞,這是.Machine$double.eps^0.25
讓我們來看看「裏面」發生了什麼。
ifoo<-integrate(f,-Inf,Inf,abs.tol=1e-20)
5.275825e-21 with absolute error < 9.8e-21
str(ifoo)
List of 5
$ value : num 5.28e-21
$ abs.error : num 9.81e-21
$ subdivisions: int 3
$ message : chr "OK"
$ call : language integrate(f = f, lower = -Inf, upper = Inf, abs.tol = 1e-20)
- attr(*, "class")= chr "integrate"
ifoo<-integrate(f,-Inf,Inf,abs.tol=1e-40)
0.2 with absolute error < 8.4e-06
str(ifoo)
List of 5
$ value : num 0.2
$ abs.error : num 8.36e-06
$ subdivisions: int 21
$ message : chr "OK"
$ call : language integrate(f = f, lower = -Inf, upper = Inf, abs.tol = 1e-40)
- attr(*, "class")= chr "integrate"
注意到細分數量的突然增加。一般而言,更多的細分意味着更高的準確性,畢竟這是微積分的要點:將細分寬度減少爲無,以獲得確切的答案。我的猜測是,對於一個大的(ish)abs.tol
,計算值只需要幾個細分來與某個「估計的容差誤差」保持一致,但是當所需的容差變得足夠小時,就會「添加」更多的細分。
編輯:感謝弘大,他實際上看着所涉及的積體。 :-)。由於該函數在x==25
處具有尖點,即導數中的不連續性,所以優化算法可能會被「誤導」爲收斂。奇怪的是,利用這個被積函數非常快地接近於零的事實,當不是積分爲+/-Inf
時結果更好。事實上:
Rgames> integrate(f,20,30)
0.2 with absolute error < 1.9e-06
Rgames> integrate(f,22,27)
0.2 with absolute error < 8.3e-07
Rgames> integrate(f,0,50)
0.2 with absolute error < 7.8e-05
這是不直觀的,例如,'integrate(f,-Inf,Inf,abs.tol = 1e-20) #5.275825e-21絕對誤差<9.8e-21 ifoo < - 絕對誤差<8.4e-06'的積分(f,-Inf,Inf,abs.tol = 1e-40) #0.2因此,當我減小絕對容差時,絕對誤差*突然增加*。我明白爲什麼很多人會神祕化。 – 2014-09-24 18:59:52
@CarlWitthoft - 我可能會解釋一下。我的微積分技能並不好。我做了一個wiki,所以隨時編輯 – 2014-09-24 19:05:31
我會嘗試 - 可能我不會得到更好的:-) – 2014-09-24 19:12:17
雖然通常在?integrate
建議明確指定+/- Inf
的限制是有效的,那可就大錯特錯了在特殊情況下。這是其中之一。
> integrate(f, 20, 30)
0.2 with absolute error < 1.9e-06
基本問題似乎是你的函數不光滑,因爲它的導數在x = 25時是不連續的。這可能會愚弄該算法,特別是其使用永利的epsilon方法來加速收斂。基本上,要知道你的功能是什麼樣子,以及它的行爲會如何導致問題,沒有什麼真正的替代品。正如在答案here中指出的那樣,R不是一個符號數學解算器,因此當您嘗試獲得數值結果時,您必須更加小心。
優秀的點。我會修改我的「社區維基」以引用它。 – 2014-09-25 11:49:53
'整合(f,-Inf,Inf,abs.tol = 0)'工作嗎? – 2014-09-24 18:32:29
它做到了!到底是怎麼回事? – Patrick 2014-09-24 18:35:47
我已經發布了一個答案。我們希望它可以解釋一下 – 2014-09-24 18:41:33