R中的n维积分,具有作为函数的限制

时间:2015-09-18 22:41:13

标签: c r integration numerical

我知道诸如cubature之类的R包能够对许多积分执行数值积分。但是,在我的情况下,集成的限制不是整数,而是其他变量的函数。

例如,假设我有

f(x,y)= 4 *(x-y)*(1-y),其中0

我想计算一个双积分(dy dx)而不是y < x&lt;对于x和0 <0的范围,可以得到2。 y&lt; 1表示y的范围。我将如何在R中执行此操作(即,这可能使用pracma包吗?)

如果尚未实现,我会感到惊讶,但在这种情况下,指向算法的链接会有所帮助。

2 个答案:

答案 0 :(得分:4)

如果你只是添加(或者更确切地说是乘以)一个术语,在任何(x,y) - 元组中将函数的值设置为零,其中(y> = x)

,这实际上非常容易
y

积分函数不接受无限界,但由于x被限制为(0-1)且y大于x,因此{{1}}为下限也必须为0,这就是我以这种方式设置限制的原因。

答案 1 :(得分:0)

您可以将域划分为三个三角形(创建图片)。通过在列中给出其顶点来定义这三个三角形:

T1 <- cbind(c(0,0), c(1,0), c(1,1))
T2 <- cbind(c(1,0), c(2,0), c(1,1))
T3 <- cbind(c(1,1), c(2,1), c(2,0))

然后,您可以使用SimplicialCubature软件包。首先定义数组中三个三角形的并集:

Domain <- abind::abind(T1, T2, T3, along=3)

定义被积物:

f <- function(xy) 4*(xy[1]-xy[2])*(1-xy[2])

然后:

library(SimplicialCubature)
> adaptIntegrateSimplex(f, Domain)
$integral
[1] 2.833333

$estAbsError
[1] 2.833333e-12

$functionEvaluations
[1] 96

积分的精确值为17/6 = 2.833333....。因此,我们得到的逼近度比另一个答案中pracma给出的逼近度好(不足为奇:带有项(y<x)的被积数并不平滑)。


在此示例中,我们甚至可以使用SimplicialCubature得到更好的结果。被整数是一个多项式:f(x,y) = 4*x - 4*xy - 4*y + 4*y²SimplicialCubature软件包具有多项式的精确方法。

> p <- definePoly(c(4,-4,-4,4), rbind(c(1,0),c(1,1),c(0,1),c(0,2)))
> printPoly(p)
Polynomial has 4 terms and 2 variables
4 * x[1]^1       (degree= 1 )
  -4 * x[1]^1 * x[2]^1       (degree= 2 )
  -4 * x[2]^1       (degree= 1 )
  + 4 * x[2]^2       (degree= 2 )
> integrateSimplexPolynomial(p, Domain)
$integral
[1] 2.833333

$functionEvaluations
[1] 9