我想用矩阵输出计算函数的双积分。我的代码在这里:
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'分成两个功能并不是我想要的。提前致谢!
答案 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)
。