R:具有矩阵输出的函数的双积分

时间:2017-06-19 01:19:32

标签: r

我想用矩阵输出计算函数的双积分。我的代码在这里:

foo <- function(x,t){
  out1 <- sin(x*t)
  out2 <- cos(x*t)
  out <- matrix(c(out1,out2),ncol=2)
  return(out)
}
library(pracma)
quad2d(foo, xa = 0, xb = 1, ya = 0, yb= 10)

当我运行此代码时,收到一条消息:

  

wx%*%Z出错:不一致的参数

我想知道如何计算这个双积分? 'foo'只是一个简单的例子;将'foo'分成两个功能并不是我想要的。提前致谢!

2 个答案:

答案 0 :(得分:0)

可能有一种优雅的方式将函数矩阵作为函数quad2d的第一个参数传递!我不知道,但我可以重新编写代码以获得相同的结果:

mquad2d <- function(xa, xb, ya, yb){
  fun1 <- function(x,t){
    return(sin(x*t))
  }
  fun2 <- function(x, t){
    return(cos(x*t))
  }
  out1 <- quad2d(fun1, xa, xb, ya, yb)
  out2 <- quad2d(fun2, xa, xb, ya, yb)
  out <- matrix(c(out1,out2),ncol=2)
  return(out)
}
mquad2d(xa = 0, xb = 1, ya = 0, yb= 10)
#output:
#         [,1]     [,2]
#[1,] 2.925257 1.658348

希望这有帮助!

答案 1 :(得分:0)

quad2d在内部应用高斯求积法,但需要对函数进行矢量化。相反,您可以明确地应用正交规则。

假设矩阵值函数foo定义为

foo <- function(x, t)
            matrix(c(sin(x*t), cos(x*t), x, t), 2, 2)

直接使用高斯求积法则:

library(pracma)
n <- 32
xa <- 0; xb <- 1; ya <- 0; yb <- 10

cx <- gaussLegendre(n, xa, xb)
x <- cx$x; wx <- cx$w
cy <- gaussLegendre(n, ya, yb)
y <- cy$x; wy <- cy$w

I <- matrix(0, 2, 2)
for (i in 1:n) {
    for (j in 1:n) {
        I <- I + wx[i] * wy[j] * foo(x[i], y[j])
    }
}
I
##          [,1] [,2]
## [1,] 2.925257    5
## [2,] 1.658348   50

这可能比quad2d慢一点,因为有两个for循环,但如果你的函数表现得好一些就足够了。

当然,所有这些都可以包含在一个新的集成例程中,例如
mquad2d(f, xa, xb, ya, yb, n = 32)