Аннотация

Год Красной Лошади начинается с кода

Первый день 2026-го. За окном — хрустальная тишина, налитая зимним светом. В комнате — только монитор и пустая командная строка. Пока город медленно просыпается после боя курантов, у нас с вами, инженеров и кодёров, есть идеальный момент: между прошлым годом и рабочими буднями зияет цифровая пустота. Давайте заполним её огнём.

Что, если вместо тысячного «Hello, World!» или очередного скучного графика, наши скрипты устроят настоящее огненное шоу? В духе наступившего года Красной Лошади — яростное, стремительное, неуправляемо-красивое. Если за окном нет праздника — мы создадим свой. Свою вселенную, где искры не гаснут, а фейерверки взрываются по нашему желанию. Прямо здесь. Прямо сейчас. Первого января, когда всё ещё можно.

Новогодняя симуляция — это не просто игрушка. Это идеальный полигон, где красота сталкивается с математикой лоб в лоб. Вы видите волшебство: ракета взмывает, замирает на миг — и взрывается снопом огненных брызг. Но под этой магией — чистая, честная физика. Дифференциальные уравнения диктуют полёт. Стохастика правит хаосом разлёта. Фракталы плетут снежинки. Это шанс доказать, что MATLAB — не сухой инструмент для расчётов, а кисть. Холст. Дирижёрская палочка для симфонии из нулей и единиц.

В этой статье мы не будем ходи��ь вокруг да около. Мы возьмём законы Ньютона, щепотку случайных чисел и горсть пикселей — и соберём из них фейерверк. С нуля. Прямо на ваших глазах. Напишем движок, который дышит. Заставим частицы танцевать. Добавим ветру — словно от взмаха гривы той самой Красной Лошади. И в конце — самое главное — вы получите не просто скрипт. Вы получите власть над праздником. Меняйте гравитацию. Рисуйте новые узоры. Создавайте свои миры.

Год только начался. Давайте встретим его не как потребители, а как творцы. Первый взрыв — уже в следующей строке кода.

Перед тем как писать код, давайте рассмотрим все с физической точки зрения . Наш фейерверк — не магия, а всего лишь три аккуратных этапа, упакованных в физические уравнения.

Фаза 1: Полёт ракеты. Тяжеловесный старт

Представим нашу ракету как материальную точку — классика. Её жизнь в полёте описывается парой простых, но безжалостных сил.

Во-первых, её тянет вниз гравитация, знакомая каждому: g ≈ 9.8 м/с². Во-вторых, её тормозит сопротивление воздуха. Для простоты примем, что эта сила пропорциональна скорости — чем быстрее летишь, тем сильнее дует в лицо. Коэффициент k здесь наш регулятор «парусности».

Собираем это в систему обыкновенных дифференциальных уравнений (ОДУ), которую будем решать численно:

dv/dt = -g - k·v
dx/dt = v

Важный момент для кода: это в��кторные уравнения. Сила тяжести работает по вертикальной оси (Y), а сопротивление — против вектора полной скорости v. Поэтому в расчётах мы будем раскладывать всё по компонентам: v_x и v_y. Ракета летит по параболе, которая быстрее «затухает», чем в идеальном вакууме.

Фаза 2: Взрыв — рождение частиц. Хаос по правилам

Вершина траектории. Тишина. И — бах! Наша материальная точка превращается в N ярких искр.

Это самый творческий момент моделирования. Мы берём точку взрыва и создаём в ней N новых частиц. Ключ — в раздаче им начальных скоростей. Чтобы получить красивый сферический разлёт, удобно использовать сферические координаты.

Для каждой частицы мы случайным образом выбираем:

  • Азимутальный угол φ — равномерно от 0 до 2π.

  • Зенитный угол θ — чтобы разлёт был во все стороны, а не только в плоскости. Проще всего задать его через cos(θ), равномерно распределённый от -1 до 1.

  • Радиальная скорость V — модуль скорости. Его можно взять фиксированным ��ли добавить случайную вариацию, например, от 0.7·V_max до V_max, чтобы искры разлетались «пушисто».

Затем переводим это в декартовы координаты для удобства расчётов:

v_x = V · sin(θ) · cos(φ)
v_y = V · cos(θ)
v_z = V · sin(θ) · sin(φ)

Примечание : (Да, мы сделаем салют объёмным, 3D — так честнее и красивее).

Так из одного детерминированного объекта рождается управляемый хаос — облако частиц, готовое к полёту.

Фаза 3: Жизнь искры. Красота угасания

Дальше каждая искра живёт своей короткой жизнью по тем же физическим законам, но с важными нюансами:

  1. Другое сопротивление (k_iskra): Искра — лёгкая, почти невесомая. Коэффициент сопротивления воздуха для неё будет значительно больше, чем для плотной ракеты. Именно поэтому искры так быстро теряют скорость и красиво «зависают» в верхней точке своего мини-полёта, прежде чем упасть. Их уравнение почти такое же, но k теперь велико:
    dv/dt = -g - k_iskra·v

  2. Эффект затухания: Физика — это про движение, а магия — про визуальное угасание. Помимо замедления, искра должна терять яркость и (опционально) уменьшаться в размере. Это моделируется простым множителем life(t), который линейно или экспоненциально убывает от 1 до 0 за время жизни искры t_life:

яркость(t) = начальная_яркость · life(t)
радиус(t) = начальный_радиус · life(t)

Небольшое примечание : Экспоненциальный спад life(t) = exp(-α·t) часто выглядит даже естественнее линейного.

Именно комбинация большого сопротивления (которое быстро гасит скорость) и визуального затухания создаёт тот самый узнаваемый, мягкий, «пушистый» след от фейерверка, а не резкие линии.

Теперь, когда мы ��пределились с физикой и математикой фейерверка , у нас есть чёткий план. В следующей главе мы превратим эти уравнения в работающий код MATLAB, где gkV_max и α станут всего лишь параметрами, с которыми можно играть, создавая своё уникальное шоу.

Практика. Пишем «Движок салюта» в MATLAB

Теперь перейдём от теории к практике. Напишем компактный, но мощный движок для новогоднего салюта. Весь код уместится примерно в 100 строк, но за ними скрывается полноценная физическая симуляция.

Начинаем с объявления основных параметров системы:

% Параметры системы
N = 4;              % Количество ракет
M = 300;            % Максимум искр на взрыв
g = [0 -9.8 0];     % Вектор гравитации (3D!)
dt = 0.025;         % Шаг интегрирования

Почему именно эти значения?

  • N = 4 — достаточно для зрелищности, но не перегружает вычисления

  • dt = 0.025 обеспечивает плавную анимацию (~40 FPS) при сохранении стабильности численного интегрирования

  • 3D-вектор гравитации позволяет легко расширять модель (добавлять ветер, наклонные траектории)

Следующий критически важный шаг — предварительное выделение памяти:

% Инициализация искр
s = struct('p',zeros(M*N,3),'v',zeros(M*N,3),...
           'c',zeros(M*N,3),'life',zeros(M*N,1),...
           'act',false(M*N,1));

Зачем это нужно? MATLAB работает медленнее всего, когда динамически изменяет размеры массивов в циклах. Выделив память один раз в начале, мы избегаем тысяч операций перераспределения памяти. Это даёт прирост производительности до 10 раз!

Сердце симуляции — метод Эйлера для численного интегрирования:

% Для ракеты
k = 0.08;
d = k * norm(v) * v;          % Сила сопротивления ∝ v²
v = v + (g - d) * dt;         % Обновление скорости
p = p + v * dt;               % Обновление позиции

Мы используем упрощённую модель сопротивления воздуха: F_drag = -k·v·|v|. Почему квадрат скорости? В реальности для сферических тел при числах Рейнольдса > 1000 сопротивление действительно пропорционально квадрату скорости. Константа k объединяет в себе плотность воздуха, коэффициент сопротивления и площадь сечения.

Для искр сопротивление больше (k = 0.3), что физически оправдано: маленькие частицы сильнее тормозятся воздухом.

Теперь переходим к созданию взрыва . Взрыв — это переход от одной материальной точки к облаку частиц:

function ex(center, color)
    % Сферические координаты → декартовы
    phi = acos(2*rand-1);      % Равномерно по cos(φ)
    th = 2*pi*rand;           % Равномерно по азимуту
    speed = 8 + 6*rand;       % Случайная скорость
    
    v = speed * [sin(phi)*cos(th) 
                 cos(phi) 
                 sin(phi)*sin(th)];

Тут работает равномерное распределение по сфере:Если бы мы брали φ = π*rand, точки сгруппировались бы у полюсов. Формула φ = acos(2*rand-1) даёт действительно равномерное распределение: элемент площади сферической поверхности dS = sin(φ)dφdθ при таком преобразовании становится постоянным.

Теперь работаем над управлением частоты кадров . Ключевым приёмом является — управление частотой кадров:

% Главный цикл
for t = 0:dt:12
    cla  % Очистка только что отрисованного
    
    % ... вычисления ...
    
    drawnow          % Немедленная отрисовка
    pause(0.01)      % Контроль скорости
end

Оптимизация отрисовки:

  • cla вместо clf — очищает только оси, не пересоздавая окно

  • drawnow без параметров — минимальная задержка

  • pause(0.01) — фиксированный интервал, стабильный FPS

Давайте же выведем ключевые выводы главы:

  1. Физика фейерверков сводится к системе ОДУ с квадратичным трением

  2. Предварительное выделение памяти — must-have для производительности

  3. Равномерный разлёт требует корректного перехода к сферическим координатам

  4. Баланс между точностью (dt) и производительностью — искусство

  5. MATLAB позволяет создавать визуально сложные симуляции на базовом синтаксисе

Gif-1/
Gif-1/

Показываю код в деле . Gif - 1.

Код готов. Запускайте, экспериментируйте, и пусть ваш цифровой 2026-й год начнётся с фейерверка!

P.S. Полный код из этой главы доступен в репозитории GitHub — клонируйте и запускайте сразу. Также там можно посмотреть видео - симуляцию кода .

Мы прошли увлекательный путь — от фундаментальных уравнений физики до живых, дышащих цветом анимаций. Мы доказали, что дифференциальные уравнения и случайные числа — это не сухие формулы в учебниках, а язык, на котором можно писать праздник. Что сопротивление воздуха -k·v может стать кистью, а система ОДУ — мольбертом. Что MATLAB, SciPy или любой другой инструмент для вычислений — это не только скальпель для данных, но и волшебная палитра.

Код, который вы только что увидели, — это не финал. Это приглашение.

Он ждёт ваших рук. Поменяйте гравитацию. Заставьте ракеты лететь под углом. Создайте взрыв в форме вашей подписи. Добавьте звук, синхронизируйте с музыкой, заставьте искры оставлять следы в виде цифр «2026». Этот движок — ваш цифровой фейерверочный цех. Экспериментируйте. Создавайте. И обязательно показывайте, что получилось, — в комментариях, в репозиториях, в личных сообщениях. Наука становится магией, только когда ей делятся.

С Новым 2026 Годом!

Дорогие коллеги — инженеры, чьи расчеты строят мосты в будущее; программисты, переводящие идеи на строгий язык логики; исследователи, раздвигающие границы возможного; и все, кому вечер за строкой кода приносит больше радости, чем иной праздник.

Пусть в наступающем году ваши алгоритмы сходятся с первой попытки.
Пусть ваши симуляции будут не только точными, но и ослепительно красивыми.
Пусть каждая решенная задача открывает двери к двум новым, еще более интересным.
Пусть «баг» остается лишь воспоминанием, а «кофе» — единственным внешним стимулятором.

Год Красной Лошади — год энергии, стремительности и огненной силы. Пусть эта сила живет в ваших проектах, в вашем коде и в вашем желании творить. Пусть ваши экраны светятся не только от мониторов, но и от бенгальских огней новых идей.

С Новым Годом!
Пусть он будет написан на удобном языке, отлажен до идеала и исполнен с блеском.

Комментарии (4)


  1. JerryI
    01.01.2026 17:47

    Эх, результат бы показали на гифке бы :)


    1. DigitalPsychiatry Автор
      01.01.2026 17:47

      Доброго времени суток . Видео - результат есть в репозитории на Github


      1. JerryI
        01.01.2026 17:47

        Доброго
        Статьи на хабр - это тоже шоу, надо в конце какую-то разрядку/кульминацию. Что вот вот мы тут делали и так и эдак и БАБАХ. Лев и тиг прыгают через кольцо, но точно не на ссылку на гит.

        Советую конвертануть с помощью ezgif сервиса, можно даже без сжатия большого. Если уместиться в 2-3 мБ уже нормально


        1. JerryI
          01.01.2026 17:47

          Силь ву пле