diff --git a/Programmes en Python/ProbaCruesMaxAn_SurNannees_stairs.py b/Programmes en Python/ProbaCruesMaxAn_SurNannees_stairs.py index ab644fc2cab093f522946bfce0bd42ba476218c1..4fa12da6258aa3119e5780b0b8a800bfbbf4764e 100644 --- a/Programmes en Python/ProbaCruesMaxAn_SurNannees_stairs.py +++ b/Programmes en Python/ProbaCruesMaxAn_SurNannees_stairs.py @@ -8,11 +8,9 @@ coté "Python" : mettre en oeuvre deux widgets de matplotlib (Button et Slider), """ from matplotlib import pyplot as plt -import matplotlib.gridspec as gridspec from matplotlib.widgets import Slider, Button # widgets du module matplotlib ! from matplotlib import ticker from scipy.special import comb -import numpy as np # CONSTANTE @@ -24,37 +22,38 @@ TRACE_PAR_PLOT = False # False # FONCTIONS # # trois fonctions correspondant chacune à une manière de définir un échantillon de nb valeurs -def proba_crue(n, p, f): - """ Probabilité d’avoir exactement p crues de fréquence f en n années : C(n,p)*f^p*(1-f)^(N-p) +def proba_crue(n, k, f): + """ Probabilité d’avoir exactement p crues de fréquence f en n années : C(n,k)*f^k*(1-f)^(N-k) """ - return comb(n, p) * (f ** p) * ((1 - f) ** (n - p)) + return comb(n, k) * (f ** k) * ((1 - f) ** (n - k)) -def afficher_probas(nb, n, p, f): - nb = max(nb, p) - if p < 2: - texte = "crue supérieure" - else: - texte = "crues supérieures" - print( - f"proba d'avoir exactement p {texte} à la crue de période de retour {1 / f:.0f} (= fréquence {f:.02f] }en {n} années ") - for p in range(nb): +def afficher_probas(kmax, n, f): + kmax = max(n, kmax) + print(f" pour k variant de 0 à {kmax}" + f"proba d'avoir exactement 'k crue(s)' supérieures à la crue de période de retour {1 / f:.0f} (= fréquence {f:.02f}) en {n} années ") + + for k in range(kmax+1): + if k < 2: + texte = "crue supérieure" + else: + texte = "crues supérieures" - print(f" exactement {p} {texte} : {proba_crue(n, p, f):.2f)*100:.2f}%") + print(f" exactement {k} {texte} : {proba_crue(n, k, f):.2f)*100:.2f}%") def calcul_courbes(n,f): cumul_au_plus = 0 liste_probas_exactement=[] liste_probas_auplus = [] - p= 0 + k= 0 while cumul_au_plus < 0.999: - proba = proba_crue(n,p,f) + proba = proba_crue(n,k,f) liste_probas_exactement.append(proba) cumul_au_plus += proba liste_probas_auplus.append(cumul_au_plus) - p+=1 - - return p-1, liste_probas_exactement, liste_probas_auplus + k+=1 + # on retourne k-1 car on a effectué le dernier calcul pour p-1 + return k-1, liste_probas_exactement, liste_probas_auplus def stair_plot(x,y, couleur, label=None): x = [*x, x[-1]] # duplicate last to draw last line @@ -68,15 +67,15 @@ def update_graphique_plot(val): n = int(slider_n.val) T = int(slider_T.val) - p, liste_probas_exactement, liste_probas_auplus = calcul_courbes(n,1/T) - fig.suptitle(f"Démo : probabilité d'avoir p crues > T={T}ans en {n} années") + k_dernier, liste_probas_exactement, liste_probas_auplus = calcul_courbes(n,1/T) + fig.suptitle(f"Démo : probabilité d'avoir k crues > T={T}ans en {n} années") - courbe_exactement.set_data(range(p + 1), liste_probas_exactement) - courbe_cumul.set_data(range(p + 1), liste_probas_auplus) + courbe_exactement.set_data(range(k_dernier + 1), liste_probas_exactement) + courbe_cumul.set_data(range(k_dernier + 1), liste_probas_auplus) - ax.set_xlim(0, p + 1) + ax.set_xlim(0, k_dernier + 1) - if p > 15: + if k_dernier > 15: ax.xaxis.set_major_locator(plt.MultipleLocator(5)) ax.xaxis.set_minor_locator(plt.MultipleLocator(1)) else: @@ -90,43 +89,48 @@ def update_graphique_stairs(val): n = int(slider_n.val) T = int(slider_T.val) - p, liste_probas_exactement, liste_probas_auplus = calcul_courbes(n, 1 / T) - fig.suptitle(f"Démo : probabilité d'avoir p crues > T={T}ans en {n} années") + k_dernier, liste_probas_exactement, liste_probas_auplus = calcul_courbes(n, 1 / T) + fig.suptitle(f"Démo : probabilité d'avoir k crues > T={T}ans en {n} années") ax.clear() - stair_plot(range(p + 1), liste_probas_exactement, couleur="blue", label="exactement p crues") - stair_plot(range(p + 1), liste_probas_auplus, couleur="sienna", label="p crues ou moins de p") - - ax.set_xlim(0, p + 1) - if p > 15: - ax.xaxis.set_major_locator(plt.FixedLocator([0.5 + i for i in range(0, p, 5)])) - ax.xaxis.set_minor_locator(plt.FixedLocator([0.5 + i for i in range(0, p, 1)])) + stair_plot(range(k_dernier + 1), liste_probas_exactement, couleur="blue", label="exactement k crues") + stair_plot(range(k_dernier + 1), liste_probas_auplus, couleur="sienna", label="k crues ou moins de k") + + ax.axhline(y=0, color='grey', ls=':') + ax.axhline(y=1, c='grey', ls=':') + ax.set_xlim(0, k_dernier + 1) + ax.set_xlabel("nombre de crues k") + ax.set_ylabel("probabilité") + + if k_dernier > 15: + ax.xaxis.set_major_locator(plt.FixedLocator([0.5 + i for i in range(0, k_dernier, 5)])) + ax.xaxis.set_minor_locator(plt.FixedLocator([0.5 + i for i in range(0, k_dernier, 1)])) else: - ax.xaxis.set_major_locator(plt.FixedLocator([0.5 + i for i in range(0, p, 1)])) + ax.xaxis.set_major_locator(plt.FixedLocator([0.5 + i for i in range(0, k_dernier, 1)])) ax.xaxis.set_minor_locator(plt.NullLocator()) ax.xaxis.set_major_formatter(ticker.FormatStrFormatter("%d")) - + ax.legend(loc='center right') fig.canvas.draw_idle() #CORPS DU PROGRAMME n = 100 T = 100 -p, liste_probas_exactement, liste_probas_auplus = calcul_courbes(n, 1 / T) +k_dernier, liste_probas_exactement, liste_probas_auplus = calcul_courbes(n, 1 / T) fig, (ax, ax_espace, ax_sn, ax_sT) = plt.subplots(nrows=4, ncols=1, gridspec_kw={'height_ratios':[6,1, 1,1]}, sharex=False) plt.subplots_adjust(left=0.2, bottom=None, right=None, top=None, wspace=None, hspace=0.1) fig.canvas.set_window_title("ScE - Hydrologie - Démo probas crue sur N années") -fig.suptitle(f"Démo : probabilité d'avoir p crues > T={T}ans en {n} années") +fig.suptitle(f"Démo : probabilité d'avoir k_dernier crues > T={T}ans en {n} années") if TRACE_PAR_PLOT: - courbe_exactement, = ax.plot(range(p + 1), liste_probas_exactement, label="exactement p crues",ls='None', marker='o', markersize=10) - courbe_cumul, = ax.plot(range(p + 1), liste_probas_auplus, label="p crues ou moins de p", ls='None', marker='o', markersize=10) + courbe_exactement, = ax.plot(range(k_dernier + 1), liste_probas_exactement, label="exactement k crues",ls='None', marker='o', markersize=10) + courbe_cumul, = ax.plot(range(k_dernier + 1), liste_probas_auplus, label="k crues ou moins de k", ls='None', marker='o', markersize=10) update_graphique = update_graphique_plot else: - stair_plot(range(p + 1),liste_probas_exactement, couleur="blue", label="exactement p crues") - stair_plot(range(p + 1),liste_probas_auplus, couleur="sienna", label="p crues ou moins de p") + stair_plot(range(k_dernier + 1),liste_probas_exactement, couleur="blue", label="exactement k crues") + stair_plot(range(k_dernier + 1),liste_probas_auplus, couleur="sienna", label="k crues ou moins de k") update_graphique = update_graphique_stairs for ax_s in [ax_espace, ax_sn, ax_sT]: @@ -138,7 +142,7 @@ ax_espace.patch.set_alpha(0.01) #sinon cet axe cache le titre de l'axe des x au for pos in ['right', 'top', 'bottom', 'left']: ax_espace.spines[pos].set_visible(False) -ax.set_xlabel("nombre de crues p") +ax.set_xlabel("nombre de crues k") ax.set_ylabel("probabilité") # nom connu même hors de la fonction pour éviter le GC ? @@ -148,18 +152,18 @@ slider_n = Slider( slider_n.on_changed(update_graphique) -# T, période de retour -# valeurs_possibles = np.array([2, 5, 10, 20, 25, 50, 100, 200]) - slider_T = Slider( ax_sT, "période de retour T ", 2, 1000, valinit=T, valstep=1, valfmt='%0.0f', color="blue") slider_T.on_changed(update_graphique) -ax.legend() -ax.set_xlim(0,p+1) +ax.legend(loc='center right') +ax.set_xlim(0,k_dernier+1) +ax.axhline(y=0,color='grey',ls=':') +ax.axhline(y=1, c='grey',ls=':') + if TRACE_PAR_PLOT : - if p > 15: + if k_dernier > 15: ax.xaxis.set_major_locator(plt.MultipleLocator(5)) ax.xaxis.set_minor_locator(plt.MultipleLocator(1)) else: @@ -167,10 +171,10 @@ if TRACE_PAR_PLOT : ax.xaxis.set_minor_locator(plt.NullLocator()) else: if p > 15: - ax.xaxis.set_major_locator(plt.FixedLocator([0.5+i for i in range(0,p,5)])) - ax.xaxis.set_minor_locator(plt.FixedLocator([0.5+i for i in range(0,p,1)])) + ax.xaxis.set_major_locator(plt.FixedLocator([0.5+i for i in range(0,k_dernier,5)])) + ax.xaxis.set_minor_locator(plt.FixedLocator([0.5+i for i in range(0,k_dernier,1)])) else: - ax.xaxis.set_major_locator(plt.FixedLocator([0.5+i for i in range(0,p,1)])) + ax.xaxis.set_major_locator(plt.FixedLocator([0.5+i for i in range(0,k_dernier,1)])) ax.xaxis.set_minor_locator(plt.NullLocator()) ax.xaxis.set_major_formatter(ticker.FormatStrFormatter("%d")) @@ -178,10 +182,6 @@ ax.xaxis.set_major_formatter(ticker.FormatStrFormatter("%d")) plt.show() - - - - print("Premiers calculs, valeurs par défaut")