我想知道如何在R中编写代码来进行二重积分。我已经参考了两个类似的问题。
但是我仍然不清楚如何从这些答案中得到我的问题的答案。我的问题如下。
我想在R中编写代码计算以下内容。
根据我的手算和Wolfram Alpha计算,结果为16826.4。如果两个积分都是精确数字,则我知道如何使用adaptIntegrate()取积分。但是我不确定在我的情况下应该如何操作。你们能帮我吗?非常感谢!
我想知道如何在R中编写代码来进行二重积分。我已经参考了两个类似的问题。
但是我仍然不清楚如何从这些答案中得到我的问题的答案。我的问题如下。
我想在R中编写代码计算以下内容。
根据我的手算和Wolfram Alpha计算,结果为16826.4。如果两个积分都是精确数字,则我知道如何使用adaptIntegrate()取积分。但是我不确定在我的情况下应该如何操作。你们能帮我吗?非常感谢!
让我先展示代码,然后逐步解释它。
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
积分域是一个三角形,其顶点为 (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
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
更多信息 这里