正如user1362215指出的那樣,你的函數應該包含在矩形中。如果增加n,則可以更接近解決方案。這是一個矢量化解決方案。結果在範圍內。
# Hit and miss
f <- function(x) x^(-0.5)
n <- 1000000
a <- 0.01
b <- 1
#ceiling(max(f((seq(0.01,1,by=0.001)))))
#[1] 10
set.seed(5)
x <- runif(n,a,b)
y <- 10*runif(n,0,1)
R <- sum(y < f(x))/n
(b-a)*10*R
#[1] 1.805701
# Repeat a few times to look at the distribution
set.seed(5)
n <- 100000
r <- replicate(1000,sum(10*runif(n,0,1) < f(runif(n,a,b)))/n *(b-a)*10)
hist(r)
summary(r)
# Min. 1st Qu. Median Mean 3rd Qu. Max.
# 1.755 1.792 1.800 1.800 1.809 1.845
# Sample mean method for comparison
set.seed(5)
r <- replicate(1000, mean(f(runif(n, a,b)))*(b-a))
hist(r)
summary(r)
# Min. 1st Qu. Median Mean 3rd Qu. Max.
# 1.788 1.798 1.800 1.800 1.803 1.813
回覆您的編輯:我假設X * 2 + Y^2,[-1,1]你指的是一個圓圈,而不是一個函數f(Z)。所以真的要通過模擬來估計單位圓/ Pi的面積。
f2 <- function(x) sqrt(1-x^2)
s <- seq(-1 , 1 ,by=0.001)
plot(s,f2(s))
# Get the max value of function within the range
c <- ceiling(max(f2(s)))
# [1] 1
n <- 1000000
a <- -1
b <- 1
set.seed(5)
x <- runif(n,a,b)
y <- c*runif(n,0,1)
R <- sum(y < f2(x))/n
(b-a)*c*R
#[1] 1.57063 # multiply it by 2 to get full area
pi/2
#[1] 1.570796
這是有幫助的。我從來沒有想過必須根據最小值/最大值來改變矩形。 我也有另外一個問題。相同的代碼 - 矢量化,並沒有使用任何「for」循環,給了我一個非常不同的答案。任何想法爲什麼? 下面的代碼: 'M <-100000 一個<-0.01 B'-1 set.seed(7063257) X <-runif(M,A,B) ý<-10 * runif (m,0,1) s <-ifelse(y <(x ^( - 0.05)),1,0) s <-sum(s)* 10 *(ba)/ m print(s) 我得到約1.038 – Raaj
你的力量有一個額外的零:-0.05而不是-0.5。如果此問題得到解決,您的代碼將起作用 – user20650