【发布时间】:2021-09-21 12:13:32
【问题描述】:
我对各种 2D 求积工具进行了一些测试,cubature 中的 adaptIntegrate 一直是最精确的工具之一,当它工作时。
麻烦的是,在某些情况下它完全出错了,但不是小数点,真的超出了规模,我不明白为什么。
我试图在矩形(实际上甚至是正方形)二维域上集成的功能是合乎逻辑的,形式如下:
条件_1 & (条件_2 | 条件_3 | ...)
这对我尝试过的任何工具都没有问题(pracma::integral2、pracma::quad2d、pracma::simpson2d...)。adaptIntegrate 然而,在大多数情况下提供最佳结果的同时,偶尔会完全失败。
例子:
require(cubature)
# Intersection of a circle of radius 4 centred in (0,0) with a circle of radius 1 centred in (0,0)
adaptIntegrate(function(x) ( (x[1]^2+x[2]^2 <= 16) & ((x[1]-0)^2+(x[2]-0)^2 <= 1) ), c(-4, -4), c(4, 4), absError = 1.e-2 )
#$integral
#[1] 3.141522
#
#$error
#[1] 0.009982141
#
#$functionEvaluations
#[1] 24089
#
#$returnCode
#[1] 0
正确:积分应该是 pi*1^2,大约是 3.142。
现在将小圆圈的中心移动到 (1,0)。它仍然完全包含在较大的圆圈中,因此交叉点仍然具有相同的区域。
# Intersection of a circle of radius 4 centred in (0,0) with a circle of radius 1 centred in (1,0)
adaptIntegrate(function(x) ( (x[1]^2+x[2]^2 <= 16) & ((x[1]-1)^2+(x[2]-0)^2 <= 1) ), c(-4, -4), c(4, 4), absError = 1.e-2 )
#$integral
#[1] 0
#
#$error
#[1] 0
#
#$functionEvaluations
#[1] 51
#
#$returnCode
#[1] 0
我无法弄清楚为什么会发生这种情况。如果我对小圆圈的 x 使用 1.1 而不是 1,它会回到一个非常令人满意的估计值。
如果我做错了什么,或者这实际上是一个错误,有没有人有任何想法?
谢谢!
PS
2 个注释:
- 是的,我知道这些例子很简单,我可以简单地使用小圆圈的面积。我需要解决的真正问题不那么微不足道(例如,小圆圈可以部分重叠大圆圈的周边,并且会有很多小圆圈,不仅是一个,它们之间也会重叠)。如果我不能依靠它来处理一个简单的案例,我就不能依靠它来处理更复杂的案例,可以吗?
- 是的,我看到了一些与
adaptIntegrate不一致的帖子,例如this one。
我在那里看到了这个答案:
Cucture C 库给出的结果与我在上述问题中报告的结果相同,而且这不太可能是错误;相反,在某些情况下,h 自适应 cubature 例程(R 包是其接口)不如 Cubature 的 p 自适应例程准确,后者将适当区域的采样点数加倍。
这有什么帮助?当工具实际上给出错误答案时,我说 “这不是错误” 对我来说似乎是不正确的。此外,在我的情况下,pcubature 一直不太好,并且给出了相同类型的错误,所以......
【问题讨论】: