R中的双积分

mog*_*rio 8 r integral

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

快速计算R中的双积分

R中的双重积分与附加参数

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

我想在R中编写这个计算代码.

在此输入图像描述

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

G5W*_*G5W 8

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

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
Run Code Online (Sandbox Code Playgroud)

第一行非常简单.我们只需要 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
Run Code Online (Sandbox Code Playgroud)


Sté*_*ent 6

积分域是一个具有顶点 (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
Run Code Online (Sandbox Code Playgroud)