Advertisement
Guest User

Untitled

a guest
Dec 9th, 2021
127
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.71 KB | None | 0 0
  1. """
  2. author: PackSciences
  3. """
  4. from scipy.special import comb as C
  5. from math import floor
  6. from collections import OrderedDict
  7. import matplotlib.pyplot as plt
  8.  
  9.  
  10. def sommande(j, p, n, m):
  11.     """
  12.    Calcule le sommande dans l'expression du modèle
  13.    en fonction des différents paramètres
  14.    Paramètres:
  15.    j : indice muet de sommation
  16.    p : probabilité de l'expérience de Bernoulli
  17.    n : nombre total d'expériences de Bernoulli réalisé
  18.    m : longueur de la chaine maximale
  19.    """
  20.     if j > floor(n/m):
  21.         raise ValueError("Erreur sur la valeur de j: {}".format(j))
  22.     elif j < 1:
  23.         raise ValueError("Erreur sur la valeur de j: {}".format(j))
  24.     if p > 1 or p < 0:
  25.         raise ValueError("Erreur sur la valeur de p: {}".format(p))
  26.     res = (-1)**(j+1)
  27.     res *= (p + ((n-(j*m)+1)/j)*(1-p))
  28.     res *= C(n-j*m, j-1)
  29.     res *= p**(j*m)
  30.     res *= (1-p)**(j-1)
  31.     return res
  32.  
  33.  
  34. def de_moivre(p, n, m):
  35.     """
  36.    Réalise la somme du modèle de de Moivre pour la longueur de la plus
  37.    longue chaîne pour n expériences de Bernoulli.
  38.    Correspond à P(l_n >= m) (probabilité cumulative)
  39.    Paramètres:
  40.    p : probabilité de l'expérience de Bernoulli
  41.    n : nombre total d'expériences de Bernoulli réalisé
  42.    m : longueur de la chaine maximale
  43.    """
  44.     if n > 1000:
  45.         raise ValueError("L'algorithme diverge numériquement")
  46.     somme = 0
  47.     for j in range(1, floor(n/m) + 1):
  48.         somme += sommande(j, p, n, m)
  49.     if somme > 1:
  50.         if n > 100:
  51.             # la remise à 1 est nécessaire pour des valeurs de n > 100
  52.             somme = 1
  53.         else:
  54.             raise ValueError("La somme trouvée est supérieure à 1 "
  55.                              "pour n < 100")
  56.     return somme
  57.  
  58.  
  59. def graphique_cumulative(p, n_min, n_max, n_pas, m):
  60.     """
  61.    Renvoie la probabilité cumulative en fonction du nombre d'expériences n
  62.    de n_min à n_max avec un pas n_pas, d'avoir une longueur >= m, à p fixé
  63.    """
  64.     plt.close()
  65.     dic_resu = OrderedDict()
  66.     for n in range(n_min, n_max, n_pas):
  67.         dic_resu[n] = de_moivre(p, n, m)
  68.     plt.scatter(list(dic_resu.keys()),
  69.                 [dic_resu[cle] for cle in dic_resu.keys()],
  70.                 label="$P(X_{n} ≥ m)$ as a function of n")
  71.     plt.title("Probability to obtain a chain of length ≥ {0:}"
  72.               "\n as a function of the number of Bernoulli trials realized"
  73.               " of probability {1:.2%}".format(m, p))
  74.     plt.ylabel("Cumulative probability")
  75.     plt.xlabel("Number of trials")
  76.     plt.legend()
  77.     plt.show()
  78.     return dic_resu
  79.  
  80. p = 0.93
  81. n_min = 2
  82. n_max = 1000
  83. pas = 1
  84. m = 100
  85.  
  86. graphique_cumulative(p, n_min, n_max, pas, m)
  87.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement