まず、教授が間違った質問をしたかどうかはわかりません。とにかく、F(x)~U(0,1)
CDFを生成しようとしましたF(x)=1-(1+x)exp(-x)
(この CDF についてはx=g(F(x))
、手計算では計算できませんでした)。そしてF(x)
、質問が望むものを達成するために根を計算します。
0
からまでINF
のルート範囲uniroot()
は論外だからです。したがって、ニュートン法を使用して記述します。
次に、私のコードは次のようになります。
f=function(x) {
ifelse(x>=0,x*exp(-x),0)
}
in.C=function(n) {
a=runif(n)
G=NULL
for(i in 1:n) {
del=1
x=2
while(abs(del)>1e-12){
del=(1-(1+x)*exp(-x)-a[i])/f(x)
x=x-del
}
G[i]=x
}
G
}
system.time(tt<-in.C(100000))
ただし、F(x)
が小さすぎてニュートン法の 1 ステップで結果が 0 未満になると、エラーが発生します。さらに、次のようにコードを修正しました。
f=function(x) {
ifelse(x>=0,x*exp(-x),0)
}
in.C=function(n) {
a=runif(n)
G=NULL
for(i in 1:n) {
del=1
x=2
while(abs(del)>1e-12){
if(x>=0){ del=(1-(1+x)*exp(-x)-a[i])/f(x)
x=x-del
}
else break
}
if(x>=0) G[i]=x
}
G[!is.na(G)]
}
system.time(tt<-in.C(100000))
hist(tt, breaks=70, right=F, freq=F)
curve(f(x),from=0,to=20,add=T)
ゼロに近い結果を拒否したため、明らかにコードが間違っています。
したがって、私の質問は、私のコードを修正して正しく計算できるかどうか、そうでない場合は、それを行う別の方法があるかどうかです。どんな援助でも大歓迎です。