From 24b956961f4b119f829df4475849181eee6071e0 Mon Sep 17 00:00:00 2001 From: gribse Date: Mon, 10 Feb 2025 16:32:07 +0100 Subject: [PATCH] initial commit --- abaqueCuve.py | 82 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100644 abaqueCuve.py diff --git a/abaqueCuve.py b/abaqueCuve.py new file mode 100644 index 0000000..3cb92d8 --- /dev/null +++ b/abaqueCuve.py @@ -0,0 +1,82 @@ +# -*- 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() \ No newline at end of file