C 中具有麦克斯韦分布的随机数
Random numbers with Maxwell distribution in C
我需要一个服从麦克斯韦分布的 10000 随机数。
对于正态分布,我知道我必须使用 Box-Muller 变换,但我的问题是为什么
normal_distribution
默认定义为变量(或任何我不知道的)?
"normal_distribution" 是一个给出正态分布数字的函数吗?如果是,这可能适用于麦克斯韦分布吗?如果没有,我该怎么办?
事实上,我想学习如何在 C 中使用麦克斯韦分布创建随机数。
感谢您的任何提示。
您最好使用 GNU Scientific Library. It is reasonable written and tested computational library in pure 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)d3v = C exp(- m v2/2 kBT) d3v
要从这个得到麦克斯韦分布,你可以在 v
坐标上表达球面分布,幂项基本上来自雅可比矩阵。但是很容易看出它相当于每个分量的三个高斯分布的乘积。我将向您推荐以下页面 https://farside.ph.utexas.edu/teaching/sm1/Thermalhtml/node87.html and formula 7.217 in particular. Here is another link to friendly discussion https://scicomp.stackexchange.com/questions/19969/how-do-i-generate-maxwell-boltzmann-variates-using-a-uniform-distribution-random.
还有其他方法可以对 Maxwell 进行采样:
认识到,高斯的三平方和可以表示为具有 3 个自由度的 Chi2 distribution,样本 v2 通过 gsl_ran_chisq(r, 3)
.
样本 v2 作为 Gamma distribution 通过 gsl_ran_gamma_knuth(r, 3./2., 1.0)
的结果。
而且维基百科总是有所有这些内容:https://en.wikipedia.org/wiki/Maxwell%E2%80%93Boltzmann_distribution
我需要一个服从麦克斯韦分布的 10000 随机数。 对于正态分布,我知道我必须使用 Box-Muller 变换,但我的问题是为什么
normal_distribution
默认定义为变量(或任何我不知道的)? "normal_distribution" 是一个给出正态分布数字的函数吗?如果是,这可能适用于麦克斯韦分布吗?如果没有,我该怎么办? 事实上,我想学习如何在 C 中使用麦克斯韦分布创建随机数。 感谢您的任何提示。
您最好使用 GNU Scientific Library. It is reasonable written and tested computational library in pure 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)d3v = C exp(- m v2/2 kBT) d3v
要从这个得到麦克斯韦分布,你可以在 v
坐标上表达球面分布,幂项基本上来自雅可比矩阵。但是很容易看出它相当于每个分量的三个高斯分布的乘积。我将向您推荐以下页面 https://farside.ph.utexas.edu/teaching/sm1/Thermalhtml/node87.html and formula 7.217 in particular. Here is another link to friendly discussion https://scicomp.stackexchange.com/questions/19969/how-do-i-generate-maxwell-boltzmann-variates-using-a-uniform-distribution-random.
还有其他方法可以对 Maxwell 进行采样:
认识到,高斯的三平方和可以表示为具有 3 个自由度的 Chi2 distribution,样本 v2 通过
gsl_ran_chisq(r, 3)
.样本 v2 作为 Gamma distribution 通过
gsl_ran_gamma_knuth(r, 3./2., 1.0)
的结果。
而且维基百科总是有所有这些内容:https://en.wikipedia.org/wiki/Maxwell%E2%80%93Boltzmann_distribution