下面的C#源代码创建了Maxwell-Boltzmann分布的直方图:
using System;
using System.Drawing;
using ZedGraph;
public class CommonDistributions
{
public static double Uniform(Random random)
{
return random.NextDouble();
}
static double Gaussian(Random random)
{
return Math.Sqrt(-2 * Math.Log(Uniform(random))) * Math.Cos(2 * Math.PI * Uniform(random));
}
public static double Gaussian(Random random, double mu, double sigma)
{
return sigma * Gaussian(random) + mu;
}
}
public class MaxwellBolzman
{
private static double KB = 1.38064852e-23;
public static double MaxwellVariance(double mass, double temperature)
{
return Math.Sqrt(KB * temperature / mass);
}
public static double MaxwellComponent(Random random, double mass, double temperature)
{
double mu = 0.0;
double sigma = MaxwellVariance(mass, temperature);
return CommonDistributions.Gaussian(random, mu, sigma);
}
public static double MaxwellSpeed(Random random, double mass, double temperature)
{
double one = MaxwellComponent(random, mass, temperature);
double two = MaxwellComponent(random, mass, temperature);
double thr = MaxwellComponent(random, mass, temperature);
return Math.Sqrt(one * one + two * two + thr * thr);
}
}
public static class Normalization
{
public static int Normalize(double n_bins, double mu, double sigma, double gaussian)
{
var z = (mu - gaussian)/sigma;
if (z > 3 || z < -3)
{
return -1;
}
else
{
return (int)((z + 3) * n_bins / 6d);
}
}
}
class Program
{
static void Main(string[] args)
{
const double N = 1000000;
int time = (int)N;
int binsCount = 51;
Random rand = new Random();
int[] bins = new int[binsCount];
double mass = 14 * 1.67e-27;
double T = 300;
for (int i = 0; i < time; i++)
{
double gauss = MaxwellBolzman.MaxwellSpeed(rand, mass, T);
double mu = MaxwellBolzman.MaxwellComponent(rand, mass, T);
double sigma = MaxwellBolzman.MaxwellVariance(mass, T);
int index = Normalization.Normalize(binsCount, mu, sigma, gauss);
if (index >= 0)
{
bins[index]++;
}
}
PointPairList list = new PointPairList();
for (int i = 0; i < bins.Length; i++)
{
list.Add(i, bins[i]);
}
PlotForm form = new PlotForm("Maxwell-Bolzman");
form.AddBar(list, "Actual", Color.Blue);
form.AxisChange();
form.ShowDialog();
}
}
请检查代码。
注:这条曲线似乎偏离了形状。
发布于 2020-04-16 16:31:28
您已经(正确地)将Normalization标记为static。你应该对你程序中的每一个其他类做同样的事情--它们现在都被用作静力学。
C#有一个非常好的语法糖-- 表达体 --它允许您重写以下内容:
public static double MaxwellVariance(double mass, double temperature)
{
return Math.Sqrt(KB * temperature / mass);
}作为
public static double MaxwellVariance(double mass, double temperature) =>
Math.Sqrt(KB * temperature / mass);您在C#中,所以您无法拥有全局函数。它在某种程度上类似于Java :它确实促使您以面向对象的方式思考代码。
沿着这条路径,您将创建一个类来封装您的图形,这将从您的Main中提取大部分代码。潜在地,到并包括点列表初始化的所有内容都可能在构造函数中进行,而PlotForm调用可能在plot方法中进行。这种方法有一些优点,包括可重用性、可重用性和可测试性。
至于MaxwellBolzman,我认为你应该把它重构成一个非静态的类,有质量和温度的成员。可以接受random作为可选参数,或者类可以实例化它本身。这将简化许多事情:
Variance将变成带有表达式体的一行属性。Component和Speed将变成无参数属性。这是次要的,但我发现Maxwell前缀在MaxwellBolzman的所有方法中都是多余的;我认为如果您简单地将它们命名为Variance、Component和Speed,它们将更加清晰。
我会发现Speed更容易读懂
double sum = 0;
for (int i = 0; i < 3; i++) {
double comp = Component;
sum += comp*comp;
}
return Math.Sqrt(sum);https://codereview.stackexchange.com/questions/240625
复制相似问题