R中的双重积分

16

我想知道如何在R中编写代码来进行二重积分。我已经参考了两个类似的问题。

快速计算R中的双重积分

带有额外参数的R中的双重积分

但是我仍然不清楚如何从这些答案中得到我的问题的答案。我的问题如下。

我想在R中编写代码计算以下内容。

enter image description here

根据我的手算和Wolfram Alpha计算,结果为16826.4。如果两个积分都是精确数字,则我知道如何使用adaptIntegrate()取积分。但是我不确定在我的情况下应该如何操作。你们能帮我吗?非常感谢!


1
谢谢您的评论。是的,这只是一个例子。我真正想要进行双重积分的函数更加复杂。我猜在解析方式下计算它并不容易。 - moggirio
3个回答

20

让我先展示代码,然后逐步解释它。

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

非常感谢 @G5W 的详细解释。它起作用了! - moggirio
@Matt 我看到了你的新问题。你能回答一下我在那里的评论吗?你试图计算什么三重积分? - G5W
@G5W 谢谢你的回答,非常有帮助。我还需要计算一些双重积分。为了明确起见,以 OP 的例子为例,我们是否同意可以写成:(15 <=) x <= y <= 50?谢谢。 - Mbr Mbr
1
@MbrMbr 是的,这个积分是在那个三角形区域上的。 - G5W
@G5W 非常感谢,我很确定这是正确的,但有一瞬间我还有些怀疑。 - Mbr Mbr

5

积分域是一个三角形,其顶点为 (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

0
你实际上可以使用pracma::integral2()函数来解决这个积分,但需要一些工作来将其定义为dydx。
f <- function(x,y) x+0.805
xmin <- 15; xmax<-50; 
ymin<-function(x) x; ymax<-50;
integral2(f,xmin,xmax,ymin,ymax)
$Q
[1] 16826.4

$error
[1] 1.818989e-12

这是因为:

doubleintegral

更多信息 这里


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接