跳至内容
Code-04 Alea 使用指南

Code-04 Alea 使用指南

ALEA 库

Alea 库可以用于

  • 进行蒙特卡洛测量
  • 通过分箱分析(Jackknife 分析)计算误差和自相关时间
  • 计算测量量的函数的平均值和误差

蒙特卡洛测量

在 C++ 代码中通过以下方式包含 ALEA 库

#include <alps/alea.h>

首先需要创建一个观测量

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

其中构造函数的参数表示观测量的名称。使用 “«” 运算符即可方便地向观测量中添加测量值。例如

obs_a << 1.2;

会将数值 1.2 添加到观测量 obs_a 中。

每个蒙特卡洛模拟都需要热化。在一定数量的热化步之后,需要通过以下方式重置观测量

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;       
}

观测量的函数

可以对观测量的函数进行求值。首先需要从包含测量值的观测量创建观测量求值器(observable evaluator)。例如,假设我们已经向 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” 中找到。