R中的双积分

时间:2017-04-03 16:13:59

标签: r integral

我想知道如何在R中进行双积分编码。我已经提到了两个类似的问题。

calculating double integrals in R quickly

double integration in R with additional argument

但我仍然很困惑如何从这些答案中得到我的问题。我的问题是。

我想在R中编码这个计算。

enter image description here

从我的手和Wolfram alpha计算,它变为16826.4。如果两个积分都来自使用adaptIntegrate()的精确数字,我知道如何取一个积分。但我不知道该怎么办。你们能帮助我吗?非常感谢你。

3 个答案:

答案 0 :(得分:7)

让我从代码开始,然后逐步解释它。

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

答案 1 :(得分:1)

积分域是带顶点(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

答案 2 :(得分:-1)

在绘制要积分的区域时,我会观察到带有顶点的单纯形 (15,15),(15,50),(50,50)。该区域与三角形的面积相同。所以积分 应该是一样的。请重新检查您的顶点。如果我错了,请解释。