Tutorials:AleaHOWTO/ja

From ALPS
Jump to: navigation, search

ALEAライブラリ

Alea ライブラリは次の機能をもちます。

  • モンテカルロ法における物理量の測定
  • ビニング解析を用いたモンテカルロ平均の誤差と自己相関時間の計算
  • ジャックナイフ法を用いた、モンテカルロ平均の関数の平均値と誤差の計算

モンテカルロ計算の測定

C++で、ALEAライブラリをインクルードします。

#include <alps/alea.h>

まず、物理量を保存する変数を生成する必要があります。

alps::RealObservable obs_a("observable a");

ここで、コンストラクタの引数には物理量の名前を与えます。 モンテカルロ法でサンプリングした値は簡単に "<<"演算子を使用して、物理量に追加できます。例えば

obs_a << 1.2;

とすると、物理量 obs_aに 1.2 という値が追加されます。

すべてのモンテカルロシミュレーションは熱平衡化を必要とします。 何ステップかの平衡化過程の後、 物理量を次のようにリセットしなければなりません。

obs_a.reset(true);

物理量の出力は次のように記述してください。

std::cout << obs_a;

以下が完全なサンプルコードです。

#include <iostream>
#include <alps/alea.h>
#include <boost/random.hpp> 

int main()
{
 //DEFINE RANDOM NUMBER GENERATOR
 typedef boost::minstd_rand0 random_base_type;
 typedef boost::uniform_01<random_base_type> random_type;
 random_base_type random_int;
 random_type random(random_int);

 //DEFINE OBSERVABLE
 alps::RealObservable obs_a("observable a");

 //ADD 1000 MEASUREMENTS TO THE OBSERVABLE
 for(int i = 0; i < 1000; ++i){ 
   obs_a << random();
 }

 //RESET OBSERVABLES (THERMALIZATION FINISHED)
 obs_a.reset(true);

 //ADD 10000 MEASUREMENTS TO THE OBSERVABLE
 for(int i = 0; i < 10000; ++i){
   obs_a << random();
 }

 //OUTPUT OBSERVABLE
 std::cout << obs_a;       
}

期待値の関数

物理量の期待値を引数に取る関数を作成することができます。 例えば、obs_a,obs_bの値から、obs_c=obs_a/obs_bを計算したい場合、次のようにします。

alps::RealObsevaluator obseval_a(obs_a);
alps::RealObsevaluator obseval_b(obs_b);
alps::RealObsevaluator obseval_c;
obseval_c = obseval_b / obseval_a;
std::cout << obseval_c;

シンプルなサンプルプログラムはALPSソースディレクトリ"test/alea"にあります。