0

まず、教授が間違った質問をしたかどうかはわかりません。とにかく、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)

ゼロに近い結果を拒否したため、明らかにコードが間違っています。

したがって、私の質問は、私のコードを修正して正しく計算できるかどうか、そうでない場合は、それを行う別の方法があるかどうかです。どんな援助でも大歓迎です。

4

1 に答える 1