Browse Source

ExcelFunctions: BETADIST, BETAINV, TINV

pull/194/head
Christoph Ruegg 12 years ago
parent
commit
d3d1e490b6
  1. 20
      src/Numerics/ExcelFunctions.cs
  2. 34
      src/UnitTests/ExcelTests.cs

20
src/Numerics/ExcelFunctions.cs

@ -46,18 +46,32 @@ namespace MathNet.Numerics
{
public static double TDIST(double x, int degrees_freedom, int tails)
{
var dist = new StudentT(0.0, 1.0, degrees_freedom);
switch (tails)
{
case 1:
return 1d - dist.CumulativeDistribution(x);
return 1d - StudentT.CDF(0d, 1d, degrees_freedom, x);
case 2:
return 1d - dist.CumulativeDistribution(x) + dist.CumulativeDistribution(-x);
return 1d - StudentT.CDF(0d, 1d, degrees_freedom, x) + StudentT.CDF(0d, 1d, degrees_freedom, -x);
default:
throw new ArgumentOutOfRangeException("tails");
}
}
public static double TINV(double probability, int degrees_freedom)
{
return -StudentT.InvCDF(0d, 1d, degrees_freedom, probability/2);
}
public static double BETADIST(double x, double alpha, double beta)
{
return Beta.CDF(alpha, beta, x);
}
public static double BETAINV(double probability, double alpha, double beta)
{
return Beta.InvCDF(alpha, beta, probability);
}
public static double GAMMADIST(double x, double alpha, double beta, bool cumulative)
{
return cumulative ? Gamma.CDF(alpha, 1/beta, x) : Gamma.PDF(alpha, 1/beta, x);

34
src/UnitTests/ExcelTests.cs

@ -55,6 +55,40 @@ namespace MathNet.Numerics.UnitTests
Assert.That(ExcelFunctions.TDIST(10, 2, 2), Is.EqualTo(0.00985245702).Within(1e-8), "F2");
}
[Test]
public void TINV()
{
Assert.That(ExcelFunctions.TINV(0.01, 2), Is.EqualTo(9.92484320092).Within(1e-6), "A1");
Assert.That(ExcelFunctions.TINV(0.25, 2), Is.EqualTo(1.60356745147).Within(1e-6), "B1");
Assert.That(ExcelFunctions.TINV(0.5, 2), Is.EqualTo(0.81649658093).Within(1e-6), "C1");
Assert.That(ExcelFunctions.TINV(0.75, 2), Is.EqualTo(0.36514837167).Within(1e-6), "D1");
Assert.That(ExcelFunctions.TINV(0.99, 2), Is.EqualTo(0.01414284278).Within(1e-6), "E1");
Assert.That(ExcelFunctions.TINV(0.9999, 2), Is.EqualTo(0.00014142136).Within(1e-6), "F1");
Assert.That(ExcelFunctions.TINV(1.0, 2), Is.EqualTo(0.00000000000).Within(1e-6), "G1");
}
[Test]
public void BETADIST()
{
Assert.That(ExcelFunctions.BETADIST(0, 2, 1.5), Is.EqualTo(0.00000000000).Within(1e-8), "A1");
Assert.That(ExcelFunctions.BETADIST(0.25, 2, 1.5), Is.EqualTo(0.10691130235).Within(1e-8), "B1");
Assert.That(ExcelFunctions.BETADIST(0.5, 2, 1.5), Is.EqualTo(0.38128156646).Within(1e-8), "C1");
Assert.That(ExcelFunctions.BETADIST(0.75, 2, 1.5), Is.EqualTo(0.73437500000).Within(1e-6), "D1");
Assert.That(ExcelFunctions.BETADIST(0.9999, 2, 1.5), Is.EqualTo(0.99999750015).Within(1e-8), "E1");
Assert.That(ExcelFunctions.BETADIST(0.0001, 2, 1.5), Is.EqualTo(0.00000001875).Within(1e-8), "F1");
}
[Test]
public void BETAINV()
{
Assert.That(ExcelFunctions.BETAINV(0.01, 2, 1.5), Is.EqualTo(0.07396024691).Within(1e-6), "A1");
Assert.That(ExcelFunctions.BETAINV(0.25, 2, 1.5), Is.EqualTo(0.39447722186).Within(1e-6), "B1");
Assert.That(ExcelFunctions.BETAINV(0.5, 2, 1.5), Is.EqualTo(0.58637250688).Within(1e-6), "C1");
Assert.That(ExcelFunctions.BETAINV(0.75, 2, 1.5), Is.EqualTo(0.76115477285).Within(1e-6), "D1");
Assert.That(ExcelFunctions.BETAINV(0.99, 2, 1.5), Is.EqualTo(0.97454166372).Within(1e-6), "E1");
Assert.That(ExcelFunctions.BETAINV(0.9999, 2, 1.5), Is.EqualTo(0.99882984514).Within(1e-6), "F1");
}
[Test]
public void GAMMADIST()
{

Loading…
Cancel
Save