我知道诸如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
包吗?)
答案 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