数値シミュレーション入門 --計算機実習--
柴田章博、松古栄夫
線形合同法は、整数の一様乱数を生成するポピュラーな方法で、適当な初期値
を出発点とする次の漸化式で与えられるbook:Okumura
この漸化式で、
の整数を次々と生成することができる。
ここで演算
は
整数
を整数
で割ったときの剰余をあらわす。
が、2の累乗であるならば、
を5ないし3(5が安全)として、定数項は奇数とする。このとき周期がちょうど
である、その周期に
から
の整数が1つづつ現れることが知られている。ref:ICM
線形合同法の
下位ビットを見ている乱数の周期は高々
ビットであり、線形合同法では
ことに注意する必要がある。
のとき、
のとりかたとして、
などがある。Cの unsigned long
の算術で
の線形合同法の演算は正しい下位ビットを与えることが保障されている。高速にするには、
と選ぶ方法がある。
しかしながら、「高級言語」での実装は一般には簡単ではない。なぜなら、積をとるとよりも大きな数となり桁あふれを起こし、正しい下位ビットを与えないからである。この問題を回避する方法として、Schrage'sのアルゴリズムが知られている。
と
を分解して計算をする。ここで、記号
は、
を超えない最大の整数、
は
を
で割った剰余である。もし
(
が小さく、
が
満たす整数であるとすれば、
と
はともに、
と
の間の数とすることができる。まとめて書くと次のように与えられる。
このようなポータブルな生成ルーチンのパラメータは次のものが知られている。NRinC/C++
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
さらに、乱数の切り混ぜを行って周期の長い乱数を生成する方法がある。
最も簡単な正規分布の生成法は、0と1の間の一様乱数
Uを12個をたして6を引く方法がある。これは、一様乱数に限らず、ランダムな数を多数加えると正規分布に近づくという中心極限定理を利用したものである。一様乱数は平均
分散
となるので、12個をたして6を引くとちょうど平均0分散1の乱数になる。
よりよい正規分布の生成法として、ボックス・ミュラー法が知られている。BoxMuller このアルゴリズムの概要は次のとおり。
それぞれ独立な平均ゼロ、分散1の正規分布を
とすると、同時分布は
であたえられる。これを局座標で表示すると、
であり、同時分布は
に比例する。密度関数が、
(
)に比例する分布関数は、
で積分してつぎであたえられる。
as
であるような、乱数
を作るには、
の一様乱数を分布関数の逆関数で変換して、
として得ることができる。したがって、これから
をえるには、
の一様乱数をもとめ、
とする。
または、
の一様乱数
を生成し、
をみたす
を選ぶ。この
から
を計算し、
をとると、正規分布が2つ同時に得られる。
サンプルプログラムを参考に一様乱数を生成するプログラムを作成せよ。一様乱数を発生しヒストグラムを作成し、一様乱数が発生をしていることを確かめよ。
正規分布
を発生させて期待値、分散を計算せよ
ヒストグラムを作成し、正規分布を与える度数分布とともにプロットし正規分布が正しく生成されることを確かめよ。
,
とするとき、
を求めよ。データのばらつきを正規分布を仮定して、分散を用いて誤差を見積もる意味を考えよ。
2種類の方法を用いて、円周率を計算せよ。それぞれの場合において、サンプリング数を変えて真の値との差をプロットせよ。
半径1の円とそれに外接する正方形を考える。サイコロを振って正方形内の点を生成したときに、それが円の中にある確立は、正方形の面積と円の面積の比である。
一様乱数によるモンテカルロ積分のプログラムを作成せよ。次の積分をモンテカルロ積分を行うことでを計算せよ。
[発展
]区間を
分割して、各区間の中点
で
となるようなヒストグラムで与えられる分布関数を
とする。
でサンプリング点を生成するプログラムを作成せよ。
正しくサンプルポイントを生成できていることをヒストグラムを描いて確認せよ。
分布関数に従うサンプリングポイントを使って、重点サンプリングを用いて
を計算せよ。
サンプルプログラムを参考に、次の手順によって、2次元
の格子上にあるイジングモデルのシミュレーションを実行せよ。
熱浴法(heat bath)によって配位を生成するプログラムを作成せよ。
配位を、cold stat で生成し、配位の変化する様子を可視化して調べよ。
Metropolis 法によって配位を更新するプログラムを作成し、配位の更新の様子を可視化して調べよ。
各モンテカルロスウィープ(sweeep)において、スピンの時空間平均
を計算し、その変化をプロットせよ。
すべてのスピンが上向きでそろった状態(cold
start)から,さまざまな)
でシミュレーションを実行し磁化
を計算せよ。また、
と磁化をの関係をグラフしなさい。
それぞれのにおいて、磁化を計算せよ
それぞれのにおいて、比熱を計算せよ。
それぞれのにおいて、磁化率を計算せよ。