From eb537256b9a53836996619f5508c8d955e243fb5 Mon Sep 17 00:00:00 2001 From: Superbest Date: Tue, 24 Dec 2013 05:10:04 -0600 Subject: [PATCH] Added triangular distribution example (this time for real) Signed-off-by: Superbest --- .../TriangularDistribution.cs | 145 ++++++++++++++++++ 1 file changed, 145 insertions(+) create mode 100644 src/Examples/ContinuousDistributions/TriangularDistribution.cs diff --git a/src/Examples/ContinuousDistributions/TriangularDistribution.cs b/src/Examples/ContinuousDistributions/TriangularDistribution.cs new file mode 100644 index 00000000..bd4c78a0 --- /dev/null +++ b/src/Examples/ContinuousDistributions/TriangularDistribution.cs @@ -0,0 +1,145 @@ +// +// Math.NET Numerics, part of the Math.NET Project +// http://numerics.mathdotnet.com +// http://github.com/mathnet/mathnet-numerics +// http://mathnetnumerics.codeplex.com +// Copyright (c) 2009-2010 Math.NET +// Permission is hereby granted, free of charge, to any person +// obtaining a copy of this software and associated documentation +// files (the "Software"), to deal in the Software without +// restriction, including without limitation the rights to use, +// copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the +// Software is furnished to do so, subject to the following +// conditions: +// The above copyright notice and this permission notice shall be +// included in all copies or substantial portions of the Software. +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +// OTHER DEALINGS IN THE SOFTWARE. +// + +using System; +using MathNet.Numerics.Distributions; + +namespace Examples.TriangularExamples +{ + /// + /// ContinuousUniform distribution example + /// + public class TriangularDistribution : IExample + { + /// + /// Gets the name of this example + /// + /// + public string Name + { + get + { + return "Triangular distribution"; + } + } + + /// + /// Gets the description of this example + /// + public string Description + { + get + { + return "Triangular distribution properties and samples generating examples"; + } + } + + /// + /// Run example + /// + /// Triangular distribution + public void Run() + { + // 1. Initialize + var triangular = new Triangular(0, 1, 0.3); + Console.WriteLine(@"1. Initialize the new instance of the Triangular distribution class with parameters Lower = {0}, Upper = {1}, Mode = {2}", triangular.LowerBound, triangular.UpperBound, triangular.Mode); + Console.WriteLine(); + + // 2. Distributuion properties: + Console.WriteLine(@"2. {0} distributuion properties:", triangular); + + // Cumulative distribution function + Console.WriteLine(@"{0} - Сumulative distribution at location '0.3'", triangular.CumulativeDistribution(0.3).ToString(" #0.00000;-#0.00000")); + + // Probability density + Console.WriteLine(@"{0} - Probability density at location '0.3'", triangular.Density(0.3).ToString(" #0.00000;-#0.00000")); + + // Log probability density + Console.WriteLine(@"{0} - Log probability density at location '0.3'", triangular.DensityLn(0.3).ToString(" #0.00000;-#0.00000")); + + // Entropy + Console.WriteLine(@"{0} - Entropy", triangular.Entropy.ToString(" #0.00000;-#0.00000")); + + // Largest element in the domain + Console.WriteLine(@"{0} - Largest element in the domain", triangular.Maximum.ToString(" #0.00000;-#0.00000")); + + // Smallest element in the domain + Console.WriteLine(@"{0} - Smallest element in the domain", triangular.Minimum.ToString(" #0.00000;-#0.00000")); + + // Mean + Console.WriteLine(@"{0} - Mean", triangular.Mean.ToString(" #0.00000;-#0.00000")); + + // Median + Console.WriteLine(@"{0} - Median", triangular.Median.ToString(" #0.00000;-#0.00000")); + + // Mode + Console.WriteLine(@"{0} - Mode", triangular.Mode.ToString(" #0.00000;-#0.00000")); + + // Variance + Console.WriteLine(@"{0} - Variance", triangular.Variance.ToString(" #0.00000;-#0.00000")); + + // Standard deviation + Console.WriteLine(@"{0} - Standard deviation", triangular.StdDev.ToString(" #0.00000;-#0.00000")); + + // Skewness + Console.WriteLine(@"{0} - Skewness", triangular.Skewness.ToString(" #0.00000;-#0.00000")); + Console.WriteLine(); + + // 10 samples + Console.WriteLine(@"3. Generate 10 samples of the Triangular distribution"); + for (var i = 0; i < 10; i++) + { + Console.Write(triangular.Sample().ToString("N05") + @" "); + } + + Console.WriteLine(); + Console.WriteLine(); + + // 10000 samples with starting parameters + Console.WriteLine(@"4. Generate 100000 samples of the Triangular({0}, {1}, {2}) distribution and display histogram", triangular.LowerBound, triangular.UpperBound, triangular.Mode); + var data = new double[100000]; + for (var i = 0; i < data.Length; i++) + { + data[i] = triangular.Sample(); + } + + ConsoleHelper.DisplayHistogram(data); + Console.WriteLine(); + + // 10000 with different parameters + triangular.UpperBound = 10; + triangular.Mode = 8; + triangular.LowerBound = 2; + Console.WriteLine(@"4. Generate 100000 samples of the Triangular({0}, {1}, {2}) distribution and display histogram", triangular.LowerBound, triangular.UpperBound, triangular.Mode); + for (var i = 0; i < data.Length; i++) + { + data[i] = triangular.Sample(); + } + + ConsoleHelper.DisplayHistogram(data); + } + } +}