Hot-keys on this page
r m x p toggle line displays
j k next/prev highlighted chunk
0 (zero) top of page
1 (one) first highlighted chunk
1# -*- coding: utf-8 -*-
2"""
3@file
4@brief Functions for :ref:`l-exemple_optim_alea`.
5"""
6import math
7import random
10def factorielle(x):
11 """
12 Calcule :math:`x!` de façon récursive.
13 """
14 if x == 0:
15 return 1
16 else:
17 return x * factorielle(x - 1)
20def profit(N, X, p, q, s):
21 """
22 Calcule le profit.
24 @param N nombre de poulets vendus
25 @param X nombre de poulets achetés
26 @param p prix d'achat
27 @param q prix de vente
28 @param s prix soldé
29 @return profit
30 """
31 if X <= N:
32 return X * (q - p)
33 else:
34 return X * (s - p) + N * (q - s)
37def proba_poisson(lx, i):
38 """
39 Calcule la probabilité :math:`\\pr{X=i}``
40 lorsque :math:`X` suit une loi de Poisson de paramètre
41 :math:`\\lambda`.
42 """
43 return math.exp(-lx) * (lx ** i) / factorielle(i)
46def esperance(X, p, q, s, lx):
47 """
48 Espérance du profit en faisant varier
49 le nombre de poulet vendus.
51 @param X nombre de poulets achetés
52 @param p prix d'achat
53 @param q prix de vente
54 @param s prix soldé
55 @param lx paramètre :math:`\\lambda`
56 @return espérance du profit
57 """
58 res = 0.0
59 for i in range(0, lx * 2):
60 res += profit(float(i), X, p, q, s) * proba_poisson(lx, i)
61 return res
64def maximum(p, q, s, lx):
65 """
66 Calcule les espérances de profit pour différents nombres
67 de poulets achetés.
69 @param p prix d'achat
70 @param q prix de vente
71 @param s prix soldé
72 @param lx paramètre :math:`\\lambda`
73 @return liste ``(X, profit)``
74 """
75 res = []
76 for X in range(0, 2 * lx):
77 r = esperance(X, p, q, s, lx)
78 res.append((X, r))
79 return res
82def find_maximum(res):
83 """
84 Trouver le couple (nombre de poulets achetés, profit)
85 lorsque le profit est maximum.
87 @param res résultat de la fonction :func:`maximum <mlstatpy.garden.poulet.maximum>`
88 @return ``(X, profit)`` maximum
89 """
90 m = (0, 0)
91 for r in res:
92 if r[1] > m[1]:
93 m = r
94 return m
97def exponentielle(lx):
98 """
99 Simule une loi exponentielle de paramètre :math:`\\lambda`.
100 """
101 u = random.random()
102 return - 1.0 / lx * math.log(1.0 - u)
105def poisson(lx):
106 """
107 Simule une loi de Poisson de paramètre :math:`\\lambda`.
108 """
109 s = 0
110 i = 0
111 while s <= 1:
112 s += exponentielle(lx)
113 i += 1
114 return i - 1
117def poisson_melange(params, coef):
118 """
119 Simule une variable selon un mélange de loi de Poisson.
121 @param params liste de paramètre :math:`\\lambda`
122 @param coef ``coef[i]`` coefficient associé à la loi de paramètre ``params[i]``
123 @return valeur simulée
124 """
125 s = 0
126 for i, pa in enumerate(params):
127 p = poisson(pa)
128 s += p * coef[i]
129 return s
132def histogramme_poisson_melange(params, coef, n=100000):
133 """
134 Calcule un histogramme d'un mélange de loi de Poisson.
136 @param params liste de paramètre :math:`\\lambda`
137 @param coef ``coef[i]`` coefficient associé à la loi de paramètre ``params[i]``
138 @return histogramme
139 """
140 h = [0.0 for i in range(0, 4 * max(params))]
141 for i in range(0, n):
142 x = poisson_melange(params, coef)
143 if x < len(h):
144 h[x] += 1
145 s = sum(h)
146 for i in range(0, len(h)):
147 h[i] = float(h[i]) / s
148 return h
151def f_proba_poisson_melange():
152 """
153 Wraps function *proba_poisson_melange* to avoid
154 global variable.
155 """
157 proba_poisson_melange_tableau = []
159 def local_proba_poisson_melange(params, coef, i):
160 """
161 Calcule la probabilité :math:`\\pr{X=i}``
162 lorsque :math:`X` suit un mélange de lois.
164 @param params liste de paramètre :math:`\\lambda`
165 @param coef ``coef[i]`` coefficient associé à la loi de paramètre ``params[i]``
166 @return valeur
167 """
168 if len(proba_poisson_melange_tableau) == 0:
169 proba_poisson_melange_tableau.extend(
170 histogramme_poisson_melange(params, coef))
171 if i >= len(proba_poisson_melange_tableau):
172 return 0.0 # pragma: no cover
173 return proba_poisson_melange_tableau[i]
175 return local_proba_poisson_melange
178proba_poisson_melange = f_proba_poisson_melange()