将附加参数传递给 pracma::integral2

Passing additional parameters to pracma::integral2

我正在使用pracma::integral2集成一个有时需要额外参数的函数,但integral2似乎无法识别我提供的参数。 考虑这两个函数:

fun1 <- function(x, y) exp(-x^2 - y^2)
fun2 <- function(x, y, a) (1 / a) * exp(-x^2 - y^2)

如果我那么运行

integral2(fun1,
      xmin = 0,
      xmax = 1,
      ymin = 0,
      ymax = 1)$Q

我得到了预期的 0.5577463。但是如果我 运行:

   integral2(fun2,
          xmin = 0,
          xmax = 1,
          ymin = 0,
          ymax = 1,
          a = 1)$Q

我得到:

Error in fun(x, y, ...) : argument "a" is missing, with no default 

引用通告显示如下:

  1. fun(x, y, ...)
  2. FUN(X, Y)
  3. .tensor(xmin, xmax, thetaL, thetaR, phiB, phiT, FUN, phiBvar, phiTvar, vectorized = vectorized, singular = singular)
  4. integral2(fun2, xmin = 0, xmax = 1, ymin = 0, ymax = 1, a = 1)

我不知道 .tensor 是什么,但它的产品 FUN(X,Y) 好像失去了 ...

这里出了什么问题?

a 正在匹配 integral2abstol 参数。只需将 a 重命名为 fun2 中的其他名称,如下面的解决方案 1 中所示,或者明确指定 abstol,这样它就不会像下面的解决方案 2 中那样混淆。

library(pracma)

# solution 1
fun2aa <- function(x, y, aa) (1 / aa) * exp(-x^2 - y^2)
integral2(fun2aa,
          xmin = 0,
          xmax = 1,
          ymin = 0,
          ymax = 1,
          aa = 1)$Q
## [1] 0.5577463

# solution 2
fun2 <- function(x, y, a) (1 / a) * exp(-x^2 - y^2) # same as in question
integral2(fun2,
          xmin = 0,
          xmax = 1,
          ymin = 0,
          ymax = 1,
          abstol = 0, # added
          a = 1)$Q
## [1] 0.5577463

请注意,如果 integral2 将点点点点 放在 abstol 之前,那么它就不会成为问题。这里 integral2aintegral2 相同,只是 dot 点放在 ymax 之后。

# solution 3

fun2 <- function(x, y, a) (1 / a) * exp(-x^2 - y^2) # same as in question

integral2a <- function (fun, xmin, xmax, ymin, ymax, ..., 
  sector = FALSE, reltol = 1e-06, abstol = 0, maxlist = 5000, 
  singular = FALSE, vectorized = TRUE) {}
body(integral2a) <- body(integral2)
environment(integral2a) <- environment(integral2)

integral2a(fun2,
          xmin = 0,
          xmax = 1,
          ymin = 0,
          ymax = 1,
          a = 1)$Q
## [1] 0.5577463