Loi de poisson (stats-proba)

Soyez le premier à donner votre avis sur cette source.

Snippet vu 25 790 fois - Téléchargée 30 fois

Contenu du snippet

Bonjour :)

Autodidacte, le code reste imparfait mais correct.
Restant incertain sur la logique mathématique employée, j'attends vos remarques autant sur le code que sur la logique mathématique ;)

Loi binomiale : P(x=k) = (Combinaison k de n)*(p exposant k)* (q exposant(n-k))
Combinaison k de n = n! / (k!(n-k)!)
E(x) = np ecart type e(x) = racine carré de npq

Loi de Poisson : P(x=k) = exponentielle(-t)*(t exposant k)/k!
E(x) = t variance V (x = t) = t

Source / Exemple :


#include <stdio.h>
#include <math.h>

long fact(int i)
{
       long f;
       
       if (i==0)
       {
          return 1;
       }
       else
       {
           f = fact(i - 1);
           return i*f;
       }
       
}

main ()
{
     int n, k;
     double e, p, q, r, t, x, y, z;
     
     printf("entrez la valeur de k entier non nul positif\n");
     scanf("%d", &k);
     printf("entrez le nombre d'essais n entier non nul positif\n");
     scanf("%d", &n);
     
     x = fact(n);
     y = fact(k);
     z = fact(n-k);
     
     r = x/(y*z);
     
     printf("la combinaison n de k est : %lf\n", r);
     
     x = n-1;
     y = k-1;
     z = x-y;
     x = fact(x);
     y = fact(y);
     z = fact(z);    
  
     e = x/(y*z);
     e = e/x;
     p = pow(e, k);

     printf("la probabilite de succes k de n est : %lf\n", p);
     
     x = n-k;
     y = 1-p;
     q = pow(y, x);
     
     r = r*p*q;
     printf("le resultat de la loi binomiale est : %lf\n", r);
     e = n*p;
     printf("l'esperance est de : %lf\n", e);
     t = sqrt(e*q);
     printf("l'ecart type est de : %lf\n", t);
     
     x = exp(-e);
     y = pow (e,k);
     z = x*y;
     k = fact(k);     
     x = z/k;
     printf("la loi de poisson est : %g\n", x);
}

Conclusion :


Après 4 heures de mal de crâne en compagnie de Messieurs Claude Delannoy et Michel Divay (pour leurs bouquins ;) ), je tiens à remercier Pascal, Pascale et Laurent qui se reconnaîtront si d'aventure ils passent par là... (je sais, je peux optimiser !!!).

Le code reste certainement perfectible bien que je sois fier (modestement) d'avoir réussi à le faire fonctionner. Limité par le 32 bits, n'entrez pas de valeur trop élevées.

Dernière précision, les éditions Casteilla n'édite plus le phénoménal "Mémo formulaire" de M. Yves Déplanche d'où j'ai tiré des heures de programmation et les formules mathématiques de ce programme. Une réédition de cette bible serait la bienvenue pour tous les futurs techniciens...

A voir également

Ajouter un commentaire Commentaires
Messages postés
4
Date d'inscription
jeudi 4 septembre 2003
Statut
Membre
Dernière intervention
4 avril 2008

A vouloir être trop succint, j'ai commis une petite erreur puisqu'il faut réaliser une boucle...
Qui peut le plus, peut le moins, je vous invite donc à consulter ma contribution dans la zone VB où je donne le code complet de la fonction :
http://www.vbfrance.com/codes/LOI-POISSON_46282.aspx
Encore désolé pour cette coquille...
Messages postés
4
Date d'inscription
jeudi 4 septembre 2003
Statut
Membre
Dernière intervention
4 avril 2008

Bonjour,

Une modeste contribution à cette source.
Sur un plan informatique, je n'ai rien à dire... parce que je ne suis pas vraiment à la hauteur des intervenants et puis parce que cela me semble très correct.
Sur un plan mathématique en revanche, je me permets de souligner un gros risque signalé par l'auteur d'ailleurs. Essayez de calculer la factorielle de 125 par exemple : vous serez déçus ! Imaginez le résultat : 1 * 2 * 3 * 4 * 5 etc *125
Peu d'ordinateurs sont capables de calculer un tel chiffre. Et ce n'est pas nécessaire !!! Vous avez tout simplement oublié les logarithmes ! Vous vous souvenez ? Le log népérien ? e ? C'est drôlement pratique quand on doit manipuler des chiffres très importants ou au contraire très faibles !
Je vous livre le code suivant (VB, désolé) mais vous ignorerez l'aspect informatique pour vous concentrer sur les maths.

dProb = exp(-moyenne)
dLogProb = -moyenne
dLogProb = dLogProb + ln(moyenne) - log(x)

Quelques explications, en bon français sont sans doute nécessaires !
Je vais prendre un exemple concret, histoire de ne pas perdre trop de monde en route.
Imaginons que l'ampoule de votre voiture tombe en panne en moyenne 3 fois dans l'année. Dans l'exemple, 3 sera la moyenne affecté à la variable appelée moyenne.
Maintenant, si vous voulez savoir quelle est la probabilité qu'il n'y ait que 2 pannes (parce que vous n'avez que deux ampoules), vous affectez la valeur 2 à la variable x.
Le code ci-dessus retournera la probabilité en appliquant la loi de Poisson.
Attention :
1 - il s'agit de la probabilité individuelle, pas de la probabilité cumulée. Si vous avez besoin de la proba cumulée, vous n'avez qu'à faire des boucles.
2 - le code ne fonctionne évidemment pas pour x = 0

Pour info, sous réserve d'erreur de frappe, ce code fonctionne depuis des années dans un logiciel de calcul de rechanges (entre autres). Vous pouvez donc y aller, c'est du bon !
Vos commentaires sont les bienvenus !

Pascal WOHMANN
Messages postés
2
Date d'inscription
mercredi 29 novembre 2006
Statut
Membre
Dernière intervention
13 décembre 2006

J'avoue, j'ai eu du mal à tout comprendre. Après une relecture encore plus concentrée, car plus intéressée, j'ai tout pigé (ou presque, je me penche sur l'ASM dès que possible).

Effectivement la validation des valeurs entrées est absente mais présente dans le code original... mais surement pas de cette manière !!! ;)... question de niveau.

Ensuite accéder aux registres, j'en ignorais la faisabilité en C... question de niveau aussi !!! :)

Merci à vous. Mais qui est TIGCC, AMANOBUO ?!

Sinon j'ai pour but de l'intégrer dans une beeeellle interface graphique avec wxDevCpp, mais n'importe quel sample fournit avec wxwidget ne compile pas. Donc,... Au secours !
Messages postés
1137
Date d'inscription
lundi 17 novembre 2003
Statut
Membre
Dernière intervention
23 janvier 2016
24
BruNews >> vu !
(De l'asm bien formé...)
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
30
bien entendu il faut lire:
res = bnMult(128, 2987, &ovf);
Afficher les 12 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.