Browse Source

ExcelFunctions: NORMDIST, NORMINV, NORMSDIST, NORMSINV

pull/193/head
Christoph Ruegg 13 years ago
parent
commit
0e7e36feda
  1. 20
      src/Numerics/ExcelFunctions.cs
  2. 53
      src/UnitTests/ExcelTests.cs

20
src/Numerics/ExcelFunctions.cs

@ -44,6 +44,26 @@ namespace MathNet.Numerics
/// </summary>
public static class ExcelFunctions
{
public static double NormSDist(double z)
{
return Normal.CDF(0d, 1d, z);
}
public static double NormSInv(double probability)
{
return Normal.InvCDF(0d, 1d, probability);
}
public static double NormDist(double x, double mean, double standardDev, bool cumulative)
{
return cumulative ? Normal.CDF(mean, standardDev, x) : Normal.PDF(mean, standardDev, x);
}
public static double NormInv(double probability, double mean, double standardDev)
{
return Normal.InvCDF(mean, standardDev, probability);
}
public static double TDist(double x, int degreesFreedom, int tails)
{
switch (tails)

53
src/UnitTests/ExcelTests.cs

@ -38,6 +38,57 @@ namespace MathNet.Numerics.UnitTests
[TestFixture, Category("Functions")]
public class ExcelTests
{
[Test]
public void NormSDist()
{
Assert.That(ExcelFunctions.NormSDist(0), Is.EqualTo(0.50000000000).Within(1e-8), "A1");
Assert.That(ExcelFunctions.NormSDist(-0.25), Is.EqualTo(0.40129367432).Within(1e-8), "B1");
Assert.That(ExcelFunctions.NormSDist(0.5), Is.EqualTo(0.69146246127).Within(1e-8), "C1");
Assert.That(ExcelFunctions.NormSDist(1), Is.EqualTo(0.84134474607).Within(1e-6), "D1");
Assert.That(ExcelFunctions.NormSDist(-2), Is.EqualTo(0.02275013195).Within(1e-8), "E1");
Assert.That(ExcelFunctions.NormSDist(10), Is.EqualTo(1.00000000000).Within(1e-8), "F1");
}
[Test]
public void NormSInv()
{
Assert.That(ExcelFunctions.NormSInv(0.01), Is.EqualTo(-2.32634787404).Within(1e-6), "A1");
Assert.That(ExcelFunctions.NormSInv(0.25), Is.EqualTo(-0.67448975020).Within(1e-6), "B1");
Assert.That(ExcelFunctions.NormSInv(0.5), Is.EqualTo(0.00000000000).Within(1e-6), "C1");
Assert.That(ExcelFunctions.NormSInv(0.75), Is.EqualTo(0.67448975020).Within(1e-6), "D1");
Assert.That(ExcelFunctions.NormSInv(0.99), Is.EqualTo(2.32634787404).Within(1e-6), "E1");
Assert.That(ExcelFunctions.NormSInv(0.9999), Is.EqualTo(3.71901648546).Within(1e-6), "F1");
}
[Test]
public void NormDist()
{
Assert.That(ExcelFunctions.NormDist(0, 2, 3, true), Is.EqualTo(0.25249253755).Within(1e-8), "A1");
Assert.That(ExcelFunctions.NormDist(-0.25, 2, 3, true), Is.EqualTo(0.22662735238).Within(1e-8), "B1");
Assert.That(ExcelFunctions.NormDist(0.5, 2, 3, true), Is.EqualTo(0.30853753873).Within(1e-8), "C1");
Assert.That(ExcelFunctions.NormDist(1, 2, 3, true), Is.EqualTo(0.36944134018).Within(1e-6), "D1");
Assert.That(ExcelFunctions.NormDist(-2, 2, 3, true), Is.EqualTo(0.09121121973).Within(1e-8), "E1");
Assert.That(ExcelFunctions.NormDist(10, 2, 3, true), Is.EqualTo(0.99616961943).Within(1e-8), "F1");
Assert.That(ExcelFunctions.NormDist(0, 2, 3, false), Is.EqualTo(0.106482669).Within(1e-8), "A2");
Assert.That(ExcelFunctions.NormDist(-0.25, 2, 3, false), Is.EqualTo(0.100379144).Within(1e-8), "B2");
Assert.That(ExcelFunctions.NormDist(0.5, 2, 3, false), Is.EqualTo(0.117355109).Within(1e-8), "C2");
Assert.That(ExcelFunctions.NormDist(1, 2, 3, false), Is.EqualTo(0.125794409).Within(1e-6), "D2");
Assert.That(ExcelFunctions.NormDist(-2, 2, 3, false), Is.EqualTo(0.054670025).Within(1e-8), "E2");
Assert.That(ExcelFunctions.NormDist(10, 2, 3, false), Is.EqualTo(0.003798662).Within(1e-8), "F2");
}
[Test]
public void NormInv()
{
Assert.That(ExcelFunctions.NormInv(0.01, 2, 3), Is.EqualTo(-4.97904362212).Within(1e-6), "A1");
Assert.That(ExcelFunctions.NormInv(0.25, 2, 3), Is.EqualTo(-0.02346925059).Within(1e-6), "B1");
Assert.That(ExcelFunctions.NormInv(0.5, 2, 3), Is.EqualTo(2.00000000000).Within(1e-6), "C1");
Assert.That(ExcelFunctions.NormInv(0.75, 2, 3), Is.EqualTo(4.02346925059).Within(1e-6), "D1");
Assert.That(ExcelFunctions.NormInv(0.99, 2, 3), Is.EqualTo(8.97904362212).Within(1e-6), "E1");
Assert.That(ExcelFunctions.NormInv(0.9999, 2, 3), Is.EqualTo(13.15704945637).Within(1e-6), "F1");
}
[Test]
public void TDist()
{
@ -155,7 +206,7 @@ namespace MathNet.Numerics.UnitTests
Assert.That(ExcelFunctions.Percentile(array, 0.90), Is.EqualTo(10.60000000000).Within(1e-8));
Assert.That(ExcelFunctions.Percentile(array, 0.99), Is.EqualTo(11.86000000000).Within(1e-8));
Assert.That(ExcelFunctions.Percentile(array, 1.00), Is.EqualTo(12.00000000000).Within(1e-8));
array = new Double[] { 1, 9, 12, 7, 2, 9, 10, 2 };
Assert.That(ExcelFunctions.Percentile(array, 0.00), Is.EqualTo(1.00000000000).Within(1e-8));
Assert.That(ExcelFunctions.Percentile(array, 0.01), Is.EqualTo(1.07000000000).Within(1e-8));

Loading…
Cancel
Save