Modelado Analítico y Numérico de la Balística Exterior: Tres Casos Clave
El problema de la balística exterior describe el movimiento plano de un cuerpo bajo la gravedad, lanzado con una velocidad inicial a un ángulo respecto a la horizontal. Se consideran tres casos: sin resistencia del aire, resistencia lineal según la ley de Stokes y resistencia cuadrática según la ley de Newton. Las soluciones analíticas se complementan con métodos numéricos para simulaciones realistas.
En el primer caso—sin resistencia—la trayectoria es una parábola. Para v₀ = 20 m/s y α = 30°, el alcance y la altura máxima se calculan mediante fórmulas sencillas:
x(t) = v₀ cos(α) t
y(t) = v₀ sin(α) t - (g t²)/2
Resistencia Lineal: Ley de Stokes
Con resistencia lineal, la fuerza es proporcional a la velocidad: F = -k v. Las ecuaciones diferenciales son:
m dv_x/dt = -k v_x
m dv_y/dt = -m g - k v_y
La solución da dependencias exponenciales en la velocidad:
v_x(t) = v₀ cos(α) e^(-kt/m)
v_y(t) = (v₀ sin(α) + (m g)/k) e^(-kt/m) - (m g)/k
Integrando estas expresiones se obtiene y(x). Para v₀ = 70 m/s, α = 55°, k = 0.04 kg/s y m = 0.5 kg, la trayectoria se vuelve asimétrica y su alcance disminuye notablemente respecto al caso ideal.
Resistencia Cuadrática: Ley de Newton
A altas velocidades, predomina la resistencia cuadrática: F = -k v². El sistema de EDOs es:
dv_x/dt = -k v v_x
dv_y/dt = -g - k v v_y
donde v = √(v_x² + v_y²). Leonhard Euler resolvió este sistema de forma analítica en el siglo XVIII. Hoy, el enfoque más común utiliza integración numérica mediante el método de Runge-Kutta de orden 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='Trayectoria')
plt.scatter(x[0], y[0], color='red', s=100, zorder=5, label='Lanzamiento')
plt.scatter(x[-1], y[-1], color='green', s=100, zorder=5, label='Impacto')
plt.xlabel('Distancia, m', fontsize=12)
plt.ylabel('Altura, m', fontsize=12)
plt.title(f'Trayectoria del disparo\nV₀ = {v0} m/s, ángulo = {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("=== RESULTADOS DE LA SIMULACIÓN ===")
print(f"Alcance: {x[-1]:.2f} m")
print(f"Altura máxima: {max(y):.2f} m")
print(f"Tiempo de vuelo: {t[-1]:.2f} s")
# Ejemplo: v0=250 m/s, ángulo=60°, d=0.2 m, m=20 kg
Para v₀ = 250 m/s, α = 60°, diámetro de 20 cm, masa de 20 kg y Cd = 0.3, el coeficiente k se calcula como k = (Cd ρ A)/(2m), donde A es el área transversal. La función solve_ivp con el método RK45 garantiza precisión hasta el impacto (y = 0).
Parámetros y Resultados de la Simulación
Parámetros clave de entrada:
- Velocidad inicial v₀: 20–250 m/s
- Ángulo de lanzamiento α: 30–60°
- Masa m: 0.5–20 kg
- Diámetro: 10–20 cm
- Cd: 0.3 (valor típico)
- k: calculado automáticamente
Resultados para el caso cuadrático:
- Alcance de vuelo: ~10–20 km (depende de los parámetros)
- Altitud máxima: 5–15 km
- Tiempo de vuelo: 50–100 segundos
- Velocidad final: cercana a la velocidad terminal
Comparar los casos muestra una reducción del 30–50% en el alcance cuando se considera la resistencia del aire.
Conclusiones Clave
- Sin resistencia → trayectoria parabólica; alcance máximo a α = 45°.
- La ley de Stokes aplica a bajas velocidades (<30 m/s), con decaimiento exponencial.
- La ley de Newton es estándar en artillería, requiriendo resolución numérica de EDOs.
- El código en Python con scipy.integrate es versátil y fácilmente adaptable a valores reales de Cd y ρ.
— Editorial Team
Aún no hay comentarios.