4. PARTIE 3 : Modélisation et simulation (1h)

Activité 3.1 : Modèle énergétique théorique (30 min)

Objectif : Établir un modèle mathématique de la consommation

Équation de la puissance nécessaire

La puissance totale nécessaire au déplacement du chariot est :


Données du chariot :

  • Masse totale : m = 40 kg
  • Coefficient roulement : Cr = 0.02
  • Surface frontale : S = 0.15 m²
  • Coefficient traînée : Cx = 0.6
  • ρ_air = 1.2 kg/m³
  • Rendement moteur : η_m = 0.75
  • Rendement transmission : η_t = 0.85
  • Rendement global : η = η_m × η_t = 0.64

Question 10 : Calculez la puissance nécessaire pour différentes situations

Situation 1 : Plat, v = 6 km/h = 1.67 m/s



Situation 2 : Montée 10%, v = 5 km/h = 1.39 m/s

Question 11 : Vérifiez la cohérence avec vos mesures expérimentales

Activité 3.2 : Simulation de l'autonomie (30 min)

Objectif : Prédire l'autonomie selon différents profils de parcours

Modèle de simulation

Code Python à compléter :

import numpy as np
import matplotlib.pyplot as plt

# Paramètres du système
m = 40  # kg
g = 9.81
Cr = 0.02
rho = 1.2
S = 0.15
Cx = 0.6
eta_global = 0.64

# Batterie
U_batterie = 24  # V
capacite_Ah = 20  # Ah
energie_batterie = U_batterie * capacite_Ah  # Wh
DOD_max = 0.8  # Profondeur décharge max (80%)
energie_utilisable = energie_batterie * DOD_max

def puissance_necessaire(v, pente):
    """
    Calcule la puissance nécessaire à la batterie
    v : vitesse en m/s
    pente : pente en % (ex: 10 pour 10%)
    """
    alpha = np.arctan(pente / 100)
    
    P_gravite = m * g * v * np.sin(alpha)
    P_roulement = Cr * m * g * v * np.cos(alpha)
    P_aero = 0.5 * rho * S * Cx * v**3
    
    P_utile = P_gravite + P_roulement + P_aero
    P_batterie = P_utile / eta_global
    
    return max(0, P_batterie)  # Pas de recharge (pour l'instant)

def simuler_parcours(profil_parcours, vitesse_moyenne=1.67):
    """
    Simule la consommation sur un parcours donné
    profil_parcours : liste de tuples (distance_m, pente_%)
    vitesse_moyenne : en m/s
    """
    energie_consommee = 0
    distance_totale = 0
    
    historique = {
        'distance': [],
        'energie': [],
        'puissance': []
    }
    
    for distance, pente in profil_parcours:
        temps = distance / vitesse_moyenne
        puissance = puissance_necessaire(vitesse_moyenne, pente)
        energie = puissance * temps / 3600  # Conversion en Wh
        
        energie_consommee += energie
        distance_totale += distance
        
        historique['distance'].append(distance_totale)
        historique['energie'].append(energie_consommee)
        historique['puissance'].append(puissance)
    
    autonomie_restante = (energie_utilisable - energie_consommee) / energie_consommee * distance_totale
    
    return {
        'energie_totale': energie_consommee,
        'distance': distance_totale,
        'autonomie_estimee': distance_totale + autonomie_restante,
        'historique': historique
    }

# PROFIL 1 : Parcours de golf typique (18 trous)
profil_golf = [
    (400, 0),    # Trou 1-2 : plat
    (200, 5),    # Trou 3 : légère montée
    (300, 0),    # Trou 4 : plat
    (150, -5),   # Trou 5 : descente
    (350, 0),    # Trou 6 : plat
    (250, 10),   # Trou 7 : forte montée
    (400, 0),    # Trou 8-9 : plat
    # ... À COMPLÉTER pour 18 trous (total ≈ 6000m)
]

# Simulation
resultat = simuler_parcours(profil_golf)

print("=== RÉSULTATS SIMULATION ===")
print(f"Distance parcourue : {resultat['distance']/1000:.2f} km")
print(f"Énergie consommée : {resultat['energie_totale']:.2f} Wh")
print(f"Autonomie estimée totale : {resultat['autonomie_estimee']/1000:.2f} km")
print(f"Consommation moyenne : {resultat['energie_totale']/(resultat['distance']/1000):.2f} Wh/km")

# Graphique
plt.figure(figsize=(12, 6))

plt.subplot(2, 1, 1)
plt.plot(np.array(resultat['historique']['distance'])/1000, 
         resultat['historique']['energie'])
plt.axhline(y=energie_utilisable, color='r', linestyle='--', label='Capacité batterie')
plt.xlabel('Distance (km)')
plt.ylabel('Énergie consommée (Wh)')
plt.title('Consommation énergétique sur le parcours')
plt.legend()
plt.grid(True)

plt.subplot(2, 1, 2)
plt.plot(np.array(resultat['historique']['distance'])/1000, 
         resultat['historique']['puissance'])
plt.xlabel('Distance (km)')
plt.ylabel('Puissance instantanée (W)')
plt.title('Puissance appelée')
plt.grid(True)

plt.tight_layout()
plt.show()

Question 12 :

  • Complétez le profil pour un parcours 18 trous réaliste
  • Exécutez la simulation
  • L'autonomie est-elle suffisante ?

Question 13 : Testez différents profils