如何使用命中率和未命中以及Halton近似解决R中的双积分?

时间:2019-03-05 08:47:40

标签: r integral

我有以下问题:

enter image description here

我要做的是:

for _, v := range []int16{4336, -129, 8079} {
    fmt.Printf("Source    : %v\n", v)
    fmt.Printf("Source hex: %4x\n", uint16(v))
    fmt.Printf("Result hex: %4x\n", uint8(int8(v)))
    fmt.Printf("Result    : %4v\n", uint8(int8(v)))
    fmt.Println()
}

那我不知道如何进行。有人可以告诉我该怎么做吗?谢谢!

1 个答案:

答案 0 :(得分:1)

积分的蒙特卡洛近似如下:

set.seed(1)
f <- function(x,y) x^y * y^x

N <- 10000
mean(f(runif(N), runif(N)))
# 0.4293375

这可能是问题中所谓的“统一方法”。

与数值逼近进行比较(更好):

library(cubature)
f <- function(xy){
  x <- xy[1]; y <- xy[2]
  x^y * y^x
} 
integral <- pcubature(f, lowerLimit = c(0,0), upperLimit = c(1,1))
integral$integral
# 0.4280186

Wolfram|Alpha给出0.42802

现在,通过采样Halton序列获得的近似值:

library(randtoolbox)
setSeed(1)
xy <- halton(n = N, dim = 2)
f <- function(x,y) x^y * y^x
mean(f(xy[,1], xy[,2]))
# 0.4277797

请注意,我不确定这是否是理想的答案,因为我还不知道什么是“命中或错过”方法。

编辑

我看了命中或遗漏方法。它包括在3D空间中采样点,并获取这些点在f定义的表面以下的比例。这里的函数f取[0,1]中的值,因此近似值如下:

library(randtoolbox)
setSeed(1)
xyz <- halton(n = N, dim = 3)
f <- function(x,y) x^y * y^x
mean(f(xyz[,1],xyz[,2]) > xyz[,3])
# 0.4287