Atelier Ingénierie F1 : Simulation et Analyse de Performance
Bienvenue au sein de l'équipe technique.
Vous avez été sélectionnés pour intégrer le département "Performance & Stratégie" de notre écurie. Ici, dans le paddock, l'intuition ne suffit pas : nous prenons des décisions basées sur les données.
Votre première mission consiste à valider nos outils de simulation. Vous allez utiliser Python, le standard de l'industrie pour le calcul numérique. Nous utiliserons NumPy pour traiter les flux de données du calculateur (ECU) et Matplotlib pour visualiser les courbes de performance.
Mettez-vous au travail. La prochaine session de qualifications approche.
Objectifs de la Formation Technique
- Maîtriser les bibliothèques standards de l'ingénierie (
numpy,matplotlib.pyplot). - Générer des données de simulation (création de vecteurs temporels et physiques).
- Effectuer des calculs vectoriels (simuler la physique sans boucles lentes).
- Produire des graphiques de télémétrie exploitables par les ingénieurs de piste.
Initialisation des Systèmes
Avant toute intervention, nous devons charger les modules de calcul. C'est la procédure standard.
import numpy as np # Moteur de calcul vectoriel import matplotlib.pyplot as plt # Interface de visualisation
Phase 1 : Calibrage des Capteurs (Mise en Jambe)
Votre mission : Simuler une accélération linéaire parfaite. Si un véhicule accélère à $5 , m/s^2$ pendant 10 secondes, sa vitesse suit la loi $V = a \times t$. C'est un exercice trivial pour vérifier que votre environnement Python fonctionne.
import numpy as np
import matplotlib.pyplot as plt
acceleration = 5.0 # m/s^2
# TODO : Créez une axe temporel de 0 à 10 secondes.
# Utilisez np.arange(début, fin_exclue, pas)
temps = ...
# TODO : Calculez la vitesse.
vitesse = ...
plt.figure(figsize=(8, 4))
plt.plot(temps, vitesse, label='Test Calibrage')
plt.title("Contrôle de Calibration - Capteur Vitesse")
plt.xlabel("Temps (s)")
plt.ylabel("Vitesse (m/s)")
plt.grid(True)
plt.legend()
plt.show()
Phase 2 : Analyse Sécurité
Votre mission : Calculer cette distance pour des vitesses d'approche allant de 50 à 150 km/h.
Note : N'oubliez pas que la télémétrie enregistre en m/s, alors que le tableau de bord affiche des km/h.
import numpy as np import matplotlib.pyplot as plt temps_reaction = 0.5 # secondes # TODO : Générez 50 points de vitesse entre 50 et 150 km/h. # Utilisez np.linspace(début, fin, nombre_de_points) pour une courbe fluide. vitesses_kmh = ... # TODO : Convertissez ces vitesses en m/s (divisez le vecteur par 3.6). vitesses_ms = ... # TODO : Calculez la distance parcourue (Distance = Vitesse * Temps). dist_reaction = ... # TODO : Tracez la distance en fonction de la vitesse (vitesses_kmh en X).
Phase 3 : Efficacité du Freinage
Votre mission : Simuler la courbe d'arrêt jusqu'à 250 km/h pour valider les zones de dégagement.
import numpy as np import matplotlib.pyplot as plt k = 0.004 # TODO : Créez un vecteur de vitesses de 0 à 250 km/h par pas de 5 km/h (np.arange). vitesses = ... # TODO : Calculez la distance de freinage théorique. Formule : D = k * (vitesse au carré). distances = ... # TODO : Tracez la courbe. # Utilisez le style 'r--' (rouge pointillé) pour indiquer une zone critique.
Phase 4 : Aérodynamique et Trajectoire
Votre mission : Modéliser la hauteur ($y$) en fonction de la distance ($x$) pour une sortie à 180 km/h avec un angle de 15°.
$$y(x) = x \cdot \tan(\alpha) - \frac{g \cdot x^2}{2 \cdot (V_0 \cdot \cos(\alpha))^2}$$
Attention : NumPy calcule les angles en radians.
import numpy as np import matplotlib.pyplot as plt V0_kmh = 180 V0_ms = .. angle_deg = .. g = .. # TODO : Convertissez l'angle en radians (np.radians). angle_rad = ... --- Simulation --- # TODO : Créez un vecteur de distance x de 0 à 40 mètres (100 points). x = ... # TODO : Implémentez la formule balistique complexe ci-dessus. y = ... # TODO : Tracez la trajectoire. # Ajoutez plt.axhline(0, color='black') pour représenter le sol.
Phase 5 : Optimisation Motrice (Power Unit)
Votre mission : Trouver informatiquement le régime moteur (RPM) exact où la puissance est maximale.
Pour rappel, $$ P(R) = aR^2 + bR + c $$
import numpy as np import matplotlib.pyplot as plt a, b, c = -0.000005, 0.05, 50 # TODO : Générez une plage de RPM de 1000 à 8000. rpm = ... # TODO : Calculez la puissance P pour cette plage. puissance = ... # TODO : Trouvez l'INDICE de la valeur maximale dans le tableau 'puissance' (np.argmax). idx_max = ... # TODO : Utilisez cet indice pour récupérer le RPM correspondant et la puissance max. rpm_optimum = ... puissance_peak = ... # TODO : Tracez la courbe. # Utilisez plt.annotate pour afficher la valeur du RPM optimal sur le graphe.
Phase 6 : Déploiement ERS (Logique de Boost)
Votre mission : Simuler une accélération où le boost s'active brusquement à $T=5s$. Cela nécessite une logique conditionnelle vectorielle.
import numpy as np
import matplotlib.pyplot as plt
def calcul_vitesse_ers(t):
vitesse_base = 15 * t # Accélération atmo classique
# # TODO : Calculez le boost ERS.
# Logique : Si t < 5, boost = 0. Sinon, boost = 50 * (1 - exp(...))
# Utilisez np.where(condition, valeur_si_vrai, valeur_si_faux)
boost = ..
return vitesse_base + boost
# TODO : Générez le temps de 0 à 10 secondes (200 points).
temps = ...
# TODO : Appliquez la fonction sur le vecteur temps.
vitesse_totale = ...
# TODO : Tracez la courbe de vitesse.
# Ajoutez une ligne verticale à t=5 (plt.axvline) pour marquer l'activation ERS.
Phase 7 : Analyse de Télémétrie (Statistiques de Course)
import numpy as np
import matplotlib.pyplot as plt
# Données brutes de télémétrie (en secondes)
chronos = np.array([81.2, 79.8, 80.5, 82.1, 80.0, 79.9, 83.0, 80.2, 80.8, 81.5, 80.1, 79.7, 80.3, 81.0])
# TODO : Calculez la moyenne des tours
moyenne = ...
# TODO : Calculez l'écart-type
ecart_type = ...
print(f"Performance Moyenne : {moyenne:.3f} s")
print(f"Indice de Régularité : {ecart_type:.3f} s")
# TODO : Tracez l'histogramme de la distribution des temps (plt.hist).
