mad*_*die 5 r integral numerical-integration
是否可以在不使用 cubature 包的情况下在 R 中进行三重集成?
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)
例如,要编码这个三重积分:
我试过
InnerMostFunc = function(v) { v + y^2 }
InnerMostIntegral = function(w) { sapply(w,
function(x) { integrate(InnerMostFunc, 1, 2)$value }) }
InnerIntegral = function(y) { sapply(y,
function(z){integrate(InnerMostIntegral, 1, 2)$value }) }
integrate(InnerIntegral, 0, 1)
Run Code Online (Sandbox Code Playgroud)
再往下是评论中要求引用的先前帖子的扩展。但是这个顶部将展示如何计算更新后的帖子中给出的积分。
这比下面的积分类型更难写,因为函数必须完全嵌套。您不能像第二个示例中那样将它们分开,因此单个表达式相当长且难以阅读。这是计算请求积分的代码。
integrate(Vectorize(function(x) {
integrate(Vectorize(function(y) {
integrate(function(z) { x^2 + y*z }, 1, 2)$value }), 1,2)$value }), 0,1)
2.583333 with absolute error < 2.9e-14
Run Code Online (Sandbox Code Playgroud)
请注意,它计算了正确答案 31/12。引用的积分来源错误地给出了答案为 31/4。
引用上一篇文章的扩展
这是将上一篇文章中的过程扩展到三重积分的示例。我将计算的示例很容易进行分析,因此我们可以检查我们是否得到了正确的答案。我会用:
为了更容易理解,我将代码分成几个步骤。
InnerFunc = function(x) { x + 1 }
InnerIntegral = Vectorize(function(y) { integrate(InnerFunc, 0, y)$value})
Integral2 = Vectorize(function(z) { integrate(InnerIntegral , 0, z)$value})
(Tripleintegral = integrate(Integral2 , 0, 4))
21.33333 with absolute error < 2.4e-13
Run Code Online (Sandbox Code Playgroud)
这扩展了前面的例子,但并不能掩盖整体的问题的新声明的类型。