如何从麦克斯韦分布中绘制直方图?

时间:2020-04-15 19:50:55

标签: c# probability-distribution

This是我以前关于Maxwell发行版的问题,您可以在其中找到源代码。

以下代码旨在从Maxwell分布中获取直方图,该直方图在上述代码的基础上起作用。

using ZedGraph;

public static class Normalization
{
    public static int Normalize(double n_bins, double mu, double sigma, double gaussian)
    {
        var z = (gaussian - mu) / 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.Next(rand, mass, T);

            int index = Normalization.Normalize(binsCount, mass, T, 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();
    }
}

输出:

根据this link,图形应如下所示:

enter image description here

1 个答案:

答案 0 :(得分:1)

正如我在上一个问题中所说,使用单元分析来查找错误。那是很好的建议,现在也是很好的建议。

让我们检查一下您的方法:

public static int Normalize(
  double n_bins, 
  double mu,  
  double sigma, 
  double gaussian)

它返回bin索引,因此应该是整数。

需要一个bin计数;应该是整数,而不是双精度数。这不是物理量。

什么是亩?这是分布的平均值。有什么分布?速度所以亩的单位是米/秒。

什么是西格玛?这是速度分布的标准偏差,因此也具有米/秒的单位。

什么是高斯?它是来自分布的样本,因此也具有每秒米的单位。

但是在您的通话中:

Normalization.Normalize(binsCount, mass, T, gauss);

您已通过垃圾箱计数-正确。

您已经传递了质量-我们期望的是每秒米,您已经传递了公斤,所以这不可能是正确的。

您已经通过了温度-我们期望的是每秒米,而您已经通过了Kelvin,所以这不可能正确。

您已经通过了一个示例,这是正确的。

您应该通过的是您在上一个答案中计算出的平均速度,以及速度的标准偏差,您可以估算这些速度,因为已知标准偏差为1速度的一个分量,这是一个很好的猜测。

再次:单元分析是发现错误的强大工具。我希望C#可以更轻松地将单位分配给double。这些问题然后会被编译器捕获。 F#具有此功能,非常好。


更新:引起我注意的是,原始张贴者无法理解单元分析的意思。

单元分析是一种将“类型”与物理问题中的每个数量相关联,然后在问题中跟踪该类型的技术。如果在任何时候发现您有“混合”类型,则说明存在问题。

单位分析的基本规则是,只有 sum 个单位具有相同的单位,并且单位乘和除都是使用标准的乘法和除法规则。

例如,假设我们有一些数量:10公斤,5米,2秒。假设我们将公斤乘以米,再除以秒;一个质量为10kg的物体在2秒内移动5米的动量为每秒25 千克

如果稍后在我们的问题中有一个量,即能量,并且我们错误地将动量添加到能量中,则单位分析将告诉我们这是错误的。 25 kg*m/s不能添加到任何以 energy 为单位的事物,因为能源的单位为kg*m*m/(s*s),所以我们知道我们在某个地方犯了错误。

同样,在上一个问题中,我指出我们可以使用单位分析来确定何时以克为单位进行计算,但是我们希望以千克为单位。在那种情况下,至少我们有两个都是质量的东西,但是当期望公斤时使用克是一个严重的错误,并且单位分析可以检测到这个问题。

这在编程中特别有用,因为正如我们刚刚看到的那样,如果您拥有一个需要速度的方法并且将其传递给温度的方法很容易犯错,那是毫无意义的。幸运的是,您传递的300K值恰好在正确的范围内,因为300m / s也是氮分子的合理速度。但这是运气。正确的做法是弄清楚传入的正确速度是什么。

相关问题