代码之家  ›  专栏  ›  技术社区  ›  S. Hesam

C中麦克斯韦分布的随机数

  •  3
  • S. Hesam  · 技术社区  · 7 年前

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

     normal_distribution
    

    默认情况下是否定义为变量(或我不知道的任何内容)? “正态分布”是给出正态分布数字的函数吗?如果是,这是否适用于麦克斯韦分布?如果没有,我该怎么办? 事实上,我想学习如何用C中的麦克斯韦分布创建随机数。 谢谢你的提示。

    1 回复  |  直到 4 年前
        1
  •  7
  •   Severin Pappadeux    7 年前

    你最好使用 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(-m v) 2. B T) d 3. 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 .

    有其他方法可以对麦克斯韦进行采样:

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

    2. 样品五 2. Gamma distribution 通过 gsl_ran_gamma_knuth(r, 3./2., 1.0) .

    维基百科上也有这样的描述: https://en.wikipedia.org/wiki/Maxwell%E2%80%93Boltzmann_distribution