s.h*_*sam 3 c random distribution numerical-methods
我需要随Maxwell分布分布的10000个随机数.对于正态分布,我知道我必须使用Box-Muller变换,但我的问题是为什么
normal_distribution
Run Code Online (Sandbox Code Playgroud)
默认情况下被定义为变量(或我不知道的任何东西)?"normal_distribution"是一个给出正态分布数的函数吗?如果是,麦克斯韦分布是否可行?如果没有,我该怎么办?事实上,我想学习如何使用C中的Maxwell分布创建随机数.感谢任何提示.
您最好的选择是使用GNU Scientific Library.它是纯粹C中合理的书面和测试计算库.Maxwell分布基本上是三个正态分布的组件的平方和求和.
一些未经测试的代码:
#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;
}
Run Code Online (Sandbox Code Playgroud)
麦克斯韦分布来自统计物理学,其中气体分子具有速度,v而玻尔兹曼指数达到速度分布
F(V)d 3 V =ÇEXP( - MV 2 /2 k 乙 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.
有其他方法可以对Maxwell进行采样:
认识到,三平方高斯的和可以表示为具有3个自由度的Chi 2分布和样本v 2 via gsl_ran_chisq(r, 3).
试样V 2作为结果Gamma分布通过gsl_ran_gamma_knuth(r, 3./2., 1.0).
而维基百科也总是在这里陈述所有这些:https://en.wikipedia.org/wiki/Maxwell%E2%80%93Boltzmann_distribution