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)

Briefing Technique
Nous venons d'installer un nouvel accéléromètre. Avant de l'utiliser en piste, nous devons vérifier qu'il répond correctement à une loi physique simple.

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é

Lien Technique
Maintenant que les capteurs sont calibrés, intéressons-nous au facteur humain. Même nos meilleurs pilotes ont un délai physiologique de réaction.
Contexte
Sur la ligne de départ, chaque milliseconde compte. Cependant, pour la sécurité, nous devons connaître la distance parcourue "à l'aveugle" pendant le temps de réaction du pilote ($0.5s$).

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

Lien Technique
Le pilote a réagi, maintenant c'est à la mécanique de jouer. Nos freins atteignent 1000°C en bout de ligne droite.
Contexte
La distance de freinage n'est pas linéaire : elle augmente avec le carré de la vitesse. C'est une loi physique impitoyable que nous devons modéliser pour définir les points de freinage sur le circuit.

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

Lien Technique
Nous maîtrisons le comportement au sol. Mais en cas de perte d'appui aérodynamique sur un vibreur, la voiture peut décoller.
Contexte
L'équipe sécurité demande une simulation de trajectoire balistique en cas de sortie de piste à haute vitesse sur un plan incliné.

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)

Lien Technique
Le châssis est validé. Passons au moteur. Nous devons dire au pilote exactement quand changer de rapport pour une efficacité maximale.
Contexte
Le banc d'essai moteur nous a donné une courbe de puissance polynomiale. La puissance ne monte pas indéfiniment, elle atteint un pic puis s'effondre.

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)

Lien Technique
La puissance brute ne suffit pas pour doubler. Nous utilisons l'ERS (Energy Recovery System) pour un surplus de puissance temporaire.
Contexte
Le mode "Overtake" délivre un boost exponentiel, mais il est bloqué électroniquement pendant les 5 premières secondes après la sortie de virage pour éviter le patinage.

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)

Lien Technique
La course est terminée. Le pilote prétend avoir été régulier. Les données ne mentent jamais. Vérifions cela.
Contexte
Nous avons extrait les temps au tour du dernier relais. Nous devons calculer la moyenne (performance pure) et l'écart-type (régularité). Un écart-type faible signifie un pilote constant, crucial pour la stratégie des pneus.
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).