M1 <- 1.69683*0.424
"g2" <- function(u)
{x<-0.1*tan(pi*u*1.5)+0.9465}
"g" <- function(x)
{(1/(1.69683*pi*(0.1^2+(x-0.9465)^2)))}
n<-10
rand <- rep(0,n)
i <- 1
count <- 0
while(i<=n)
{u <- runif(1)
u1 <- runif(1)
x <- g2(u)
f<-exp(-0.5*(-2+log(x/(1-x)))^2)/(x*(1-x))
if(m*g(x)*u1<=f)
{rand[i] <- x
i <- i+1
}
else count <- count+1
}
此外,我总是收到此错误消息,有人可以解释原因吗?
if(m * g(x)* u1&lt; = f){的错误: 缺少需要TRUE / FALSE的值 另外:警告信息: 在log(x /(1 - x))中:产生NaNs
谢谢!
答案 0 :(得分:1)
函数g2(u)
在u = 1/3和1处具有渐近线,因此g2
可以取值> 1。因为你设置:
x <- g2(u)
f<-exp(-0.5*(-2+log(x/(1-x)))^2)/(x*(1-x))
f
时 g2 > 1
未定义(NAN),这会导致以下if
语句因您收到错误而失败。
我不确定你在这里要做什么,但一般来说你应该首先绘制你的函数以了解它们的行为方式。例如,
z <- seq(0,.999,.001)
plot(z,g2(z), type="l")
会在某些情况下立即向您显示g2 >1
。