2017-04-03 78 views
2

我想知道如何在R中使用雙重積分的代碼。我已經提到了兩個類似的問題。R中的雙積分

calculating double integrals in R quickly

double integration in R with additional argument

但我仍然感到困惑我如何從這些問題的答案讓我的問題。我的問題如下。

我想在R.

enter image description here

從我的手,Wolfram Alpha的計算程序這個計算,它成爲16826.4。如果兩個積分都來自使用adaptIntegrate()的精確數字,我知道如何進行積分。但我不知道如何處理我的情況。你們能幫我嗎?提前謝謝你。

+0

謝謝你的評論。是的,這只是一個例子。我想要採用雙積分的真實函數更復雜。我想用分析的方式來計算它並不容易。 – moggirio

回答

3

讓我從代碼開始,然後逐步解釋它。

InnerFunc = function(x) { x + 0.805 } 
InnerIntegral = function(y) { sapply(y, 
    function(z) { integrate(InnerFunc, 15, z)$value }) } 
integrate(InnerIntegral , 15, 50) 
16826.4 with absolute error < 1.9e-10 

第一行很簡單。我們只需要功能 f(x) = x + 0.805就能夠計算內積分。

第二步是棘手的​​唯一的事情。 用一個更簡單的 表達式function(z) { integrate(InnerFunc, 15, z)$value } 來計算內積分似乎很自然,並且只是將其整合。問題在於integrate 需要一個矢量化函數。你應該可以給它一個值列表,它將返回一個值列表。第一個積分的這種簡單的 形式一次只能處理一個值。 這就是爲什麼我們需要sapply,以便我們可以傳遞值列表 並返回值列表(第一個定積分)。

一旦我們有這個向量化函數的內積分,我們可以通過integrate得到答案。

後來簡化
雖然上述sapply方法有效,更自然的使用功能Vectorize這樣。

InnerFunc = function(x) { x + 0.805 } 
InnerIntegral = Vectorize(function(y) { integrate(InnerFunc, 15, y)$value}) 
integrate(InnerIntegral , 15, 50) 
16826.4 with absolute error < 1.9e-10 
+0

非常感謝G5W的詳細解釋。有效! – moggirio

+0

@Matt我看到你的[新問題](https://stackoverflow.com/q/44551816/4752675)。你能回答我的評論嗎?你想要計算什麼三重積分? – G5W

0

積分域是帶頂點(15,15),(50,15)和(15,50)的單純形。使用SimplicialCubature包:

> library(SimplicialCubature) 
> S = cbind(c(15,15),c(50,15),c(15,50)) 
> adaptIntegrateSimplex(function(v) v[1]+0.805, S) 
$integral 
[1] 16826.4 

$estAbsError 
[1] 1.68264e-08