initial commit

This commit is contained in:
gribse 2025-02-10 16:32:07 +01:00
commit 24b956961f

82
abaqueCuve.py Normal file
View file

@ -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()