準モンテカルロ法

 投稿者:S.S  投稿日:2010年 4月 6日(火)13時09分16秒
  モンテカルロ法で定積分の値を(例えば被積分関数y=x^2,積分範囲0<=x<=1)
求めることはできるのですが同じことを準モンテカルロ法で行う場合はどんな
プログラムを組めばいいのでしょうか。急ぎませんので暇があれば
ご回答くだされば助かります。
 

Re: 準モンテカルロ法

 投稿者:山中和義  投稿日:2010年 4月 6日(火)16時32分24秒
  > No.1154[元記事へ]

S.Sさんへのお返事です。

> モンテカルロ法で定積分の値を(例えば被積分関数y=x^2,積分範囲0<=x<=1)
> 求めることはできるのですが同じことを準モンテカルロ法で行う場合はどんな
> プログラムを組めばいいのでしょうか。
!準モンテカルロ法 ∫[0,1]f(x)dx=1/N*Σ[i=1,N]f(xi)

DEF f(x)=x^2 !被積分関数 1/3

LET ITER=1000 !発生個数

LET UINT_MAX=2^32-1 !4294967295UL
LET s=0
FOR n=0 TO ITER-1
   LET g2n=0 !超一様分布列 ヴァンデルコープット列(van der Corput)
   FOR i=0 TO 30
      LET g2n=(g2n+REMAINDER(r_sft(n,i),2))*2
   NEXT i
   IF REMAINDER(r_sft(n,31),2)=1 THEN LET g2n=g2n+1

   LET x=g2n/(UINT_MAX+1) !区間[0,1)={0,1/2,1/4,3/4,1/8,5/8,3/8,7/8,1/16,9/16,5/16,13/16,…}
   !!!PRINT x !debug

   LET s=s+f(x) !Σf
   PRINT s/(n+1)
NEXT n
!PRINT s/ITER !結果を表示する

FUNCTION r_sft(n,i) !C言語 n>>i 等価
   LET r_sft=IP(n/2^i)
END FUNCTION

END

ヴァンデルコープット列の生成は、こちらの方が分かりやすいと思います。
!準モンテカルロ法 ∫[0,1]f(x)dx=1/N*Σ[i=1,N]f(xi)

DEF f(x)=x^2 !被積分関数 1/3

LET ITER=1000 !発生個数

LET UINT_MAX=2^32-1 !4294967295UL ※32bit
LET s=0
FOR n=0 TO ITER-1
   LET g2n=0 !超一様分布列 ヴァンデルコープット列(van der Corput)
   LET a=n
   FOR i=1 TO 32 !2進法への変換より、ビット列の並びを反転(逆順に)する
      LET aa=INT(a/2)
      LET g2n=g2n*2+(a-aa*2) !下位桁を上位桁へ
      LET a=aa
   NEXT i
   !!!PRINT n;g2n,right$(REPEAT$("0",32)&BSTR$(g2n,2),32) !debug

   LET x=g2n/(UINT_MAX+1) !区間[0,1)={0,1/2,1/4,3/4,1/8,5/8,3/8,7/8,1/16,9/16,5/16,13/16,…}
   !!!PRINT x !debug

   LET s=s+f(x) !Σf
   !PRINT s/(n+1)
NEXT n
PRINT s/ITER !結果を表示する

END

参考 モンテカルロ法による数値積分 No.31 [元記事へ]
 

Re: 準モンテカルロ法

 投稿者:S.S  投稿日:2010年 4月 7日(水)11時21分23秒
  > No.1155[元記事へ]

山中和義さんへのお返事です。
お忙しい中、早速のご回答ありがとうございました。
大変助かりました。
 

戻る