В данной работе рассмотрим одну из важнейших задач прикладной механики, а именно задачу внешней баллистики(задачу о плоском движении тела, под действием земного тяготения, брошенного под углом к горизонту с некоторой начальной скоростью).

Сформулируем задачу и рассмотрим несколько случаев.

Задача
Задача
Первый случай( нет сопротивления воздуха)
Первый случай( нет сопротивления воздуха)

Построим график траектории полёта для v0=20 м/с и a=30 градусов:

График траектории. 1 случай.
График траектории. 1 случай.

Второй случай:Закон сопротивления Стокса.

Второй случай:Закон Стокса.
Второй случай:Закон Стокса.

Второй случай. Конец решения.
Второй случай. Конец решения.

Построим график траектории полёта тела для начальных данных:

v0=70 м/с, a=55 градусов, k=0,04 кг/с, m=0,5 кг.

Траектория полёта. Второй случай.
Траектория полёта. Второй случай.

Третий случай:Закон сопротивления Ньютона.

Третий случай:Квадратичный закон сопротивления.
Третий случай:Квадратичный закон сопротивления.
Третий случай, решение системы ДУ.
Третий случай, решение системы ДУ.

Примечание: эта система дифференциальных уравнений в третьем случае была решена ещё Леонардом Эйлером в 18 веке, когда не было компьютеров и писали перьями при свечах...

(источник 8).

Напишем код на Python для моделирования полёта снаряда с начальной скоростью v0=250 м/с,

a=60 градусов, массой m=20 кг и диаметром 20 см:

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):
        """
        Расчёт коэффициента сопротивления k

        Параметры:
        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):
        """
        Система дифференциальных уравнений движения

        state = [x, vx, y, vy]
        """
        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):
        """
        Моделирование траектории

        Параметры:
        v0: начальная скорость (м/с)
        angle_deg: угол запуска (градусы)
        x0, y0: начальные координаты
        diameter: диаметр снаряда (м)
        mass: масса снаряда (кг)
        Cd: коэффициент сопротивления
        t_max: максимальное время моделирования (с)
        dt: шаг времени (с)
        """
        # Расчёт коэффициента k
        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]

        # Находим точку падения (когда y становится отрицательным)
        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='Траектория')
        plt.scatter(x[0], y[0], color='red', s=100, zorder=5, label='Старт')
        plt.scatter(x[-1], y[-1], color='green', s=100, zorder=5, label='Падение')

        plt.xlabel('Расстояние, м', fontsize=12)
        plt.ylabel('Высота, м', fontsize=12)
        plt.title(f'Траектория снаряда\n'
                  f'V₀ = {v0} м/с, угол = {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("=== РЕЗУЛЬТАТЫ МОДЕЛИРОВАНИЯ ===")
        print(f"Дальность полёта: {x[-1]:.2f} м")
        print(f"Максимальная высота: {max(y):.2f} м")
        print(f"Время полёта: {t[-1]:.2f} с")
        print(f"Конечная скорость: {np.sqrt((x[-1]-x[-2])**2 + (y[-1]-y[-2])**2)/(t[-1]-t[-2]):.2f} м/с")


# Пример использования
def main():
    # Создаём симулятор
    simulator = BallisticsSimulator()

    # Параметры запуска
    v0 = 250      # начальная скорость, м/с
    angle = 60     # угол запуска, градусы
    diameter = 0.2 # диаметр снаряда, м (20 см)
    mass = 20      # масса снаряда, кг

    # Моделирование
    t, x, y, k = simulator.simulate(
        v0=v0,
        angle_deg=angle,
        diameter=diameter,
        mass=mass,
        Cd=0.3,
        t_max=100,
        dt=0.01
    )

    # Вывод результатов
    simulator.print_results(t, x, y)

    # Построение графика
    simulator.plot_trajectory(t, x, y, k, v0, angle)

if __name__ == "__main__":
    main()

Результат моделирования представлен ниже:

Траектория полёта, третий случай( закон сопротивления Ньютона).
Траектория полёта, третий случай( закон сопротивления Ньютона).

Таким образом, в данной статье начато решение задачи внешней баллистики.

Рассмотрены три различных случая:

1)Без сопротивления воздуха (на уровне школы).

2) С законом сопротивления Стокса ( то есть линейная зависимость от скорости).

3)С законом сопротивления Ньютона (квадратичная зависимость от скорости).

Получены аналитические выражения для траекторий y(x), зависимости дальности полёта

L от начального угла a, найдены формулы для максимальной дальности, угла максимальной дальности, времени полёта и максимальной высоты подъёма.

Таким образом, решена важнейшая задача, возникающая на практике при стрельбе или бросании снарядов.

Продолжение будет далее, в следующих статьях.....

Литература:

  1. Окунев Б. Н. «Решение основной задачи внешней баллистики при квадратичном законе сопротивления воздуха» (1932).

  2. Окунев Б. Н. «Основная задача внешней баллистики и аналитические методы её решения» (1934).

  3. Дмитриевский А. А., Лысенко Л. Н. «Внешняя баллистика» (2005).

  4. Лысенко А. Н. «Внешняя баллистика» (2024).

  5. Шапиро Я. М. «Внешняя баллистика» (1946).

  6. Беляева С. Д. «Внешняя баллистика с примерами и задачами» (2023).

7.https://docviewer.yandex.ru/view/1034483224/?*=CBQ5Rag1zM4T3JJp60YBzgS9YU17InVybCI6Imh0dHBzOi8vbGlicmFyeS5rdXpzdHUucnUvZGwucGhwP249MTQwNzQ0JnR5cGU9bnN0dTpjb21tb24iLCJ0aXRsZSI6ImRsLnBocD9uPTE0MDc0NCIsIm5vaWZyYW1lIjp0cnVlLCJ1aWQiOiIxMDM0NDgzMjI0IiwidHMiOjE3NzQ3ODM0MTI0NjQsInl1IjoiMjg4OTYzODY3MTY5NzAzMzU0MCIsInNlcnBQYXJhbXMiOiJ0bT0xNzc0NzgzNDAyJnRsZD1ydSZsYW5nPXJ1Jm5hbWU9ZGwucGhwP249MTQwNzQ0JnR5cGU9bnN0dTpjb21tb24mdGV4dD0lRDAlQjclRDAlQjAlRDAlQjQlRDAlQjAlRDElODclRDAlQjArJUQwJUIyJUQwJUJEJUQwJUI1JUQxJTg4JUQwJUJEJUQwJUI1JUQwJUI5KyVEMCVCMSVEMCVCMCVEMCVCQiVEMCVCQiVEMCVCOCVEMSU4MSVEMSU4MiVEMCVCOCVEMCVCQSVEMCVCOCslRDAlQkQlRDAlQjMlRDElODIlRDElODMmdXJsPWh0dHBzJTNBLy9saWJyYXJ5Lmt1enN0dS5ydS9kbC5waHAlM0ZuJTNEMTQwNzQ0JTI2dHlwZSUzRG5zdHUlM0Fjb21tb24mbHI9NTYmbWltZT1wZGYmbDEwbj1ydSZzaWduPTljZWQzZTc4M2MxNmIwODI0YTE3YjNmZDVmODU0OWMyJmtleW5vPTAifQ%3D%3D&lang=ru

8.Мандрыка А. П. «Баллистические исследования Леонарда Эйлера» (2017) 

9.

https://en.wikipedia.org/wiki/Projectile_motion#Time_of_flight_with_air_resistance