在C中生成具有Maxwell分布的随机数

时间:2017-11-12 16:48:25

标签: c random distribution numerical-methods

我需要随Maxwell分布分布的10000个随机数。 对于正态分布,我知道我必须使用Box-Muller变换,但我的问题是为什么

 normal_distribution

默认定义为变量(或我不知道的任何东西)? “normal_distribution”是一个给出正态分布数的函数吗?如果是,麦克斯韦分布是否可行?如果没有,我该怎么办? 事实上,我想学习如何使用C中的Maxwell分布创建随机数。 感谢您的任何提示。

1 个答案:

答案 0 :(得分:5)

你最好的选择是使用GNU Scientific Library。它是纯C中合理的书面和测试计算库。Maxwell distribution基本上是三个正态分布的组件的平方和求和。

一些未经测试的代码:

#include <math.h>
#include <stdio.h>
#include <gsl/gsl_rng.h>

double sample_maxwell(gsl_rng* r, double sigma) {
    double vx = gsl_ran_gaussian_ziggurat(r, sigma);
    double vy = gsl_ran_gaussian_ziggurat(r, sigma);
    double vz = gsl_ran_gaussian_ziggurat(r, sigma);

    return sqrt(vx*vx + vy*vy + vz*vz);
}

int main() {
    gsl_rng_env_setup();

    const gsl_rng_type* T = gsl_rng_default;
    gsl_rng*            r = gsl_rng_alloc(T);

    printf ("generator type: %s\n", gsl_rng_name (r));
    printf ("seed = %lu\n", gsl_rng_default_seed);
    printf ("first value = %lu\n", gsl_rng_get (r));        

    double Temperature = 300.0;   // K
    double kBoltzmann  = 8.62e−5; // eV/K
    double mass        = 1.0e+9;  // 1GeV/c^2, roughly atomic hydrogen

    double sigma = sqrt(kBoltzmann*Temperature/mass);

    for(int k = 0; k != 100; ++k) {
        double v = sample_maxwell(r, sigma);
        printf("%e", v);
    }

    gsl_rng_free(r);        

    return 0;
}

麦克斯韦分布来自统计物理学,其中气体分子具有速度v而玻尔兹曼指数达到速度分布

f(v)d 3 v = C exp( - mv 2 / 2 k B T)d 3 < / SUP> v

为了从这一个得到麦克斯韦分布,你可以在v坐标上表示球形分布,功率项基本上来自雅可比。但是很容易看出它相当于每个组件的三个高斯分布的乘积。我将特别推荐您阅读以下页面https://farside.ph.utexas.edu/teaching/sm1/Thermalhtml/node87.html和公式7.217。以下是友好讨论的另一个链接https://scicomp.stackexchange.com/questions/19969/how-do-i-generate-maxwell-boltzmann-variates-using-a-uniform-distribution-random

有其他方法可以对Maxwell进行采样:

  1. 认识到,三个平方高斯的和可以表示为Chi2 distribution,具有3个自由度,样本v 2 可以通过gsl_ran_chisq(r, 3)表示。

  2. 样本v 2 作为Gamma distribution通过gsl_ran_gamma_knuth(r, 3./2., 1.0)的结果。

  3. 总有维基百科所有这些都被陈述:https://en.wikipedia.org/wiki/Maxwell%E2%80%93Boltzmann_distribution