Аннотация
Год Красной Лошади начинается с кода
Первый день 2026-го. За окном — хрустальная тишина, налитая зимним светом. В комнате — только монитор и пустая командная строка. Пока город медленно просыпается после боя курантов, у нас с вами, инженеров и кодёров, есть идеальный момент: между прошлым годом и рабочими буднями зияет цифровая пустота. Давайте заполним её огнём.
Что, если вместо тысячного «Hello, World!» или очередного скучного графика, наши скрипты устроят настоящее огненное шоу? В духе наступившего года Красной Лошади — яростное, стремительное, неуправляемо-красивое. Если за окном нет праздника — мы создадим свой. Свою вселенную, где искры не гаснут, а фейерверки взрываются по нашему желанию. Прямо здесь. Прямо сейчас. Первого января, когда всё ещё можно.
Новогодняя симуляция — это не просто игрушка. Это идеальный полигон, где красота сталкивается с математикой лоб в лоб. Вы видите волшебство: ракета взмывает, замирает на миг — и взрывается снопом огненных брызг. Но под этой магией — чистая, честная физика. Дифференциальные уравнения диктуют полёт. Стохастика правит хаосом разлёта. Фракталы плетут снежинки. Это шанс доказать, что MATLAB — не сухой инструмент для расчётов, а кисть. Холст. Дирижёрская палочка для симфонии из нулей и единиц.
В этой статье мы не будем ходи��ь вокруг да около. Мы возьмём законы Ньютона, щепотку случайных чисел и горсть пикселей — и соберём из них фейерверк. С нуля. Прямо на ваших глазах. Напишем движок, который дышит. Заставим частицы танцевать. Добавим ветру — словно от взмаха гривы той самой Красной Лошади. И в конце — самое главное — вы получите не просто скрипт. Вы получите власть над праздником. Меняйте гравитацию. Рисуйте новые узоры. Создавайте свои миры.
Год только начался. Давайте встретим его не как потребители, а как творцы. Первый взрыв — уже в следующей строке кода.
Перед тем как писать код, давайте рассмотрим все с физической точки зрения . Наш фейерверк — не магия, а всего лишь три аккуратных этапа, упакованных в физические уравнения.
Фаза 1: Полёт ракеты. Тяжеловесный старт
Представим нашу ракету как материальную точку — классика. Её жизнь в полёте описывается парой простых, но безжалостных сил.
Во-первых, её тянет вниз гравитация, знакомая каждому: . Во-вторых, её тормозит сопротивление воздуха. Для простоты примем, что эта сила пропорциональна скорости — чем быстрее летишь, тем сильнее дует в лицо. Коэффициент
здесь наш регулятор «парусности».
Собираем это в систему обыкновенных дифференциальных уравнений (ОДУ), которую будем решать численно:
dv/dt = -g - k·v
dx/dt = v
Важный момент для кода: это в��кторные уравнения. Сила тяжести работает по вертикальной оси (Y), а сопротивление — против вектора полной скорости . Поэтому в расчётах мы будем раскладывать всё по компонентам:
и
. Ракета летит по параболе, которая быстрее «затухает», чем в идеальном вакууме.
Фаза 2: Взрыв — рождение частиц. Хаос по правилам
Вершина траектории. Тишина. И — бах! Наша материальная точка превращается в ярких искр.
Это самый творческий момент моделирования. Мы берём точку взрыва и создаём в ней новых частиц. Ключ — в раздаче им начальных скоростей. Чтобы получить красивый сферический разлёт, удобно использовать сферические координаты.
Для каждой частицы мы случайным образом выбираем:
Азимутальный угол
— равномерно от
до
.
Зенитный угол
— чтобы разлёт был во все стороны, а не только в плоскости. Проще всего задать его через
, равномерно распределённый от
до
.
Радиальная скорость
— модуль скорости. Его можно взять фиксированным ��ли добавить случайную вариацию, например, от
до
, чтобы искры разлетались «пушисто».
Затем переводим это в декартовы координаты для удобства расчётов:
v_x = V · sin(θ) · cos(φ)
v_y = V · cos(θ)
v_z = V · sin(θ) · sin(φ)
Примечание : (Да, мы сделаем салют объёмным, 3D — так честнее и красивее).
Так из одного детерминированного объекта рождается управляемый хаос — облако частиц, готовое к полёту.
Фаза 3: Жизнь искры. Красота угасания
Дальше каждая искра живёт своей короткой жизнью по тем же физическим законам, но с важными нюансами:
Другое сопротивление (
k_iskra): Искра — лёгкая, почти невесомая. Коэффициент сопротивления воздуха для неё будет значительно больше, чем для плотной ракеты. Именно поэтому искры так быстро теряют скорость и красиво «зависают» в верхней точке своего мини-полёта, прежде чем упасть. Их уравнение почти такое же, нотеперь велико:
Эффект затухания: Физика — это про движение, а магия — про визуальное угасание. Помимо замедления, искра должна терять яркость и (опционально) уменьшаться в размере. Это моделируется простым множителем
, который линейно или экспоненциально убывает от 1 до 0 за время жизни искры
t_life:
яркость(t) = начальная_яркость · life(t)
радиус(t) = начальный_радиус · life(t)
Небольшое примечание : Экспоненциальный спад часто выглядит даже естественнее линейного.
Именно комбинация большого сопротивления (которое быстро гасит скорость) и визуального затухания создаёт тот самый узнаваемый, мягкий, «пушистый» след от фейерверка, а не резкие линии.
Теперь, когда мы ��пределились с физикой и математикой фейерверка , у нас есть чёткий план. В следующей главе мы превратим эти уравнения в работающий код MATLAB, где ,
,
и
станут всего лишь параметрами, с которыми можно играть, создавая своё уникальное шоу.
Практика. Пишем «Движок салюта» в MATLAB
Теперь перейдём от теории к практике. Напишем компактный, но мощный движок для новогоднего салюта. Весь код уместится примерно в 100 строк, но за ними скрывается полноценная физическая симуляция.
Начинаем с объявления основных параметров системы:
% Параметры системы
N = 4; % Количество ракет
M = 300; % Максимум искр на взрыв
g = [0 -9.8 0]; % Вектор гравитации (3D!)
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; % Обновление позиции
Мы используем упрощённую модель сопротивления воздуха: . Почему квадрат скорости? В реальности для сферических тел при числах Рейнольдса > 1000 сопротивление действительно пропорционально квадрату скорости. Константа
объединяет в себе плотность воздуха, коэффициент сопротивления и площадь сечения.
Для искр сопротивление больше (), что физически оправдано: маленькие частицы сильнее тормозятся воздухом.
Теперь переходим к созданию взрыва . Взрыв — это переход от одной материальной точки к облаку частиц:
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)];
Тут работает равномерное распределение по сфере:Если бы мы брали , точки сгруппировались бы у полюсов. Формула
даёт действительно равномерное распределение: элемент площади сферической поверхности
при таком преобразовании становится постоянным.
Теперь работаем над управлением частоты кадров . Ключевым приёмом является — управление частотой кадров:
% Главный цикл
for t = 0:dt:12
cla % Очистка только что отрисованного
% ... вычисления ...
drawnow % Немедленная отрисовка
pause(0.01) % Контроль скорости
end
Оптимизация отрисовки:
claвместоclf— очищает только оси, не пересоздавая окноdrawnowбез параметров — минимальная задержкаpause(0.01)— фиксированный интервал, стабильный FPS
Давайте же выведем ключевые выводы главы:
Физика фейерверков сводится к системе ОДУ с квадратичным трением
Предварительное выделение памяти — must-have для производительности
Равномерный разлёт требует корректного перехода к сферическим координатам
Баланс между точностью (
) и производительностью — искусство
MATLAB позволяет создавать визуально сложные симуляции на базовом синтаксисе

Показываю код в деле . Gif - 1.
Код готов. Запускайте, экспериментируйте, и пусть ваш цифровой 2026-й год начнётся с фейерверка!
P.S. Полный код из этой главы доступен в репозитории GitHub — клонируйте и запускайте сразу. Также там можно посмотреть видео - симуляцию кода .
Мы прошли увлекательный путь — от фундаментальных уравнений физики до живых, дышащих цветом анимаций. Мы доказали, что дифференциальные уравнения и случайные числа — это не сухие формулы в учебниках, а язык, на котором можно писать праздник. Что сопротивление воздуха может стать кистью, а система ОДУ — мольбертом. Что MATLAB, SciPy или любой другой инструмент для вычислений — это не только скальпель для данных, но и волшебная палитра.
Код, который вы только что увидели, — это не финал. Это приглашение.
Он ждёт ваших рук. Поменяйте гравитацию. Заставьте ракеты лететь под углом. Создайте взрыв в форме вашей подписи. Добавьте звук, синхронизируйте с музыкой, заставьте искры оставлять следы в виде цифр «2026». Этот движок — ваш цифровой фейерверочный цех. Экспериментируйте. Создавайте. И обязательно показывайте, что получилось, — в комментариях, в репозиториях, в личных сообщениях. Наука становится магией, только когда ей делятся.
С Новым 2026 Годом!
Дорогие коллеги — инженеры, чьи расчеты строят мосты в будущее; программисты, переводящие идеи на строгий язык логики; исследователи, раздвигающие границы возможного; и все, кому вечер за строкой кода приносит больше радости, чем иной праздник.
Пусть в наступающем году ваши алгоритмы сходятся с первой попытки.
Пусть ваши симуляции будут не только точными, но и ослепительно красивыми.
Пусть каждая решенная задача открывает двери к двум новым, еще более интересным.
Пусть «баг» остается лишь воспоминанием, а «кофе» — единственным внешним стимулятором.
Год Красной Лошади — год энергии, стремительности и огненной силы. Пусть эта сила живет в ваших проектах, в вашем коде и в вашем желании творить. Пусть ваши экраны светятся не только от мониторов, но и от бенгальских огней новых идей.
С Новым Годом!
Пусть он будет написан на удобном языке, отлажен до идеала и исполнен с блеском.
JerryI
Эх, результат бы показали на гифке бы :)
DigitalPsychiatry Автор
Доброго времени суток . Видео - результат есть в репозитории на Github
JerryI
Доброго
Статьи на хабр - это тоже шоу, надо в конце какую-то разрядку/кульминацию. Что вот вот мы тут делали и так и эдак и БАБАХ. Лев и тиг прыгают через кольцо, но точно не на ссылку на гит.
Советую конвертануть с помощью ezgif сервиса, можно даже без сжатия большого. Если уместиться в 2-3 мБ уже нормально
JerryI
Силь ву пле