# -*- coding: utf-8 -*- """ Created on Mon Feb 10 16:29:16 2025 @author: Maël Dbq """ import numpy as np import matplotlib.pyplot as plt import matplotlib.dates as mdates from scipy.optimize import root_scalar import datetime # Fonction pour calculer l'aire du segment de disque pour une flèche donnée def segment_area(f, R): if f == 0: return 0 return R**2 * np.arccos((R - f) / R) - (R - f) * np.sqrt(2 * R * f - f**2) # Fonction pour trouver la flèche correspondant à une aire donnée def find_f(A, R): if A <= 0: return 0 if A >= np.pi * R**2: return 2 * R # Cas d'un disque plein try: sol = root_scalar(lambda f: segment_area(f, R) - A, bracket=[0, 2*R], method='bisect') return sol.root if sol.converged else None except ValueError: return None # Retourne None si aucun zéro trouvé # Demande du rayon et de la longueur avec conversion de la virgule rayon_cuve = float(input("Entrez le rayon de la cuve (m) : ").replace(",", ".")) longueur_cuve = float(input("Entrez la longueur de la cuve (m) : ").replace(",", ".")) # Capacité maximale de la cuve (cylindre entier) volume_max = np.pi * rayon_cuve**2 * longueur_cuve # Liste des volumes espacés de 0.1 m³ volumes = np.arange(0, volume_max + 0.1, 0.1) # Calcul des hauteurs de flèche associées flèches = [find_f(v / longueur_cuve, rayon_cuve) for v in volumes] # Supprimer les valeurs None (au cas où) volumes = np.array([v for i, v in enumerate(volumes) if flèches[i] is not None]) flèches = np.array([f for f in flèches if f is not None]) # Création d'une échelle temporelle : une valeur par mois sur un an dates = [datetime.date.today() + datetime.timedelta(days=30*i) for i in range(len(volumes))] # Espacement en flèche pour avoir des graduations équidistantes en volume nb_grad = 10 # Nombre de graduations voulues volumes_grad = np.linspace(0, volume_max, nb_grad) flèche_grad = [find_f(v / longueur_cuve, rayon_cuve) for v in volumes_grad] # Tracer le graphe fig, ax1 = plt.subplots(figsize=(10, 6)) # Axe principal : Volume en fonction des mois ax1.plot(dates, volumes, label="Volume (m³)", color='b', linewidth=2) ax1.set_xlabel("Temps (mois)") ax1.set_ylabel("Volume (m³)", color='b') ax1.tick_params(axis='y', labelcolor='b') ax1.xaxis.set_major_formatter(mdates.DateFormatter("%b %Y")) # Format mois année ax1.xaxis.set_major_locator(mdates.MonthLocator()) # Une graduation par mois plt.xticks(rotation=45) # Deuxième axe pour les hauteurs de flèche ax2 = ax1.twinx() ax2.plot(dates, flèches, label="Hauteur de remplissage (m)", color='r', linestyle='dashed', linewidth=2) ax2.set_ylabel("Hauteur de remplissage (m)", color='r') ax2.tick_params(axis='y', labelcolor='r') # Ajouter un quadrillage qui colle aux hauteurs ax2.set_yticks(flèche_grad) # Aligner les graduations de l'axe de droite sur les hauteurs ax2.grid(visible=True, linestyle='--', alpha=0.6, which='both') # Quadrillage en pointillé # Légende et titre fig.suptitle("Évolution du remplissage de la cuve au fil du temps") fig.tight_layout() plt.show()