Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentes Révision précédente Prochaine révision | Révision précédente Dernière révision Les deux révisions suivantes | ||
loi_normale [2008/04/16 09:22] tyrtamos |
loi_normale [2014/03/17 09:21] tyrtamos |
||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
====== Loi normale (ou loi de Gauss) ====== | ====== Loi normale (ou loi de Gauss) ====== | ||
+ | |||
+ | [modification le 17/3/2014: fonction de répartition de la loi normale centrée réduite] | ||
===== Rappel de quelques définitions concernant la loi normale ou loi de Gauss ===== | ===== Rappel de quelques définitions concernant la loi normale ou loi de Gauss ===== | ||
Ligne 37: | Ligne 39: | ||
< | < | ||
+ | |||
+ | === Calcul par intégration numérique === | ||
Pour calculer cette surface, on va faire quelque chose qui ressemble à l' | Pour calculer cette surface, on va faire quelque chose qui ressemble à l' | ||
Ligne 44: | Ligne 48: | ||
Ce qui fait que nous calculerons toujours la surface pour abs(u), et nous corrigerons si le u initial était négatif. | Ce qui fait que nous calculerons toujours la surface pour abs(u), et nous corrigerons si le u initial était négatif. | ||
- | On va considérer aussi que pour %%u>=7.56%% (7.56 x écarts-types), | + | On va arrondir le résultat à 7 chiffres après |
\\ | \\ | ||
- | <code python> | + | <code python> |
- | # | + | |
- | # -*- coding: utf-8 -*- | + | |
- | from __future__ import division | + | |
- | + | ||
- | from math import * | + | |
def pgaussred(x): | def pgaussred(x): | ||
- | """ | + | """ |
+ | (= probabilité qu'une variable aléatoire distribuée selon | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
if x==0: | if x==0: | ||
return 0.5 | return 0.5 | ||
- | if x>=7.56: | ||
- | return 1.0 | ||
- | if x< | ||
- | return 0.0 | ||
u=abs(x) | u=abs(x) | ||
n=int(u*2000) | n=int(u*2000) | ||
Ligne 69: | Ligne 69: | ||
f1=k | f1=k | ||
p=0.5 | p=0.5 | ||
- | for i in xrange(0,n): | + | for i in range(0,n): |
u2=u1+du | u2=u1+du | ||
f2=k*exp(-0.5*u2*u2) | f2=k*exp(-0.5*u2*u2) | ||
Ligne 75: | Ligne 75: | ||
u1=u2 | u1=u2 | ||
f1=f2 | f1=f2 | ||
- | if x>0: | + | if x<0: |
- | | + | p = 1.0-p |
- | else: | + | return round(p, 7) |
- | return | + | </ |
- | # exemples | + | Exemples |
- | print pgaussred(-8) # affiche: 0.0 | + | |
- | print pgaussred(-7) # affiche: 1.26010313295e-012 | + | <code python> |
- | print pgaussred(-6) # affiche: 9.86570047878e-010 | + | for x in range(-6, 7): |
- | print pgaussred(-5) # affiche: 2.86651707593e-007 | + | P = pgaussred(x) |
- | print pgaussred(-4) # affiche: 3.1671252966e-005 | + | print(x, P) |
- | print pgaussred(-3) # affiche: 0.0013498983086 | + | |
- | print pgaussred(-2) # affiche: 0.0227501341978 | + | |
- | print pgaussred(-1) # affiche: 0.158655258973 | + | |
- | + | ||
- | print pgaussred(0) # affiche: 0.5 | + | |
- | + | ||
- | print pgaussred(1) # affiche: 0.841344741027 | + | |
- | print pgaussred(2) # affiche: 0.977249865802 | + | |
- | print pgaussred(3) # affiche: 0.998650101691 | + | |
- | print pgaussred(4) # affiche: 0.999968328747 | + | |
- | print pgaussred(5) # affiche: 0.999999713348 | + | |
- | print pgaussred(6) # affiche: 0.999999999013 | + | |
- | print pgaussred(7) # affiche: 0.999999999999 | + | |
- | print pgaussred(8) # affiche: 1.0 | + | |
</ | </ | ||
+ | |||
+ | Ce qui donne: | ||
+ | |||
+ | <code python> | ||
+ | -6 0.0 | ||
+ | -5 3e-07 | ||
+ | -4 3.17e-05 | ||
+ | -3 0.0013499 | ||
+ | -2 0.0227501 | ||
+ | -1 0.1586553 | ||
+ | 0 0.5 | ||
+ | 1 0.8413447 | ||
+ | 2 0.9772499 | ||
+ | 3 0.9986501 | ||
+ | 4 0.9999683 | ||
+ | 5 0.9999997 | ||
+ | 6 1.0 | ||
+ | </ | ||
+ | |||
+ | |||
+ | === Calcul par une formule simplifiée === | ||
+ | |||
+ | Certains livres de mathématiques propose des formules approchées qui donnent de bons résultats plus rapidement. J'ai retenu une des formules proposées par l' | ||
+ | |||
+ | <code python> | ||
+ | |||
+ | def pgaussred(x): | ||
+ | """ | ||
+ | (= probabilité qu'une variable aléatoire distribuée selon | ||
+ | cette loi soit inférieure à x) | ||
+ | | ||
+ | " | ||
+ | """ | ||
+ | u = abs(x) # car la formule n'est valable que pour x>=0 | ||
+ | |||
+ | Z = 1/ | ||
+ | |||
+ | b1 = 0.319381530 | ||
+ | b2 = -0.356563782 | ||
+ | b3 = 1.781477937 | ||
+ | b4 = -1.821255978 | ||
+ | b5 = 1.330274429 | ||
+ | |||
+ | t = 1/ | ||
+ | t2 = t*t | ||
+ | t4 = t2*t2 | ||
+ | |||
+ | P = 1-Z*(b1*t + b2*t2 + b3*t2*t + b4*t4 + b5*t4*t) | ||
+ | |||
+ | if x<0: | ||
+ | P = 1.0-P # traitement des valeurs x<0 | ||
+ | |||
+ | return round(P, 7) # retourne une valeur arrondie à 7 chiffres | ||
+ | </ | ||
+ | |||
+ | Cette formule donne de bons résultats avec une erreur < 7.5e-8. Il est d' | ||
+ | |||
+ | Exemple d' | ||
+ | |||
+ | <code python> | ||
+ | for x in range(-6, 7): | ||
+ | P = pgaussred(x) | ||
+ | print(x, P) | ||
+ | </ | ||
+ | |||
+ | Ce qui donne: | ||
+ | |||
+ | <code python> | ||
+ | -6 0.0 | ||
+ | -5 3e-07 | ||
+ | -4 3.17e-05 | ||
+ | -3 0.0013499 | ||
+ | -2 0.0227501 | ||
+ | -1 0.1586553 | ||
+ | 0 0.5 | ||
+ | 1 0.8413447 | ||
+ | 2 0.9772499 | ||
+ | 3 0.99865 | ||
+ | 4 0.9999683 | ||
+ | 5 0.9999997 | ||
+ | 6 1.0 | ||
+ | </ | ||
+ | |||
+ | Résultats quasi identiques au code précédent | ||
==== Cas de la loi normale ==== | ==== Cas de la loi normale ==== |