MATH_LoiNormale    [Statistiques]

Par Teddy Linet (Math4D v1)
Nouvelle recherche
Si (Faux)
   ` MATH_LoiNormale [Teddy Linet 10/02]
   ` ---------------------------------------------
   ` ATTENTION : Méthode récursive
   ` ---------------------------------------------
   ` Rappels mathématiques :
   ` Loi normale (ou loi de Gauss ou de Laplace-Gauss)
   ` La méthode calcule la probabilité d'une loi normale centrée réduite
   ` entre O et x
   ` La méthode utilise une approximation d'environ 10^-5
   ` Som:=x+(((-x^2/2)/1)*(x/3))+((((-x^2)^2/2)/2)*(x/5))+;;;
   ` P:=Som*((2*Pi)^0;5)
   ` Pour calculer un alpha entre -x et +x :
   ` alpha:=1-(MATH_LoiNormale(x)*2)
   ` alpha représente la probabilité que la variable ne se trouve pas entre -x et+x
   ` ---------------------------------------------
   ` MATH_LoiNormale admet deux syntaxes :
   `
   ` Pour calculer P
   ` MATH_LoiNormale(x;"P" {;Moyenne {;EcartType}}}) -> Numérique
   ` x (Numérique) Valeur du x
   ` "P" (Chaine fixe) Option calcul de P ou constante Normale_p
   ` Moyenne (Numérique) Valeur de la moyenne, par défaut =0
   ` EcartType (Numérique) Valeur de l'écart type, par défaut =1
   ` Résultat (Numérique) Probabilité que la variable se trouve entre 0 et x
   `
   ` Pour calculer Z
   ` MATH_LoiNormale(alpha;"Z" {;Moyenne {;EcartType}}) -> Numérique
   ` alpha (Numérique) Valeur de alpha
   ` "Z" (Chaine fixe) Option calcul de Z ou constante Normale_Z
   ` Moyenne (Numérique optionnel) Valeur de la moyenne, par défaut =0
   ` EcartType (Numérique optionnel) Valeur de l'écart type, par défaut =1
   ` Résultat (Numérique) Ualpha, abscisse sur la ligne en fonction de alpha
   ` ---------------------------------------------
   ` MATHERROR
   ` 0 -> Pas d'erreur
   ` -1 -> Alpha n'est pas correct (pas une proportion)
   ` +1 -> Alpha trop petit, rectifié automatiquement
Fin de si 

C_ENTIER LONG(MATHERROR)
MATHERROR:=0

C_ENTIER($i)
C_REEL($0;$1;$3;$4;$t;$vFact_F;$vSomme_F;$vCalc_F;$vMoyenne_F;$vEcartType_F)
C_REEL($vUalpha_F;$vAlpha_F;$vMin_F;$vMax_F)
C_ALPHA(32;$2)
$0:=0  ` Par défaut

Au cas ou 
 : (Nombre de parametres<=2)  ` Centré et réduit (par défaut)
 $vMoyenne_F:=0
 $vEcartType_F:=1
 : (Nombre de parametres<=3)  ` Réduit, pas centré => On centre
 $vMoyenne_F:=$3
 $vEcartType_F:=1
 : (Nombre de parametres<=4)  ` Ni réduit, ni centré => On centre et on réduit
 $vMoyenne_F:=$3
 $vEcartType_F:=Abs($4)  ` Evitons les erreurs de calcul (toujour positif normalement)
Fin de cas 

Si ($2#"@z@")  ` Il ne s'agit pas de l'option Z => option P
 
   ` Calcul de $t, centré et réduit en fonction de x ($1), la moyenne et l'écarttype
 $t:=Abs(($1-$vMoyenne_F)/$vEcartType_F)
 
 $vSomme_F:=$t
 $vFact_F:=$t
 $i:=0
 $vCalc_F:=-($t^2)/2
 
 Tant que (Abs($vFact_F)>(10^-7))
  $i:=$i+1
  $vFact_F:=$vFact_F*$vCalc_F*(2*$i-1)/(2*$i+1)/$i
  $vSomme_F:=$vSomme_F+$vFact_F
 Fin tant que 
 
 $0:=Arrondi($vSomme_F/((2*Pi )^0,5);4)  ` Arrondi à 4 décimales car limites de l'approximation
 
Sinon   ` Option Z => calcul de Ualpha par dichotomie (utilise l'option P)
 
 $vAlpha_F:=$1  ` Un alpha doit toujours être positif
 Au cas ou 
  : (($vAlpha_F>1) | ($vAlpha_F<0))
  MATHERROR:=-1  ` Alpha doit être compris entre 0 et 1
  : ($vAlpha_F<0,0001)
  MATHERROR:=1  ` "Alpha trop petit"
  $vAlpha_F:=0,0001
 Fin de cas 
 Si (MATHERROR>=0)
  $vUalpha_F:=3,89059  ` Soit supérieur à un alpha à 0,0001
  $vMin_F:=0
  $vMax_F:=$vUalpha_F
  Repeter 
   $vCalc_F:=1-(MATH_LoiNormale ($vUalpha_F;"P";$vMoyenne_F;$vEcartType_F)*2)
   Si ($vAlpha_F>$vCalc_F)  ` Dichotomie car fonction linéairement croissante
    $vMax_F:=$vUalpha_F  ` Trop grand => on divise par 2
   Sinon 
    $vMin_F:=$vUalpha_F  ` Trop petit => on rajoute la moitié
   Fin de si 
   $vUalpha_F:=$vMin_F+(($vMax_F-$vMin_F)/2)
  Jusque (Abs($vCalc_F-$vAlpha_F)<(10^-5))
  $0:=Arrondi($vUalpha_F;4)  ` Arrondi à 4 décimales car limites de l'approximation
 Fin de si 
 
Fin de si