Retour à l'accueil

Modélisation de la balistique externe : analytique et Python

L'article analyse les méthodes analytiques et numériques pour résoudre le problème de balistique externe. Les cas sans résistance, avec lois linéaire et quadratique sont considérés. Code complet du simulateur Python utilisant SciPy pour les calculs de trajectoire est fourni.

Balistique externe : d'Euler au simulateur Python
Advertisement 728x90

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

Google AdInline article slot

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

Google AdInline article slot

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)

Google AdInline article slot

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

Advertisement 728x90

Lire ensuite