Как я могу нарисовать гистограмму из распределения Максвелла? - PullRequest
0 голосов
/ 15 апреля 2020

Этот был моим предыдущим вопросом о распределении Максвелла, где вы можете найти исходный код.

Следующий код предназначен для получения гистограммы из распределения Максвелла, которая работает поверх этого вышеупомянутого кода.

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();
    }
}

Вывод:

image

According to эта ссылка , график должен выглядеть следующим образом:

enter image description here

1 Ответ

0 голосов
/ 15 апреля 2020

Как я уже говорил в вашем последнем вопросе, используйте анализ единиц, чтобы найти свои ошибки . Тогда это был хороший совет, и теперь это хороший совет.

Давайте рассмотрим ваш метод:

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

Возвращает индекс бина, поэтому это должно быть целое число.

Требуется количество бинов; это должно быть целое число, а не двойное. Это не физическая величина.

Что такое му? Это средство распределения. Какое распределение? Скорость. Итак, у мю есть единицы метров в секунду.

Что такое сигма? Это стандартное отклонение распределения скоростей, поэтому оно также имеет единицы измерения метров в секунду.

Что такое гауссов? Это образец из распределения, поэтому он также имеет единицы метров в секунду.

Но в вашем звонке:

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

Вы прошли счетчик бинов - это правильно.

Вы прошли массу - мы ожидаем метров в секунду, и вы прошли килограммы, так что это не может быть правильным.

Вы прошли температуру - мы ожидаем метров в секунду, и вы прошли Кельвин, так что это не может быть правильным.

И вы прошли образец, так что это правильно.

То, что вы должны пройти, это средняя скорость , которую вы рассчитали в своем последнем ответе, и стандартное отклонение скорости, которое вы оценили, потому что у вас есть известное стандартное отклонение одного компонента скорости, и этого достаточно угадайте.

Опять же: Единичный анализ - мощный инструмент для поиска ошибок . Я sh C# упростила назначение единиц в двойники; такого рода проблемы будут затем обнаружены компилятором. У F # есть эта особенность, и это очень приятно.


ОБНОВЛЕНИЕ: до меня дошло, что оригинальный плакат не понимает, что я имею в виду под анализом единицы .

Единичный анализ - это метод связывания «типа» с каждой величиной в физической задаче, а затем отслеживание этого типа в рамках задачи. Если в какой-то момент вы обнаружите, что у вас есть «перепутанные» типы, вы знаете, что есть проблема.

Основными c правилами анализа единиц являются только единицы сумма с идентичные единицы и единицы умножают и делят , используя стандартные правила умножения и деления.

Например, предположим, что у нас есть некоторые количества: 10 килограмм, 5 метров, 2 секунды. Предположим, мы умножаем килограммы на метры и делим на секунды; импульс объекта, масса которого 10 кг движется со скоростью 5 метров за 2 секунды, составляет 25 килограмм в секунду .

Если позже в нашей задаче у нас будет количество, скажем, энергия и мы добавляем импульс энергии по ошибке , наш анализ единиц говорит нам, что это неправильно. 25 kg*m/s нельзя добавить к чему-либо, у кого есть единицы энергии , потому что у энергии есть единицы kg*m*m/(s*s), и поэтому мы знаем, что где-то допустили ошибку.

Аналогично, в предыдущем В вопросе я отметил, что мы можем использовать анализ единиц, чтобы определить, когда мы делаем вычисления в граммах, но мы ожидаем, что значение в килограммах. В этом случае, по крайней мере, у нас есть две вещи, которые обе являются массовыми, но использование граммов, когда ожидаются килограммы, является серьезной ошибкой, и модульный анализ может обнаружить эту проблему.

Это особенно полезно в программировании, поскольку мы только что увидели, что очень легко ошибиться, если у вас есть метод, который использует скорость, а вы передаете ей температуру, которая не имеет смысла. Это была просто удача, что 300K, значение, которое вы указали для скорости, оказалось на правильном уровне, поскольку 300 м / с - это также разумная скорость для молекулы азота. Но это была удача . Правильнее всего выяснить, с какой скоростью нужно двигаться.

...