diff --git a/src/Numerics/ExcelFunctions.cs b/src/Numerics/ExcelFunctions.cs index 6904b6e0..8b60c9d5 100644 --- a/src/Numerics/ExcelFunctions.cs +++ b/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); diff --git a/src/UnitTests/ExcelTests.cs b/src/UnitTests/ExcelTests.cs index 73efe30a..a527bd78 100644 --- a/src/UnitTests/ExcelTests.cs +++ b/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() {