Уточнение: строго говоря, это классическое нелинейное скалярное поле — модификация уравнения Клейна-Гордона с φ⁴ потенциалом. “Квантовое” в названии — по аналогии с явлениями которые воспроизводятся. Следующая статья будет про тетраэдральную сетку.

Одним вечером я решил проверить: что если взять решётку из 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. Как магнит который намагничен в одну из двух сторон.

После одного клика мышью:

  1. Расходится волна — как раньше

  2. Поле начинает выбирать: здесь домен +V, там домен −V

  3. На границах доменов возникает устойчивая структура — не размывается

  4. Эти границы движутся, сталкиваются, аннигилируют

Детектор "частиц":

// 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)


  1. Refridgerator
    09.04.2026 02:56

    Мне кажется вы всё-таки лукавите. "Случайно" изобретаете волновое уравнение, хотя в константах явно указана FLOW_RATE < 0.25 и вообще знаете что такое "Лаплассиан".

    Следующий шаг - это неотражающие граничные условия реализовать. Вот где самое интересное, особенно на гексагональной сетке.


    1. FilipLinx Автор
      09.04.2026 02:56

      Справедливое замечание. Лапласиан я знал — это стандартный оператор. Но я не знал что из него выйдет интерференция без дополнительных условий, фазовый переход без термодинамики, и чётность счётчика частиц без закона сохранения. Именно это я имел в виду под ‘вышло само’ — не незнание инструмента, а неожиданность результата.


      1. da-nie
        09.04.2026 02:56

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

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


  1. kbtsiberkin
    09.04.2026 02:56

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

    А описанные эффекты формирования паттернов и наложения волн и не надо никуда закладывать. Интерференция, например, это просто суммирование двух гармонических волн с разными фазами.


    1. FilipLinx Автор
      09.04.2026 02:56

      Спасибо — это самый точный комментарий под статьёй. Вы правы что терминология размыта.

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

      Про интерференцию — согласен полностью, это суперпозиция и она неизбежна из линейности. Стоило написать точнее.


      1. FilipLinx Автор
        09.04.2026 02:56

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


      1. kbtsiberkin
        09.04.2026 02:56

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

        Но посыл и моделирование всё равно интересные. Ведь примерно таким и пытаемся описать реальность. Шрёдингер с вашим потенциалом при V=0, например, становится уравнением, известным как НуШ и имеющим солитонные решения.


        1. FilipLinx Автор
          09.04.2026 02:56

          Спасибо за уточнение! У меня реализован leapfrog через явное поле velocity[][] — это эквивалент двух временных слоёв, просто в форме Верле а не через phi_prev. Согласен что в тексте статьи это стоило показать явно.

          Про НуШ — это неожиданно красиво. То есть мои численные солитоны при V→0 должны сходиться к аналитическим решениям НуШ? Если так — это готовый тест на точность симулятора. Буду проверять.


          1. kbtsiberkin
            09.04.2026 02:56

            А, вот leap‑frog не разглядел. Не большой спец в этих методах, всю жизнь только параболические уравнения моделировал.

            К нелинейному Шрёдингеру не сойдётся, так как это комплексное уравнение с первой производной по времени и чуть другими свойствами.

            У вас, выходит, действительно некоторая модификация Клейна‑Гордона на самом деле. Стандарт в квантовой теории поля для скалярных частиц, вплоть до бозонов Хиггса, смотря какой потенциал заложен — у вас как раз очень похоже на хиггсовский.

            Можно для тестирования поперебирать другие варианты потенциалов, для которых прописана аналитика. Или забабахать sin‑Гордона (уравнение «синус‑Гордона»), в котором известно много красивых нелинейных волн.


  1. misha_erementchouk
    09.04.2026 02:56

    Это классическое (или, если угодно, одночастичное) поле. Квантовое поле так просто не отмоделировать.

    Любопытно, что у Вас всякие неустойчивости не полезли: в том виде, в каком временная зависимость в коде формируется, навскидку тяжело сказать, как управлять параметрами моделирования в нелинейном случае. Впрочем, если у Вас, в самом деле, сходится к кипящему вакууму, то, возможно это оно и есть. В диссипативной системе все временные зависимости должны умирать.

    Паттерн, который возникает в конце, скорее всего артефакт дискретизации. На квадратной решетке (двудольный граф) вполне можно представить стационарное решение в виде шахматной доски. Если плоскость триангулировать, то такие решения должны исчезнуть из-за нечетных циклов на решетке. А вот почему крупномасштабные стационарные структуры не возникли - непонятно. Может в моделируемую плоскость не влезают.

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


    1. FilipLinx Автор
      09.04.2026 02:56

      Про “квантовое” в названии — поправлю. Это классическое нелинейное скалярное поле, второго квантования нет. Название выбрано по аналогии с явлениями которые воспроизводятся — рождение пар, аннигиляция, вакуумные флуктуации — но терминологически это неточно. Добавлю уточнение.

      Про устойчивость — повезло с параметрами: FLOW_RATE = 0.20 при пороге Куранта 0.25, DAMPING = 0.998. Диссипация маленькая но она есть, и именно она, как вы и говорите, убивает все долгоживущие моды. Кипящий вакуум в конце — это равновесное состояние диссипативной системы, да.

      Про артефакт квадратной решётки — это объясняет крест на tick 821 лучше чем всё что я думал раньше. Двудольный граф допускает шахматное стационарное решение, и симулятор в него и скатывается. На триангулированной поверхности нечётные циклы это математически запрещают — и я как раз планирую следующим шагом перейти на тетраэдральную сетку. Теперь есть строгое обоснование зачем.

      Про крупномасштабные структуры — интересный открытый вопрос. Подозреваю что 100×100 не хватает: характерный размер домена сравним с размером решётки и структуры просто не умещаются. Попробую на 500×500.


  1. directorJ
    09.04.2026 02:56

    очень занимательная работа, на досуге ознакомлюсь, спасибо!


  1. Fierbullet
    09.04.2026 02:56

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


    1. Refridgerator
      09.04.2026 02:56

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


  1. Miccc
    09.04.2026 02:56

    Счётчик показал: 7 → 222 → 1397 → 9821 частиц. Всегда чётное число

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


    1. FilipLinx Автор
      09.04.2026 02:56

      Справедливое замечание — спасибо. Вы правы: 7, 1397, 9821 — нечётные числа, и я допустил неточность в тексте.

      Имел в виду другое: детектор считает граничные узлы, а не топологические объекты. Чётность сохраняется у числа доменных стенок как целых объектов — они рождаются и аннигилируют парами. Число узлов на их границах при этом произвольное и чётным не обязано.

      Исправлю формулировку в статье.


      1. maksa
        09.04.2026 02:56

        Справедливое замечание — спасибо. Вы правы: 7, 1397, 9821 — нечётные числа, и я допустил неточность в тексте.

        Меня не отпускает дежа-вю: в точности в таком стиле мне отвечает ЧатГПТ, когда я его поправляю. Извините, если это не так, но далеко не в одном вашем ответе в комментариях возникает такое чувство.


        1. d00m911
          09.04.2026 02:56

          Такое же ощущение возникло, кстати.


        1. FilipLinx Автор
          09.04.2026 02:56

          Добрый день. А я и не скрываю что ипользую нейросети. Если вы посмотрите мой профиль то увидите что я обычный программист. А так как статья больше по физике (а я обыно не оперирую физическими терминами) нейросети помогают мне точнее формулировать мысли когда я выхожу за пределы своей области. Но ответ мой хоть и отредактирован немного нейросетью. У меня например есть эксперимент по генерации молекул по заданным свойствам. Программу я написал за пару вечеров. Я искал молекулу которая будет собирать энергию от солнца но при этом будет краской. Результат не такой как я ожидал но программа смогла найти те молекулы которые уже используются в производсве солнечных батарей. И новых там примерно ~150 молекул подпадающие под заданные критерии из 2,5 молекул. Напишу статью об этом когда проверю на практике. Код полностью публиковать не буду так как там потенциальные патенты. И это уже химия. А в квантовый мир хочется заглянуть чтобы лучше понимать химию. Всегда казалочь в школе нужно заучивать соединения, и свойства, а не понять один раз и знать как это работает. Я каждый день для себя что то открываю. И квантовый мир стал интересен благодаря ИИ так как в школе на мой взгляд дают ошибочное понимание которе все усложняет, а в институте говорят что это сложно и лучше за это не браться. Собранная мной статистика говорит о том что у меня в среднем за месяц рождается 10 проектов. Я каждый день для себя что то новое открываю, проверяю и пишу код. Это очень захватывает. И про это я напишу отдельную статью скорее будет по психологии. Там я хочу затронуть тему идей, рождения новых идей и как поток мыслей приводит к новым идеям. Про людей которых в психологии называют мультипотенциалами или 'Сканерами' по Барбаре Шер. Я это к чему что мне приходится достаточно глубоко погружаться в тему. Я оперирую абстракициями, но вот сказать на языке людей этой области бывает сложно. Простите если я кого то обидел или не так ответил. И статья не пишется за 5 минут. Хоть в статье и написано что проверил за пару часов, но тема крутилась и были попытки написать программу несколько раз в течении полу года. Но да когда уже были написанны базовые классы красиво вывести получилось буквально за вечер.

          И я не пользуюсь чатом GPT просто по духу он мне не подходит и для задач исследования и программирования. Все приходится препроверять по несколько раз. Обчно это Deepseek или Cloude Sonet


          1. FilipLinx Автор
            09.04.2026 02:56

            из 2,5 млн комбинаций молекул


  1. t278
    09.04.2026 02:56

    клеточный автомат у вас ?