Dans cet article, nous abordons les derniers aspects de la balistique externe en examinant les sixième et septième cas. Nous prendrons en compte la diminution de la gravité en fonction de l’altitude, ainsi que la courbure de la Terre.

Sixième cas

Sixième cas

Septième cas. Début.

Septième cas. Début.

Septième cas. Reformulation du problème

Septième cas. Reformulation du problème

Septième cas. Fin.

Septième cas. Fin.

Nous allons mettre en pratique tout ce qui précède sous Python :

import numpy as np
import matplotlib.pyplot as plt
from scipy.integrate import solve_ivp

Constantes

g0 = 9.80665 # m/s² — gravité au niveau de la mer RE = 6371000 # m — rayon de la Terre rho0 = 1.225 # kg/m³ — densité de l'air au niveau de la mer H = 8000 # m — hauteur d'échelle

Vitesse du son en fonction de l'altitude (modèle simplifié)

def sound_speed(h): if h < 11000: # Troposphère return 340 - 0.0065 * h else: # Stratosphère et au-delà return 295

Paramètres du projectile

m = 2000 # kg — masse S = 0.3 # m² — surface de section

Vitesse et angle initiaux

v0 = 4000 # m/s theta0 = 50 # degrés

def cx(M): """Coefficient de traînée selon la loi de 1943""" if M < 0.8: return 0.15 + 0.25 M elif M < 1.2: return 0.4 - 0.3 (M - 0.8) elif M<4: return 0.28 + 0.05 * (M - 1.2) else: return 1

def rho(h): """Densité de l'air avec décroissance exponentielle""" return rho0 * np.exp(-h / H)

def g(h): """Gravité avec l'altitude""" return g0 * (RE / (RE + h))**2

def equations(t, state): """ Système des équations de mouvement state = [r, phi, vr, vphi] r — distance au centre de la Terre phi — angle polaire vr — vitesse radiale vphi — vitesse azimutale """ r, phi, vr, vphi = state h = r - RE # hauteur au-dessus de la surface

# Vérification des limites de calcul
if h &lt; -100:  # projectile sous terre
    return [0, 0, 0, 0]
if h &gt; 1e6:  # hauteur supérieure à 1000 km — résistance négligeable
    # Équations simplifiées sans résistance
    dvr_dt = -g(h) + vphi**2 / r
    dvphi_dt = -vr * vphi / r
    return [vr, vphi / r, dvr_dt, dvphi_dt]

# Vitesse et nombre de Mach
v = np.sqrt(vr**2 + vphi**2)
if v == 0:
    M = 0
else:
    a = sound_speed(h)
    M = v / a

# Densité de l'air et coefficient de traînée
rho_h = rho(h)
cx_val = cx(M)

# Forces de traînée
F_drag = 0.5 * rho_h * v**2 * S * cx_val
Fr = -F_drag * vr / v  # composante radiale
Fphi = -F_drag * vphi / v  # composante azimutale

# Accélérations
dvr_dt = Fr / m - g(h) + vphi**2 / r
dvphi_dt = Fphi / m - vr * vphi / r

return [vr, vphi / r, dvr_dt, dvphi_dt]

def event_ground(t, state):
"""Événement — atteinte de la surface de la Terre"""
r = state[0]
return r - RE # zéro lorsque r = RE
event_ground.terminal = True # arrête l'intégration
event_ground.direction = -1 # uniquement lors de la diminution de r

Conditions initiales

r0 = RE # distance initiale au centre de la Terre
phi0 = 0 # angle initial
vr0 = v0 np.sin(np.radians(theta0)) # vitesse radiale
vphi0 = v0
np.cos(np.radians(theta0)) # vitesse azimutale

initial_state = [r0, phi0, vr0, vphi0]

Intervalle de temps (temps maximum)

t_span = (0, 1000) # 0–1000 secondes (suffisant pour la plupart des cas)

Résolution du système d'ODE avec événement

solution = solve_ivp(
equations,
t_span,
initial_state,
method='RK45',
events=event_ground,
dense_output=True
)

Extraction des résultats

t = solution.t
r = solution.y[0]
phi = solution.y[1]
vr = solution.y[2]
vphi = solution.y[3]

Transformation en coordonnées cartésiennes pour visualisation

x = np.sqrt(vr2 + vphi2)t np.cos(np.radians(phi))

Calcul des paramètres supplémentaires

h = r - RE
v_total = np.sqrt(vr2 + vphi2)
M_history = [v_total[i] / sound_speed(h[i]) if v_total[i] > 0 else 0 for i in range(len(v_total))]

Recherche du point d'impact (depuis l'événement)

if solution.t_events[0].size > 0:
fall_time = solution.t_events[0][0]

Interpolation pour déterminer avec précision les coordonnées au moment de l'impact

state_fall = solution.sol(fall_time)
r_fall = state_fall[0]
phi_fall = state_fall[1]
range_m = (r_fall - RE) * phi_fall  # approximativement pour de petits angles
max_height = np.max(h)  # hauteur maximale

else:
fall_time = t[-1]
range_m = x[-1]
max_height = np.max(h)

Visualisation

plt.figure(figsize=(14, 10))

Trajectoire

plt.subplot(2, 2, 1)
plt.plot(x/1000,h/1000, label="Trajectoire", linewidth=2)
plt.xlabel('X, km')
plt.ylabel('Y, km')
plt.title('Trajectoire de vol')
plt.grid(True, alpha=0.7)
plt.axis('equal')
plt.legend()

Hauteur dans le temps

plt.subplot(2, 2, 2)
plt.plot(t, h/1000, label="Hauteur", linewidth=2, color="orange")
plt.xlabel('Temps, s')
plt.ylabel('Hauteur, km')
plt.title('Hauteur de vol')
plt.grid(True, alpha=0.3)
plt.legend()

Vitesse dans le temps

plt.subplot(2, 2, 3)
plt.plot(t, v_total, label="Vitesse", linewidth=2, color="green")
plt.xlabel('Temps, s')
plt.ylabel('Vitesse, m/s')
plt.title('Vitesse de vol')
plt.grid(True, alpha=0.3)
plt.legend()

Nombre de Mach dans le temps

plt.subplot(2, 2, 4)
plt.plot(t, M_history, label="Nombre de Mach", linewidth=2, color="red")
plt.xlabel('Temps, s')
plt.ylabel('Nombre de Mach')
plt.title('Nombre de Mach de vol')
plt.grid(True, alpha=0.3)
plt.legend()

plt.tight_layout()
plt.show()

Les résultats de la simulation sont illustrés ci-dessous :

Graphiques

Graphiques

En conclusion, la problématique initiale est résolue. Une modélisation mathématique réaliste a été élaborée, prenant en compte de nombreux paramètres et facteurs influençant le mouvement d’un corps dans l’atmosphère terrestre. Un algorithme a été proposé pour résoudre ce modèle avec une grande précision dans un temps raisonnable.

Points à retenir

  • La gravité diminue avec l’altitude, impactant le comportement du projectile.
  • La courbure de la Terre doit être intégrée pour des trajectoires longues.
  • Les variations de la densité de l’air influencent la traînée sur le projectile.
  • Le nombre de Mach varie au cours du vol, affectant ainsi le coefficient de traînée.
  • Le modèle mathématique proposé est robuste pour simuler des cas variés en balistique.

En tant que passionné de balistique, je ne peux m’empêcher d’admirer la complexité de ces phénomènes. L’importance de la modélisation mathématique devient cruciale pour comprendre le mouvement des projectiles dans notre atmosphère. Quelles nouvelles applications pourrions-nous envisager, allant des simples projets éducatifs à des implications militaires avancées ? La discussion est ouverte, et vos réflexions pourraient nous mener à des découvertes passionnantes.


Partager : X Facebook WhatsApp LinkedIn Reddit

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *