首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Maxwell-Boltzmann分布的直方图

Maxwell-Boltzmann分布的直方图
EN

Code Review用户
提问于 2020-04-16 13:12:06
回答 1查看 131关注 0票数 3

下面的C#源代码创建了Maxwell-Boltzmann分布的直方图:

代码语言:javascript
复制
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();
    }
}

请检查代码。

注:这条曲线似乎偏离了形状。

EN

回答 1

Code Review用户

发布于 2020-04-16 16:31:28

静态类

您已经(正确地)将Normalization标记为static。你应该对你程序中的每一个其他类做同样的事情--它们现在都被用作静力学。

表达体

C#有一个非常好的语法糖-- 表达体 --它允许您重写以下内容:

代码语言:javascript
复制
public static double MaxwellVariance(double mass, double temperature)
{
    return Math.Sqrt(KB * temperature / mass);
}

作为

代码语言:javascript
复制
public static double MaxwellVariance(double mass, double temperature) =>
    Math.Sqrt(KB * temperature / mass);

您在C#中,所以您无法拥有全局函数。它在某种程度上类似于Java :它确实促使您以面向对象的方式思考代码。

沿着这条路径,您将创建一个类来封装您的图形,这将从您的Main中提取大部分代码。潜在地,到并包括点列表初始化的所有内容都可能在构造函数中进行,而PlotForm调用可能在plot方法中进行。这种方法有一些优点,包括可重用性、可重用性和可测试性。

至于MaxwellBolzman,我认为你应该把它重构成一个非静态的类,有质量和温度的成员。可以接受random作为可选参数,或者类可以实例化它本身。这将简化许多事情:

  • Variance将变成带有表达式体的一行属性。
  • ComponentSpeed将变成无参数属性。

名称

这是次要的,但我发现Maxwell前缀在MaxwellBolzman的所有方法中都是多余的;我认为如果您简单地将它们命名为VarianceComponentSpeed,它们将更加清晰。

我会发现Speed更容易读懂

代码语言:javascript
复制
double sum = 0;
for (int i = 0; i < 3; i++) {
    double comp = Component;
    sum += comp*comp;
}
return Math.Sqrt(sum);
票数 2
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/240625

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档