Commit 32ee2914 authored by Poulard Christine's avatar Poulard Christine :snake:
Browse files

La variable "p" pour nombre de crues a été remplacée par k pour ne pas risquer...

La variable "p" pour nombre de crues a été remplacée par k pour ne pas risquer de confondre avec une probabilité
parent 4bf9f655
No related merge requests found
Showing with 57 additions and 57 deletions
+57 -57
......@@ -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")
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment