Методы
Как устроены расчёты
Единичный круг, N одинаковых зарядов, энергия E = Σi<j 1/|ri − rj|. Ищется расстановка с наименьшей E. Все методы написаны заново (C + Python) и считались на двух Mac mini M4 (по 10 ядер).
Общая часть
Граничная эвристика Amore–Zarate
Часть зарядов, Nb, лежит точно на окружности (у минимума их ≈2,8 N2/3). Число Nb фиксируется заранее по формуле Amore–Zarate Nb ≈ 2,84328 N2/3 − 0,530196 N1/3 − 2,32866. Внутренние заряды во время поиска удерживаются в круге радиуса σ = 1 − 1/(2√N), чтобы они не «прилипали» к границе и Nb не менялось. В конце ограничение снимается (σ = 1) и делается полная релаксация.
Локальный спуск
| Метод | Где используется | Как устроен |
|---|---|---|
| TN (усечённый Ньютон) | алгоритм Amore–Zarate | SciPy TNC в переменных статьи: r = σ sin²t, граничные — угол |
| FIRE 2.0 | наши варианты, D&C | затухающая динамика с адаптивным шагом (Guénolé и др., 2020), декартовы координаты с проекцией на ограничения |
| QMD | MD Лаврова–Никонова | mr̈ = F − bṙ, Верле с неявным трением, Δt = 0,001, b = 0,9, 150 000 шагов, σ растёт до 1 |
| L-BFGS | доводка больших N | угол для граничных, (x, y) для внутренних |
| Ньютон | доводка и проверка N ≤ 700 | полный гессиан, остаточная сила ~10−11, спектр — проверка минимума |
| Ньютон–CG | доводка больших N | произведение гессиана на вектор разностью градиентов, шаг по прямому сравнению энергий |
Глобальный поиск
Basin hopping (BH)
Шаг: в случайном месте (центр выбирается по плотности зарядов ρ ∝ 1/√(1−r²)) толкаем заряды в круге радиусом 3 межчастичных расстояния (гауссов толчок 0,5 расстояния), затем спускаем все заряды и принимаем новое состояние по Метрополису с T = 0,01.
Divide & conquer (D&C) Amore–Zarate
Выбирается подкруг (центр по плотности), заряды вне него заморожены, внутри — толчок и спуск; новое состояние принимается, если уменьшилась энергия Eвнутр-внутр + Eвнутр-внеш. Если какой-то заряд сместился больше порога, следующий подкруг ставится на него («погоня» за дефектом). Радиус подкруга растёт от 0,1 до ~1.
Гибрид «бассейн → MD → Метрополис»
Как BH, но вместо толчка координат заряды выбранного «бассейна» получают тепловые скорости (Tтолчка = 0,02), дальше идёт затухающая молекулярная динамика всех зарядов (шаг Δt = 10−3, трение ≈1) и финальный спуск FIRE; новое состояние принимается по Метрополису.
Кольцевая модель
Конфигурация задаётся разбиением N по концентрическим кольцам (n1 = Nb, n2, …) с радиусами rk. Энергия усредняется по фазам колец: E = Σ nkSnk/(4rk) + (2/π)Σk<l nknlK((rl/rk)²)/rk, где Sn = Σm=1n−11/sin(πm/n), K — полный эллиптический интеграл. Радиусы находятся минимизацией, разбиение — перебором соседних разбиений (перенос заряда между кольцами, центральный заряд).
Улучшение рекордов при больших N
Стартуем с опубликованной конфигурации. (1) «Пересадка» заряда (как у Amore для сферической шапки): самый внешний внутренний заряд ставится на окружность (Nb + 1) или граничный заряд из самого тесного места уводится внутрь (Nb − 1), затем локальная релаксация при σ < 1. (2) D&C с крупными подкругами (радиус циклически от 0,04–0,15 до 0,15–0,6 в зависимости от N), FIRE внутри, многопоточное ядро. (3) Сравнение только после одинаково глубокой доводки обеих конфигураций методом Ньютона–CG: до тех пор, пока прогнозируемый выигрыш следующего шага не станет меньше 10−5. (4) При N ≥ 5000 — D&C на GPU (code/gpu_dc.py): толчок 0,4 местного шага, FIRE в подкруге, критерий Метрополиса при T = 0,05, затем общая доводка Ньютоном–CG лучшего состояния.
Что взято из статей, а что выбрано нами
Статьи не указывают часть параметров. Всё, что мы выбирали сами, перечислено здесь; эти значения одинаковы во всех экспериментах.
| Параметр | В статье | У нас |
|---|---|---|
| σ | 1 − 1/(2√N) | так же |
| Nb | формула (7) Amore–Zarate | ближайшее целое (иногда ±1) |
| старт | случайный по плотности | так же; Nb граничных равномерно по углу |
| TN: допуски | не указаны | SciPy TNC, до остановки по изменению f |
| BH: шаг, T | не указаны | толчок 0,5 шага в круге 3 шагов, T = 0,01 |
| D&C: амплитуда толчка | «меньше у границы» | 0,3 локального шага (шаг ∝ ρ−1/2) |
| D&C: порог погони | не указан | 0,5 локального шага, не более 10 раз подряд |
| D&C: радиус | 0,1 → ~1 | линейно 0,1 → 1 за 3100 итераций |
| QMD: график σ | «постепенно до 1» | линейно за первые 2/3 шагов |
| QMD: старт | случайный | случайный + короткая релаксация FIRE (без неё при N ≳ 200 схема разлетается) |
Проверки кода
- Градиенты энергии и в переменных статьи совпадают с конечными разностями (отн. ошибка ≤ 5·10−8); разложение E = EAA + EAB + EBB выполняется точно.
- Гессиан для метода Ньютона проверен конечными разностями (8·10−9).
- Кольцевая модель воспроизводит все 12 опубликованных разбиений и энергий (N = 11…395) до 5 знаков.
- Энергии Amore–Zarate из их координат воспроизводятся до последнего опубликованного знака.
- Скорость ядра: 0,58 нс на пару зарядов на одно ядро M4 (энергия + градиент).
- GPU-ядро (CuPy, двойная точность, A100): энергия совпадает с точной суммой до 1,5·10−16 (отн.), силы на подкруг — с прямым счётом на CPU до 10−15; итоговая энергия каждого прогона пересчитывается заново и сверяется с независимым счётом numpy +
math.fsum.
Код: code/thomsondisk (ядро kernels.c; поиск amore.py, md.py, pdc.py, shells.py, newton.py). Каждый расчёт — JSON-спецификация в runs/specs; сводки — results/.