Modélisation analytique et numérique de la balistique extérieure : trois cas clés
Le problème de la balistique extérieure décrit le mouvement plan d'un corps soumis à la gravité, lancé à un angle par rapport à l'horizontale avec une vitesse initiale. Trois cas sont envisagés : absence de résistance, résistance linéaire selon la loi de Stokes, et résistance quadratique suivant la loi de Newton. Les solutions analytiques sont complétées par des méthodes numériques pour une simulation réaliste.
Dans le premier cas — sans résistance — la trajectoire est une parabole. Pour v₀ = 20 m/s et α = 30°, portée et hauteur maximale s'obtiennent par des formules simples :
x(t) = v₀ cos(α) t
y(t) = v₀ sin(α) t - (g t²)/2
Résistance linéaire : loi de Stokes
Avec une résistance linéaire, la force est proportionnelle à la vitesse : F = -k v. Les équations différentielles sont :
m dv_x/dt = -k v_x
m dv_y/dt = -m g - k v_y
La solution donne des dépendances exponentielles de la vitesse :
v_x(t) = v₀ cos(α) e^(-kt/m)
v_y(t) = (v₀ sin(α) + (m g)/k) e^(-kt/m) - (m g)/k
L'intégration de ces expressions permet d'obtenir y(x). Pour v₀ = 70 m/s, α = 55°, k = 0,04 kg/s, m = 0,5 kg, la trajectoire devient asymétrique et la portée est réduite par rapport au cas idéal.
Résistance quadratique : loi de Newton
Aux vitesses élevées, la résistance quadratique domine : F = -k v². Le système d'équations différentielles est :
dv_x/dt = -k v v_x
dv_y/dt = -g - k v v_y
où v = √(v_x² + v_y²). Leonhard Euler a résolu ce système analytiquement au XVIIIe siècle. Aujourd'hui, on utilise l'intégration numérique via la méthode Runge-Kutta d'ordre 4–5.
import numpy as np
import matplotlib.pyplot as plt
from scipy.integrate import solve_ivp
class BallisticsSimulator:
def __init__(self):
self.g = 9.81
self.rho = 1.225
def calculate_k(self, diameter, mass, Cd=0.3):
A = np.pi * (diameter / 2) ** 2
k = (Cd * self.rho * A) / (2 * mass)
return k
def equations_of_motion(self, t, state, k):
x, vx, y, vy = state
v = np.sqrt(vx**2 + vy**2)
ax = -k * v * vx
ay = -self.g - k * v * vy
return [vx, ax, vy, ay]
def simulate(self, v0, angle_deg, x0=0, y0=0,
diameter=0.1, mass=10, Cd=0.3,
t_max=100, dt=0.01):
k = self.calculate_k(diameter, mass, Cd)
angle_rad = np.radians(angle_deg)
vx0 = v0 * np.cos(angle_rad)
vy0 = v0 * np.sin(angle_rad)
initial_state = [x0, vx0, y0, vy0]
t_span = (0, t_max)
t_eval = np.arange(0, t_max, dt)
solution = solve_ivp(
self.equations_of_motion,
t_span,
initial_state,
args=(k,),
t_eval=t_eval,
method='RK45'
)
t = solution.t
x = solution.y[0]
y = solution.y[2]
fall_index = np.where(y < 0)[0]
if len(fall_index) > 0:
fall_index = fall_index[0]
t = t[:fall_index + 1]
x = x[:fall_index + 1]
y = y[:fall_index + 1]
return t, x, y, k
def plot_trajectory(self, t, x, y, k, v0, angle):
plt.figure(figsize=(12, 8))
plt.plot(x, y, 'b-', linewidth=2, label='Trajectoire')
plt.scatter(x[0], y[0], color='red', s=100, zorder=5, label='Lancement')
plt.scatter(x[-1], y[-1], color='green', s=100, zorder=5, label='Impact')
plt.xlabel('Distance, m', fontsize=12)
plt.ylabel('Hauteur, m', fontsize=12)
plt.title(f'Trajectoire du tir\nV₀ = {v0} m/s, angle = {angle}°, k = {k:.6f}',
fontsize=14)
plt.grid(True, alpha=0.3)
plt.legend()
plt.axis('equal')
plt.show()
def print_results(self, t, x, y):
print("=== RÉSULTATS DE LA SIMULATION ===")
print(f"Portée : {x[-1]:.2f} m")
print(f"Hauteur maximale : {max(y):.2f} m")
print(f"Temps de vol : {t[-1]:.2f} s")
# Exemple : v0=250 m/s, angle=60°, d=0.2 m, m=20 kg
Pour v₀ = 250 m/s, α = 60°, diamètre 20 cm, masse 20 kg, Cd = 0,3, le coefficient k est calculé par k = (Cd ρ A)/(2m), où A est la section frontale. La fonction solve_ivp utilisant la méthode RK45 garantit une précision jusqu'à l'impact (y = 0).
Paramètres et résultats de la simulation
Paramètres d'entrée principaux :
- Vitesse initiale v₀ : 20–250 m/s
- Angle de lancement α : 30–60°
- Masse m : 0,5–20 kg
- Diamètre : 10–20 cm
- Cd : 0,3 (valeur typique)
- k : calculé automatiquement
Résultats pour le cas quadratique :
- Portée de vol : ~10–20 km (selon les paramètres)
- Altitude maximale : 5–15 km
- Temps de vol : 50–100 secondes
- Vitesse finale : proche de la vitesse terminale
La comparaison entre les cas montre une réduction de 30 à 50 % de la portée lorsqu'on prend en compte la résistance de l'air.
Points clés à retenir
- Pas de résistance → trajectoire parabolique ; portée maximale à α = 45°.
- Loi de Stokes valable aux faibles vitesses (<30 m/s), donnant une décroissance exponentielle.
- Loi de Newton standard pour l'artillerie, nécessitant une résolution numérique des équations différentielles.
- Le code Python utilisant scipy.integrate est polyvalent et facilement adaptable aux valeurs réelles de Cd et ρ.
— Editorial Team
Aucun commentaire pour le moment.