Уточнение: строго говоря, это классическое нелинейное скалярное поле — модификация уравнения Клейна-Гордона с φ⁴ потенциалом. “Квантовое” в названии — по аналогии с явлениями которые воспроизводятся. Следующая статья будет про тетраэдральную сетку.
Одним вечером я решил проверить: что если взять решётку из 10 000 узлов, задать одно правило передачи энергии между соседями — и просто запустить? Никакой теоретической физики из учебника, никакой подготовки. Посмотреть что вырастет само.
Спойлер: за один день появились волновое уравнение, интерференция, фазовый переход, рождение и аннигиляция частиц, и стрела времени. Всё из одного уравнения.
Старт: убираем случайность
У меня уже был проект — симуляция квантового поля на тетраэдрах, где узлы случайно осциллировали (Math.random()). Красиво, но мертво. Шум без смысла, без структуры.
Я сделал шаг: заменил случайность на детерминированный закон. Каждый тик поле в каждом узле обновляется по правилу:
// GridField.java private void update() { double[][] newPhi = new double[HEIGHT][WIDTH]; for (int y = 0; y < HEIGHT; y++) { for (int x = 0; x < WIDTH; x++) { // Дискретный Лапласиан (4 соседа, торическая топология) int left = (x - 1 + WIDTH) % WIDTH; int right = (x + 1) % WIDTH; int up = (y - 1 + HEIGHT) % HEIGHT; int down = (y + 1) % HEIGHT; double laplacian = phi[y][left] + phi[y][right] + phi[up][x] + phi[down][x] - 4.0 * phi[y][x]; // φ⁴ потенциал: тянет поле к вакуумам ±V double force = -LAMBDA * (phi[y][x] * phi[y][x] - V * V) * phi[y][x]; velocity[y][x] = velocity[y][x] * DAMPING + FLOW_RATE * laplacian + force; newPhi[y][x] = phi[y][x] + velocity[y][x]; } } phi = newPhi; tick++; }
Константы которые управляют всем поведением:
static final int WIDTH = 100; static final int HEIGHT = 100; static final double FLOW_RATE = 0.20; // скорость волны, ОБЯЗАТЕЛЬНО < 0.25 static final double DAMPING = 0.998; // затухание (1.0 = без потерь) static final double V = 300.0; // положение вакуумов ±V static final double LAMBDA = 0.000002; // сила нелинейности φ⁴
Важно: FLOW_RATE < 0.25 — это условие устойчивости Куранта для дискретного волнового уравнения. Выше — поле взрывается в NaN за несколько тиков.
Фаза 1: одно правило → волна и интерференция
Запустил с LAMBDA = 0 (чистое волновое уравнение). Одна точка возбуждения в центре:
// GridMain.java GridField field = new GridField(); field.excite(50, 50, 600.0); field.start(50); // 50ms на тик = ~20 тиков/сек
По экрану пошла идеальная круговая волна. Дошла до края — появилась с другой стороны, потому что решётка замкнута как тор (периодические граничные условия).
Волна вернулась и встретила себя. На экране появились концентрические интерференционные кольца — точно как в двухщелевом опыте Юнга. Только я этого не программировал. Это вышло из Лапласиана.
Два источника:
field.excite(35, 50, 600.0); field.excite(65, 50, 600.0);
Два кольца пересеклись — паттерн интерференции с узлами и пучностями. Принцип Гюйгенса — каждый узел сам становится источником — реализовался автоматически.
Фаза 2: нелинейность → частицы
Чистое волновое уравнение умирает: через тысячу тиков поле превращается в равномерный туман. Тепловая смерть. Второе начало термодинамики не было заложено — оно просто случилось.
Включаю LAMBDA = 0.000002.
Потенциал φ⁴ — это V(arphi) = \lambda(arphi^2 - V^2)^2 — двойная яма. Поле теперь хочет быть либо в +V, либо в −V. Как магнит который намагничен в одну из двух сторон.
После одного клика мышью:
Расходится волна — как раньше
Поле начинает выбирать: здесь домен +V, там домен −V
На границах доменов возникает устойчивая структура — не размывается
Эти границы движутся, сталкиваются, аннигилируют
Детектор "частиц":
// GridField.java public List<int[]> detectParticles() { List<int[]> boundaries = new ArrayList<>(); for (int y = 0; y < HEIGHT; y++) { for (int x = 0; x < WIDTH; x++) { int right = (x + 1) % WIDTH; int down = (y + 1) % HEIGHT; // Граница домена = соседи имеют разные знаки if (phi[y][x] * phi[y][right] < 0 || phi[y][x] * phi[down][x] < 0) { boundaries.add(new int[]{x, y}); } } } return boundaries; }
Счётчик показал: 7 → 222 → 1397 → 9821 граничных узлов. Детектор считает пиксели на границах доменов, а не сами объекты. Важно другое: кинки и антикинки рождаются и аннигилируют строго парами — суммарный топологический заряд Q = N₊ − N₋ сохраняется. Это не было заложено явно — вышло из топологии поля.
Что я увидел на экране
Tick 58 — одна точка возбуждения, φ⁴ включён. На синем фоне (вакуум −V) появился идеальный золотой круг (домен +V) с чёткой чёрной границей. Как мыльный пузырь. Как другое пространство внутри.

В космологии это называется фазовым переходом при инфляции — пузырь новой фазы вакуума внутри старого. Это есть в учебниках по физике ранней Вселенной. Я не читал про это когда писал код. Оно просто получилось.
Tick 821 — 5297 частиц. Крестообразная структура из доменов — результат возвратных волн с тора, интерферирующих с доменными стенками.

Tick 18 245 — 9821 частица. Максимально хаотичный вакуум. Это квантовый вакуум — не пустота, а кипящее море виртуальных пар которые рождаются и тут же аннигилируют.

Физика которая вышла сама — без намерения
Явление |
Где видно |
Было запрограммировано? |
|---|---|---|
Волновое уравнение |
Концентрические кольца |
Нет |
Принцип Гюйгенса |
Каждый узел = источник |
Нет |
Интерференция |
Полосы при двух источниках |
Нет |
Торическая топология |
Волна возвращается |
Да (граничные условия) |
Фазовый переход |
Домены ±V |
Нет |
Рождение пар |
Счётчик чётный |
Нет |
Аннигиляция |
Счётчик падает |
Нет |
Стрела времени |
Порядок → хаос |
Нет |
Тепловая смерть |
Туман через 1000 тиков |
Нет |
9 из 10 явлений не программировались. Они вышли из одного уравнения в 15 строк.
Управление
// GridVisualization.java // ЛКМ / drag → +2000 к φ в узле // ПКМ / drag → −1000 к φ в узле @Override public void mousePressed(MouseEvent e) { int x = e.getX() / CELL_SIZE; int y = e.getY() / CELL_SIZE; double amount = SwingUtilities.isRightMouseButton(e) ? -1000.0 : 2000.0; field.excite(x, y, amount); }
Кликаешь левой — создаёшь возбуждение. Правой — убираешь. Можно "потолкать" домен и посмотреть как он движется.
Что дальше
Следующий шаг — атом. Атом это стоячая волна которая замкнулась сама на себе. Для этого нужно второе поле χ, связанное с основным φ через бипотенциал:
V(arphi, \chi) = \lambda(arphi^2 - V^2)^2 - g \cdot arphi^2 \cdot \chi^2
Лёгкое поле χ будет резонировать вокруг тяжёлого φ-сгустка. Выживут только орбиты где умещается целое число длин волн χ. Квантование энергий выйдет само — из геометрии, не из аксиом.
Код
Java 17+, никаких зависимостей кроме стандартного Swing. Gradle сборка. Репозиторий: github.com/malexple/quant
git clone https://github.com/malexple/quant ./gradlew run
Запускаешь. Кликаешь в центр. Смотришь как рождаются и умирают частицы. Занимает минуту.
После этой минуты квантовое поле перестаёт быть абстракцией из учебника.
Написано за один день итеративного эксперимента. Следующая статья — два связанных поля и попытка получить атом.
Комментарии (21)

kbtsiberkin
09.04.2026 02:56Это всё красиво, но в коде де-факто решается конечными разностями уравнение реакции-диффузии с кубическим потенциалом. Иногда называется оно уравнением Фитц-Хью - Нагумо. Есть более простой вариант - уравнение Колмогорова-Фишера.
А описанные эффекты формирования паттернов и наложения волн и не надо никуда закладывать. Интерференция, например, это просто суммирование двух гармонических волн с разными фазами.

FilipLinx Автор
09.04.2026 02:56Спасибо — это самый точный комментарий под статьёй. Вы правы что терминология размыта.
Уточню: у меня есть явное поле скоростей velocity[][], то есть уравнение второго порядка по времени — ∂²φ/∂t² = c²·Δφ − λ(φ²−V²)φ. Это затухающее уравнение Клейна-Гордона с φ⁴ потенциалом, не реакция-диффузия. FitzHugh-Nagumo и Колмогоров-Фишер — первый порядок, там нет волн, только диффузия. Хотя в пределе сильного затухания мои решения, наверное, к Allen-Cahn и сходятся.
Про интерференцию — согласен полностью, это суперпозиция и она неизбежна из линейности. Стоило написать точнее.

FilipLinx Автор
09.04.2026 02:56Но чётность числа доменных стенок и сохранение топологического заряда — это уже не суперпозиция. Это топология. Вот это меня и удивило по-настоящему.

kbtsiberkin
09.04.2026 02:56Второй производной по времени у вас не вижу для гиперболического уравнения, в ней должны быть два временных слоя при расчете newPhi.
Но посыл и моделирование всё равно интересные. Ведь примерно таким и пытаемся описать реальность. Шрёдингер с вашим потенциалом при V=0, например, становится уравнением, известным как НуШ и имеющим солитонные решения.

FilipLinx Автор
09.04.2026 02:56Спасибо за уточнение! У меня реализован leapfrog через явное поле velocity[][] — это эквивалент двух временных слоёв, просто в форме Верле а не через phi_prev. Согласен что в тексте статьи это стоило показать явно.
Про НуШ — это неожиданно красиво. То есть мои численные солитоны при V→0 должны сходиться к аналитическим решениям НуШ? Если так — это готовый тест на точность симулятора. Буду проверять.

kbtsiberkin
09.04.2026 02:56А, вот leap‑frog не разглядел. Не большой спец в этих методах, всю жизнь только параболические уравнения моделировал.
К нелинейному Шрёдингеру не сойдётся, так как это комплексное уравнение с первой производной по времени и чуть другими свойствами.
У вас, выходит, действительно некоторая модификация Клейна‑Гордона на самом деле. Стандарт в квантовой теории поля для скалярных частиц, вплоть до бозонов Хиггса, смотря какой потенциал заложен — у вас как раз очень похоже на хиггсовский.
Можно для тестирования поперебирать другие варианты потенциалов, для которых прописана аналитика. Или забабахать sin‑Гордона (уравнение «синус‑Гордона»), в котором известно много красивых нелинейных волн.

misha_erementchouk
09.04.2026 02:56Это классическое (или, если угодно, одночастичное) поле. Квантовое поле так просто не отмоделировать.
Любопытно, что у Вас всякие неустойчивости не полезли: в том виде, в каком временная зависимость в коде формируется, навскидку тяжело сказать, как управлять параметрами моделирования в нелинейном случае. Впрочем, если у Вас, в самом деле, сходится к кипящему вакууму, то, возможно это оно и есть. В диссипативной системе все временные зависимости должны умирать.
Паттерн, который возникает в конце, скорее всего артефакт дискретизации. На квадратной решетке (двудольный граф) вполне можно представить стационарное решение в виде шахматной доски. Если плоскость триангулировать, то такие решения должны исчезнуть из-за нечетных циклов на решетке. А вот почему крупномасштабные стационарные структуры не возникли - непонятно. Может в моделируемую плоскость не влезают.
Но, конечно, моделирование забавное. На нелинейное поле можно смотреть часами.

FilipLinx Автор
09.04.2026 02:56Про “квантовое” в названии — поправлю. Это классическое нелинейное скалярное поле, второго квантования нет. Название выбрано по аналогии с явлениями которые воспроизводятся — рождение пар, аннигиляция, вакуумные флуктуации — но терминологически это неточно. Добавлю уточнение.
Про устойчивость — повезло с параметрами: FLOW_RATE = 0.20 при пороге Куранта 0.25, DAMPING = 0.998. Диссипация маленькая но она есть, и именно она, как вы и говорите, убивает все долгоживущие моды. Кипящий вакуум в конце — это равновесное состояние диссипативной системы, да.
Про артефакт квадратной решётки — это объясняет крест на tick 821 лучше чем всё что я думал раньше. Двудольный граф допускает шахматное стационарное решение, и симулятор в него и скатывается. На триангулированной поверхности нечётные циклы это математически запрещают — и я как раз планирую следующим шагом перейти на тетраэдральную сетку. Теперь есть строгое обоснование зачем.
Про крупномасштабные структуры — интересный открытый вопрос. Подозреваю что 100×100 не хватает: характерный размер домена сравним с размером решётки и структуры просто не умещаются. Попробую на 500×500.

Fierbullet
09.04.2026 02:56вы вообще все кто? и как вы это понимаете? недавно читал книгу "вы конечно шутите мистер фэймон" и только поэтому для меня тут существует знакомые слова, какие-то вещи типа интереференции я понимаю интуитивно, и некоторых других физических явлений, но всё вместе в одну картину у меня не складывается из-за плохой памяти, и такие опыты проводить не могу (((

Refridgerator
09.04.2026 02:56В недалёком прошлом - обычные советские школьники. Которые от скуки читали журнал "Квант", потому что смартфоны с рилсами ещё не изобрели.

Miccc
09.04.2026 02:56Счётчик показал: 7 → 222 → 1397 → 9821 частиц. Всегда чётное число
Обоснованность этого вывода, который используется для утверждения о том, что было подтверждено рождение пар, вызывает у меня сомнения: я не разбираюсь в квантовой физике, но неужели в учебниках по ней переопределили понятие четных чисел, что бы включить в него 7, 1397, 9821? Я бы ещё понял, если бы нечетными были все числа, и посчитал, что автор не упомянул о необходимости вычеть 1, но в таком случае число 222 сбивает с толку

FilipLinx Автор
09.04.2026 02:56Справедливое замечание — спасибо. Вы правы: 7, 1397, 9821 — нечётные числа, и я допустил неточность в тексте.
Имел в виду другое: детектор считает граничные узлы, а не топологические объекты. Чётность сохраняется у числа доменных стенок как целых объектов — они рождаются и аннигилируют парами. Число узлов на их границах при этом произвольное и чётным не обязано.
Исправлю формулировку в статье.

maksa
09.04.2026 02:56Справедливое замечание — спасибо. Вы правы: 7, 1397, 9821 — нечётные числа, и я допустил неточность в тексте.
Меня не отпускает дежа-вю: в точности в таком стиле мне отвечает ЧатГПТ, когда я его поправляю. Извините, если это не так, но далеко не в одном вашем ответе в комментариях возникает такое чувство.

FilipLinx Автор
09.04.2026 02:56Добрый день. А я и не скрываю что ипользую нейросети. Если вы посмотрите мой профиль то увидите что я обычный программист. А так как статья больше по физике (а я обыно не оперирую физическими терминами) нейросети помогают мне точнее формулировать мысли когда я выхожу за пределы своей области. Но ответ мой хоть и отредактирован немного нейросетью. У меня например есть эксперимент по генерации молекул по заданным свойствам. Программу я написал за пару вечеров. Я искал молекулу которая будет собирать энергию от солнца но при этом будет краской. Результат не такой как я ожидал но программа смогла найти те молекулы которые уже используются в производсве солнечных батарей. И новых там примерно ~150 молекул подпадающие под заданные критерии из 2,5 молекул. Напишу статью об этом когда проверю на практике. Код полностью публиковать не буду так как там потенциальные патенты. И это уже химия. А в квантовый мир хочется заглянуть чтобы лучше понимать химию. Всегда казалочь в школе нужно заучивать соединения, и свойства, а не понять один раз и знать как это работает. Я каждый день для себя что то открываю. И квантовый мир стал интересен благодаря ИИ так как в школе на мой взгляд дают ошибочное понимание которе все усложняет, а в институте говорят что это сложно и лучше за это не браться. Собранная мной статистика говорит о том что у меня в среднем за месяц рождается 10 проектов. Я каждый день для себя что то новое открываю, проверяю и пишу код. Это очень захватывает. И про это я напишу отдельную статью скорее будет по психологии. Там я хочу затронуть тему идей, рождения новых идей и как поток мыслей приводит к новым идеям. Про людей которых в психологии называют мультипотенциалами или 'Сканерами' по Барбаре Шер. Я это к чему что мне приходится достаточно глубоко погружаться в тему. Я оперирую абстракициями, но вот сказать на языке людей этой области бывает сложно. Простите если я кого то обидел или не так ответил. И статья не пишется за 5 минут. Хоть в статье и написано что проверил за пару часов, но тема крутилась и были попытки написать программу несколько раз в течении полу года. Но да когда уже были написанны базовые классы красиво вывести получилось буквально за вечер.
И я не пользуюсь чатом GPT просто по духу он мне не подходит и для задач исследования и программирования. Все приходится препроверять по несколько раз. Обчно это Deepseek или Cloude Sonet
Refridgerator
Мне кажется вы всё-таки лукавите. "Случайно" изобретаете волновое уравнение, хотя в константах явно указана FLOW_RATE < 0.25 и вообще знаете что такое "Лаплассиан".
Следующий шаг - это неотражающие граничные условия реализовать. Вот где самое интересное, особенно на гексагональной сетке.
FilipLinx Автор
Справедливое замечание. Лапласиан я знал — это стандартный оператор. Но я не знал что из него выйдет интерференция без дополнительных условий, фазовый переход без термодинамики, и чётность счётчика частиц без закона сохранения. Именно это я имел в виду под ‘вышло само’ — не незнание инструмента, а неожиданность результата.
da-nie
Так математика не привносит новой информации, она преобразует существующую в другую форму: мусор на входе - мусор на выходе. В скорости и времени уже заложено расстояние в неявном виде. Перемножив, вы его и получите. Но вот получить оттуда, например, объём машины, которая ехала невозможно. Его там не заложено.
Поэтому вы удивляетесь совершенно зря. Вся математическая модель, заложенная вами, уже включала все эти эффекты с момента написания. Просто вы их не видели в ней.