你最好使用
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
.
有其他方法可以对麦克斯韦进行采样:
-
认识到,三平方高斯和可以表示为
Chi
2
distribution
具有3个自由度和样本v
2.
通过
gsl_ran_chisq(r, 3)
.
-
样品五
2.
Gamma distribution
通过
gsl_ran_gamma_knuth(r, 3./2., 1.0)
.
维基百科上也有这样的描述:
https://en.wikipedia.org/wiki/Maxwell%E2%80%93Boltzmann_distribution