How can I draw a histogram from Maxwell's distribution using C#?

  • Context: Engineering 
  • Thread starter Thread starter user366312
  • Start date Start date
  • Tags Tags
    Distribution Histogram
Click For Summary
SUMMARY

The discussion focuses on generating a histogram from Maxwell's distribution using C#. The provided code implements a simulation of the Maxwell-Boltzmann distribution, utilizing Gaussian random variables for particle velocities. The user encounters an issue with the histogram output, specifically related to the number of bins defined as 51, which may not accurately represent the expected distribution. The conversation highlights the need for a deeper examination of the code and assumptions to achieve the desired graphical representation.

PREREQUISITES
  • Understanding of Maxwell-Boltzmann distribution
  • Proficiency in C# programming
  • Familiarity with random number generation and Gaussian distributions
  • Knowledge of histogram plotting techniques
NEXT STEPS
  • Explore C# libraries for advanced histogram plotting, such as OxyPlot or LiveCharts
  • Learn about the statistical properties of the Maxwell-Boltzmann distribution
  • Investigate optimization techniques for random number generation in simulations
  • Study normalization methods for histogram data representation
USEFUL FOR

Data scientists, physicists, and software developers interested in statistical simulations and graphical data representation using C#.

user366312
Gold Member
Messages
88
Reaction score
3
Homework Statement
I need to create a histogram of Maxwell-Boltzman's distribution.
Relevant Equations
https://en.wikipedia.org/wiki/Maxwell%E2%80%93Boltzmann_distribution#Distribution_for_the_speed
I have written the following source code:

[CODE lang="csharp" title="Maxwell-Bolzman" highlight="79, 81"]using System;

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
{
static double KB = 1.38064852e-23;

static double MaxwellVariance(double mass, double temperature)
{
return Math.Sqrt(KB * temperature / mass);
}

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

PlotForm form = new PlotForm("Maxwell-Bolzman");
form.AddBar(list, "Actual", Color.Blue);
form.AxisChange();
form.ShowDialog();
}
}[/CODE]

It gives the following output:

fFjeQ.png


But, according to this link, the graph should look like the following:

k9539.png
 
Physics news on Phys.org
I didn't go through the code/algorithm in detail, but this line would seem to be the reason that the program cuts off there, no? Where did the number come from? Did you expect the distribution to be done by then? Also, are you wanting to plot all 4 distributions from the graph you posted? Sorry if it's obvious, but I didn't really go through your code and assumptions in much detail yet.

int binsCount = 51;
 

Similar threads

Replies
9
Views
2K
  • · Replies 4 ·
Replies
4
Views
2K
  • · Replies 2 ·
Replies
2
Views
5K
  • · Replies 1 ·
Replies
1
Views
2K
  • · Replies 5 ·
Replies
5
Views
11K