diff --git a/src/Numerics/Distributions/Weibull.cs b/src/Numerics/Distributions/Weibull.cs index 66effaaf..271af73f 100644 --- a/src/Numerics/Distributions/Weibull.cs +++ b/src/Numerics/Distributions/Weibull.cs @@ -429,7 +429,7 @@ namespace MathNet.Numerics.Distributions public static Weibull Estimate(IEnumerable samples, System.Random randomSource = null) { var samp = samples as double[] ?? samples.ToArray(); - double n = samp.Count(), s1 = 0, s2 = 0, s3 = 0, previousC = Int32.MinValue, QofC = 0; + double n = samp.Length, s1 = 0, s2 = 0, s3 = 0, previousC = Int32.MinValue, QofC = 0; if (n <= 1) throw new Exception("Observations not sufficient"); @@ -455,8 +455,12 @@ namespace MathNet.Numerics.Distributions } foreach (double x in samp) + { if (x > 0) + { b += Math.Pow(x, c); + } + } b = Math.Pow(b / n, 1 / c); diff --git a/src/UnitTests/DistributionTests/Continuous/WeibullTests.cs b/src/UnitTests/DistributionTests/Continuous/WeibullTests.cs index 4b659725..e5d33134 100644 --- a/src/UnitTests/DistributionTests/Continuous/WeibullTests.cs +++ b/src/UnitTests/DistributionTests/Continuous/WeibullTests.cs @@ -336,5 +336,22 @@ namespace MathNet.Numerics.UnitTests.DistributionTests.Continuous var n = new Weibull(shape, scale); AssertHelpers.AlmostEqualRelative(cdf, n.CumulativeDistribution(x), 14); } + + /// + /// Can estimate distribution parameters. + /// + [TestCase(1.0, 0.1)] + [TestCase(1.0, 1.0)] + [TestCase(10.0, 1.0)] + [TestCase(10.0, 10.0)] + [TestCase(10.0, 50.0)] + public void CanEstimateParameters(double shape, double scale) + { + var original = new Weibull(shape, scale, new Random(100)); + var estimated = Weibull.Estimate(original.Samples().Take(10000)); + + AssertHelpers.AlmostEqualRelative(shape, estimated.Shape, 1); + AssertHelpers.AlmostEqualRelative(scale, estimated.Scale, 1); + } } }