[docs]deffactorielle(x):""" Calcule :math:`x!` de façon récursive. """ifx==0:return1else:returnx*factorielle(x-1)
[docs]defprofit(N,X,p,q,s):""" Calcule le profit. :param N: nombre de poulets vendus :param X: nombre de poulets achetés :param p: prix d'achat :param q: prix de vente :param s: prix soldé :return: profit """ifX<=N:returnX*(q-p)else:returnX*(s-p)+N*(q-s)
[docs]defproba_poisson(lx,i):""" Calcule la probabilité :math:`\\pr{X=i}`` lorsque :math:`X` suit une loi de Poisson de paramètre :math:`\\lambda`. """returnmath.exp(-lx)*(lx**i)/factorielle(i)
[docs]defesperance(X,p,q,s,lx):""" Espérance du profit en faisant varier le nombre de poulet vendus. :param X: nombre de poulets achetés :param p: prix d'achat :param q: prix de vente :param s: prix soldé :param lx: paramètre :math:`\\lambda` :return: espérance du profit """res=0.0foriinrange(lx*2):res+=profit(float(i),X,p,q,s)*proba_poisson(lx,i)returnres
[docs]defmaximum(p,q,s,lx):""" Calcule les espérances de profit pour différents nombres de poulets achetés. :param p: prix d'achat :param q: prix de vente :param s: prix soldé :param lx: paramètre :math:`\\lambda` :return: liste ``(X, profit)`` """res=[]forXinrange(2*lx):r=esperance(X,p,q,s,lx)res.append((X,r))returnres
[docs]deffind_maximum(res):""" Trouver le couple (nombre de poulets achetés, profit) lorsque le profit est maximum. :param res: résultat de la fonction :func:`maximum <mlstatpy.garden.poulet.maximum>` :return: ``(X, profit)`` maximum """m=(0,0)forrinres:ifr[1]>m[1]:m=rreturnm
[docs]defexponentielle(lx):""" Simule une loi exponentielle de paramètre :math:`\\lambda`. """u=random.random()return-1.0/lx*math.log(1.0-u)
[docs]defpoisson(lx):""" Simule une loi de Poisson de paramètre :math:`\\lambda`. """s=0i=0whiles<=1:s+=exponentielle(lx)i+=1returni-1
[docs]defpoisson_melange(params,coef):""" Simule une variable selon un mélange de loi de Poisson. :param params: liste de paramètre :math:`\\lambda` :param coef: ``coef[i]`` coefficient associé à la loi de paramètre ``params[i]`` :return: valeur simulée """s=0fori,painenumerate(params):p=poisson(pa)s+=p*coef[i]returns
[docs]defhistogramme_poisson_melange(params,coef,n=100000):""" Calcule un histogramme d'un mélange de loi de Poisson. :param params: liste de paramètre :math:`\\lambda` :param coef: ``coef[i]`` coefficient associé à la loi de paramètre ``params[i]`` :return: histogramme """h=[0.0foriinrange(4*max(params))]for_iinrange(n):x=poisson_melange(params,coef)ifx<len(h):h[x]+=1s=sum(h)foriinrange(len(h)):h[i]=float(h[i])/sreturnh
[docs]deff_proba_poisson_melange():""" Wraps function *proba_poisson_melange* to avoid global variable. """proba_poisson_melange_tableau=[]deflocal_proba_poisson_melange(params,coef,i):""" Calcule la probabilité :math:`\\pr{X=i}`` lorsque :math:`X` suit un mélange de lois. :param params: liste de paramètre :math:`\\lambda` :param coef: ``coef[i]`` coefficient associé à la loi de paramètre ``params[i]`` :return: valeur """ifnotproba_poisson_melange_tableau:proba_poisson_melange_tableau.extend(histogramme_poisson_melange(params,coef))ifi>=len(proba_poisson_melange_tableau):return0.0returnproba_poisson_melange_tableau[i]returnlocal_proba_poisson_melange