2017-04-03 93 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