我想知道如何在R中进行双积分编码。我已经提到了两个类似的问题。
calculating double integrals in R quickly
double integration in R with additional argument
但我仍然很困惑如何从这些答案中得到我的问题。我的问题是。
我想在R中编码这个计算。
从我的手和Wolfram alpha计算,它变为16826.4。如果两个积分都来自使用adaptIntegrate()的精确数字,我知道如何取一个积分。但我不知道该怎么办。你们能帮助我吗?非常感谢你。
答案 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)。该区域与三角形的面积相同。所以积分 应该是一样的。请重新检查您的顶点。如果我错了,请解释。