From ddf9dc222b7a23ff4e57da64cc2ff8d3f1212d71 Mon Sep 17 00:00:00 2001 From: Ruben Dashyan Date: Fri, 2 Aug 2019 15:21:08 +0200 Subject: [PATCH] [apps/probability] Define the Student distribution --- apps/probability/Makefile | 1 + apps/probability/base.de.i18n | 2 ++ apps/probability/base.en.i18n | 2 ++ apps/probability/base.es.i18n | 2 ++ apps/probability/base.fr.i18n | 2 ++ apps/probability/base.pt.i18n | 2 ++ apps/probability/law/law.h | 3 +- apps/probability/law/student_law.cpp | 50 ++++++++++++++++++++++++++++ apps/probability/law/student_law.h | 35 +++++++++++++++++++ 9 files changed, 98 insertions(+), 1 deletion(-) create mode 100644 apps/probability/law/student_law.cpp create mode 100644 apps/probability/law/student_law.h diff --git a/apps/probability/Makefile b/apps/probability/Makefile index b46b4abf8..cc288c9ec 100644 --- a/apps/probability/Makefile +++ b/apps/probability/Makefile @@ -23,6 +23,7 @@ app_probability_src = $(addprefix apps/probability/,\ law/exponential_law.cpp \ law/normal_law.cpp \ law/poisson_law.cpp \ + law/student_law.cpp \ law/two_parameter_law.cpp \ law/uniform_law.cpp \ law_controller.cpp \ diff --git a/apps/probability/base.de.i18n b/apps/probability/base.de.i18n index 8c0de762d..46db06ba8 100644 --- a/apps/probability/base.de.i18n +++ b/apps/probability/base.de.i18n @@ -6,12 +6,14 @@ Uniforme = "Uniform" Normal = "Normal" Poisson = "Poisson" ChiSquared = "Chi-Quadrat" +Student = "Student" BinomialLaw = "Binomialverteilung" UniformLaw = "Uniformverteilung" ExponentialLaw = "Exponentialverteilung" NormalLaw = "Normalverteilung" PoissonLaw = "Poisson-Verteilung" ChiSquaredLaw = "Chi-Quadrat-Verteilung" +StudentLaw = "Student-Verteilung" ChooseParameters = "Parameter auswählen" RepetitionNumber = "n: Anzahl der Versuche" SuccessProbability = "p: Erfolgswahrscheinlichkeit" diff --git a/apps/probability/base.en.i18n b/apps/probability/base.en.i18n index 282ba804e..de924d416 100644 --- a/apps/probability/base.en.i18n +++ b/apps/probability/base.en.i18n @@ -6,12 +6,14 @@ Uniforme = "Uniform" Normal = "Normal" Poisson = "Poisson" ChiSquared = "Chi-squared" +Student = "Student" BinomialLaw = "Binomial distribution" UniformLaw = "Uniform distribution" ExponentialLaw = "Exponential distribution" NormalLaw = "Normal distribution" PoissonLaw = "Poisson distribution" ChiSquaredLaw = "Chi-squared distribution" +StudentLaw = "Student's distribution" ChooseParameters = "Choose parameters" RepetitionNumber = "n: Number of trials" SuccessProbability = "p: Success probability" diff --git a/apps/probability/base.es.i18n b/apps/probability/base.es.i18n index 18f1d5075..d76b2ad7e 100644 --- a/apps/probability/base.es.i18n +++ b/apps/probability/base.es.i18n @@ -6,12 +6,14 @@ Uniforme = "Uniforme" Normal = "Normal" Poisson = "Poisson" ChiSquared = "Chi-cuadrado" +Student = "Student" BinomialLaw = "Distribución binomial" UniformLaw = "Distribución uniforme" ExponentialLaw = "Distribución exponencial" NormalLaw = "Distribución normal" PoissonLaw = "Distribución de Poisson" ChiSquaredLaw = "Distribución chi-cuadrado" +StudentLaw = "Distribución de Student" ChooseParameters = "Seleccionar parámetros" RepetitionNumber = "n : Número de ensayos " SuccessProbability = "p : Probabilidad de éxito " diff --git a/apps/probability/base.fr.i18n b/apps/probability/base.fr.i18n index d9a30283f..d74aee155 100644 --- a/apps/probability/base.fr.i18n +++ b/apps/probability/base.fr.i18n @@ -6,12 +6,14 @@ Uniforme = "Uniforme" Normal = "Normale" Poisson = "Poisson" ChiSquared = "Chi2" +Student = "Student" BinomialLaw = "Loi binomiale" UniformLaw = "Loi uniforme" ExponentialLaw = "Loi exponentielle" NormalLaw = "Loi normale" PoissonLaw = "Loi de Poisson" ChiSquaredLaw = "Loi du chi2" +StudentLaw = "Loi de Student" ChooseParameters = "Choisir les paramètres" RepetitionNumber = "n : Nombre de répétitions" SuccessProbability = "p : Probabilité de succès" diff --git a/apps/probability/base.pt.i18n b/apps/probability/base.pt.i18n index 157a57739..1334b93b5 100644 --- a/apps/probability/base.pt.i18n +++ b/apps/probability/base.pt.i18n @@ -6,12 +6,14 @@ Uniforme = "Uniforme" Normal = "Normal" Poisson = "Poisson" ChiSquared = "Qui-quadrado" +Student = "Student" BinomialLaw = "Distribuição binomial" UniformLaw = "Distribuição uniforme" ExponentialLaw = "Distribuição exponencial" NormalLaw = "Distribuição normal" PoissonLaw = "Distribuição de Poisson" ChiSquaredLaw = "Distribuição qui-quadrado" +StudentLaw = "Distribuição de Student" ChooseParameters = "Selecionar os parâmetros" RepetitionNumber = "n : Número de ensaios" SuccessProbability = "p : Probabilidade de sucesso" diff --git a/apps/probability/law/law.h b/apps/probability/law/law.h index e675c4214..21c50cacd 100644 --- a/apps/probability/law/law.h +++ b/apps/probability/law/law.h @@ -17,7 +17,8 @@ public: Exponential, Normal, Poisson, - ChiSquared + ChiSquared, + Student }; virtual ~Law() = default; virtual I18n::Message title() = 0; diff --git a/apps/probability/law/student_law.cpp b/apps/probability/law/student_law.cpp new file mode 100644 index 000000000..85f6d7548 --- /dev/null +++ b/apps/probability/law/student_law.cpp @@ -0,0 +1,50 @@ +#include "student_law.h" +#include +#include + +namespace Probability { + +float StudentLaw::xMin() const { + return -xMax(); +} + +float StudentLaw::xMax() const { + return 5.0f; +} + +float StudentLaw::yMax() const { + return coefficient() * (1.0f + k_displayTopMarginRatio); +} + +float StudentLaw::evaluateAtAbscissa(float x) const { + const float d = m_parameter1; + return coefficient() * std::pow(1+std::pow(x,2)/d, -(d+1)/2); +} + +bool StudentLaw::authorizedValueAtIndex(float x, int index) const { + return x >= FLT_EPSILON; +} + +double StudentLaw::cumulativeDistributiveFunctionAtAbscissa(double x) const { + return 0; + //TODO +} + +double StudentLaw::cumulativeDistributiveInverseForProbability(double * probability) { + if (*probability >= 1.0) { + return INFINITY; + } + if (*probability <= 0.0) { + return -INFINITY; + } + return 0; + //TODO +} + +float StudentLaw::coefficient() const { + const float d = m_parameter1; + const float lnOfResult = std::lgamma((d+1)/2) - std::lgamma(d/2) - (M_PI+d)/2; + return std::exp(lnOfResult); +} + +} diff --git a/apps/probability/law/student_law.h b/apps/probability/law/student_law.h new file mode 100644 index 000000000..fa62c97b5 --- /dev/null +++ b/apps/probability/law/student_law.h @@ -0,0 +1,35 @@ +#ifndef PROBABILITY_STUDENT_LAW_H +#define PROBABILITY_STUDENT_LAW_H + +#include "one_parameter_law.h" + +namespace Probability { + +class StudentLaw : public OneParameterLaw { +public: + StudentLaw() : OneParameterLaw(4.0f) {} + I18n::Message title() override { return I18n::Message::StudentLaw; } + Type type() const override { return Type::Student; } + bool isContinuous() const override { return true; } + float xMin() const override; + float xMax() const override; + float yMax() const override; + I18n::Message parameterNameAtIndex(int index) override { + assert(index == 0); + return I18n::Message::D; + } + I18n::Message parameterDefinitionAtIndex(int index) override { + assert(index == 0); + return I18n::Message::DegreesOfFreedomDefinition; + } + float evaluateAtAbscissa(float x) const override; + bool authorizedValueAtIndex(float x, int index) const override; + double cumulativeDistributiveFunctionAtAbscissa(double x) const override; + double cumulativeDistributiveInverseForProbability(double * probability) override; +private: + float coefficient() const; +}; + +} + +#endif