Моделирование неравновесной агрегации и фрактальных кластеров: Комплекс программ. Описание программной реализации. Этап 3

Тип публикации
Публикация
Этап 3

Цель работы

Цель третьего этапа — описать программную реализацию комплекса моделей неравновесной агрегации и фрактального анализа, разработанного на языке Python в среде Google Colab с использованием библиотек NumPy и Matplotlib. Комплекс включает восемь взаимосвязанных программных модулей, охватывающих различные модели агрегации и методы определения фрактальной размерности.

Задание

В рамках этапа «Реализация, параметры и алгоритмы» требуется:

  • Описать общую структуру программного комплекса.

  • Детально разобрать каждый программный модуль: назначение, параметры, алгоритмы.

  • Представить методы определения фрактальной размерности.

  • Описать модификации базовой модели: химически-ограниченная агрегация, бессеточная модель, баллистическая агрегация, кластер-кластерная агрегация.

  • Провести сравнительный анализ всех моделей.

  • Сформулировать ограничения текущей реализации и рекомендации по улучшению.

Теоретическое введение

Неравновесная агрегация и фракталы

Процессы неравновесной агрегации встречаются повсеместно: образование сажи, рост кристаллов, электрический пробой, формирование аэрозолей и коллоидных систем. Модель диффузионно-ограниченной агрегации (DLA), предложенная Виттеном и Сандером в 1981 году, является классическим примером формирования фрактальных структур.

Фрактальная размерность $D$ является ключевой количественной характеристикой получаемых разветвлённых структур. Для объектов на плоскости $D$ принимает значения от 1 (линия) до 2 (заполненная плоскость). Для классической DLA теоретическое значение составляет $D \approx 1.71 \pm 0.02$.

Методы вычисления фрактальной размерности

Метод радиуса гирации

Масса кластера (число частиц) $N$ связана с его радиусом гирации $R_g$ степенным законом:

$$ N \sim R_g^D $$

Радиус гирации определяется как:

$$ R_g = \sqrt{ \frac{1}{N} \sum_{i=1}^{N} \left[ (x_i - x_c)^2 + (y_i - y_c)^2 \right] } $$

В логарифмических координатах зависимость линеаризуется:

$$ \ln N = D \cdot \ln R_g + C $$

Наклон линейной регрессии даёт значение $D$.

Метод ящиков (box counting)

Стандартный метод вычисления фрактальной размерности по Хаусдорфу. Пространство покрывается сеткой ячеек размера $\varepsilon$, подсчитывается число непустых ячеек $N(\varepsilon)$:

$$ N(\varepsilon) \sim \varepsilon^{-D} $$

В логарифмических координатах:

$$ \ln N(\varepsilon) = -D \cdot \ln \varepsilon + C $$

Структура программного комплекса

Комплекс организован в виде последовательных блоков (ячеек) Jupyter-тетради. Каждый блок является самостоятельным модулем.

БлокНазначениеОсновной класс / функция
1Установка зависимостей, импорт библиотек— (инициализация)
2DLA на квадратной сетке (сеточная модель)DLA_grid
3Анализ фрактальной размерностиanalyze_dimension_growth, box_counting
4Зависимость от вероятности прилипанияanalyze_p_attachment_dependence
5Химически-ограниченная агрегацияChemicallyLimitedDLA
6Бессеточная модель DLA (off-lattice)OffLatticeDLA
7Баллистическая агрегацияBallisticAggregation
8Кластер-кластерная агрегацияClusterClusterAggregation
9Сравнительный анализ всех моделей— (аналитический модуль)
10Сохранение результатов— (экспорт)

Блок 2: Сеточная модель DLA

Назначение

Класс DLA_grid реализует классическую диффузионно-ограниченную агрегацию на квадратной сетке. Частицы стартуют с окружности вокруг растущего кластера, совершают случайное блуждание и прилипают при касании существующих частиц.

Параметры конструктора

Параметры конструктора класса DLA_grid приведены далее:

ПараметрТипПо умолчаниюОписание
sizeint201Размер квадратной сетки (рекомендуется нечётное)
seed_pointtuple или NoneNone (центр)Координаты начальной затравки

Ключевые атрибуты

  • grid — двумерный массив NumPy (0 = пусто, 1 = занято)
  • cluster_points — список кортежей $(x, y)$ всех частиц кластера
  • cluster_size — текущее число частиц
  • Rmax_history — история максимального радиуса кластера
  • N_history — история числа частиц

Основные методы

get_random_start_position()

Генерирует стартовую координату на окружности радиуса $R_{max} + 10$, где $R_{max}$ — текущий максимальный радиус кластера. Угол выбирается равномерно случайным образом из интервала $[0, 2\pi)$.

random_walk(particle, max_steps=100000)

Выполняет случайное блуждание по правилу четырёх соседей (N, S, W, E). На каждом шаге проверяется:

  1. Не удалилась ли частица за пределы $R_{kill} = 2R_{max} + 50$ — уничтожение.
  2. Имеет ли текущая позиция соседа в кластере — прилипание.
  3. Не пересекает ли частица границу сетки — уничтожение.

add_particle(p_attach=1.0)

Основной метод добавления частицы. Параметр $p_{attach}$ задаёт вероятность прилипания: если случайное число $\xi \in [0, 1]$ превышает $p_{attach}$, частица продолжает блуждание.

grow_cluster(N_particles, p_attach=1.0, verbose=True)

Итеративно добавляет $N_{particles}$ частиц.

calculate_radius_of_gyration()

Вычисляет радиус гирации:

$$ R_g = \sqrt{ \frac{1}{N} \sum_i \left[ (x_i - x_c)^2 + (y_i - y_c)^2 \right] } $$

Блок 3: Методы определения фрактальной размерности

Метод радиуса гирации (analyze_dimension_growth)

Метод основан на степенном законе $N \sim R_g^D$. Алгоритм:

  1. Для каждого промежуточного состояния кластера вычисляется $R_g$.
  2. Строится зависимость $\ln N$ от $\ln R_g$.
  3. Выполняется линейная регрессия; наклон прямой даёт $D$.

Начальный участок (первые 50 точек) исключается для устранения краевых эффектов.

Метод ящиков (box_counting)

Стандартный метод Хаусдорфа:

  1. Кластер представляется бинарной матрицей.
  2. Сетка покрывается ящиками размера $\varepsilon$ (от size//2 до 2 с двукратным уменьшением).
  3. Подсчитывается число непустых ящиков $N(\varepsilon)$.
  4. По наклону $\ln N(\varepsilon)$ от $-\ln \varepsilon$ определяется $D$.

Блок 4: Зависимость от вероятности прилипания

Функция analyze_p_attachment_dependence исследует, как изменяется фрактальная размерность при уменьшении вероятности прилипания $p_{attach}$.

Физический смысл: низкая вероятность прилипания ($p < 1$) позволяет частице глубже проникать во внутренние полости кластера, формируя более компактные структуры с более высокой размерностью $D$.

Параметры функции приведены далее.

ПараметрТипПо умолчаниюОписание
N_particlesint500Число частиц в каждом кластере
p_valueslist[1.0, 0.5, 0.25, 0.1, 0.05]Значения вероятности прилипания
sizeint151Размер сетки

Блок 5: Химически-ограниченная агрегация

Описание модели

Класс ChemicallyLimitedDLA наследует DLA_grid и переопределяет логику прилипания: вероятность зависит от числа занятых соседей $k$ у позиции прилипания.

$k$$p_k$
10.01
20.1
30.9
41.0

Метод count_neighbors(point) подсчитывает число занятых соседей из четырёх возможных. При $k = 0$ прилипание не происходит, что предотвращает образование изолированных частиц.

Блок 6: Бессеточная модель DLA

Класс OffLatticeDLA реализует DLA в непрерывном двумерном пространстве. Частицы представлены точками с вещественными координатами, что устраняет анизотропию квадратной сетки.

Параметры модели приведены ниже.

ПараметрТипПо умолчаниюОписание
particle_radiusfloat1.0Радиус частицы
sticking_distancefloat2.0Расстояние прилипания ($\approx 2 \cdot r$)

Алгоритм блуждания: на каждом шаге случайно выбирается угол $\phi \in [0, 2\pi)$, частица смещается на вектор $(step\_size \cdot \cos\phi,; step\_size \cdot \sin\phi)$.

Условие прилипания: евклидово расстояние до любой частицы кластера меньше sticking_distance.

Ключевая проблема: проверка расстояния до всех частиц $O(N)$ на каждом шаге. Рекомендуется ограничивать $N_{particles} \leq 500$.

Блок 7: Баллистическая агрегация

Класс BallisticAggregation моделирует осадку частиц из газовой фазы. Частицы падают сверху вниз и прилипают при первом контакте с подложкой или осевшими частицами.

Параметры приведены ниже.

ПараметрТипПо умолчаниюОписание
widthint200Ширина подложки
substrate_yint0y-координата подложки

Алгоритм add_particle():

  1. Случайно выбирается $x \in [0, width-1]$.
  2. Частица стартует с $y = substrate_y + 150$.
  3. Падение вниз: $y \leftarrow y - 1$ на каждом шаге.
  4. С вероятностью $p_{lateral} \approx 0.2$ — случайное боковое смещение $x \leftarrow x \pm 1$.
  5. Прилипание: позиция $(x, y-1)$ уже занята.

Метод get_boundary() извлекает профиль поверхности; box_counting_boundary() вычисляет фрактальную размерность одномерного профиля (ожидаемое $D \approx 1.3$–$1.5$).

Блок 8: Кластер-кластерная агрегация

Класс ClusterClusterAggregation реализует агрегацию типа «кластер-кластер» (CCA): $N$ частиц случайно размещаются, каждый образует кластер из одной частицы, затем кластеры диффундируют и сливаются при столкновении [@jullien_scaling_1984].

Параметры приведены ниже.

ПараметрТипПо умолчаниюОписание
N_particlesint300Начальное число частиц-кластеров
box_sizefloat300Размер области (периодические границы)

Коэффициент диффузии:

$$ D(M) = D_0 \cdot M^{-\gamma} $$

где $M$ — масса кластера, $D_0 = 2.0$, $\gamma = 1/2$ (гидродинамическое приближение).

Метод step(): случайно выбирается кластер; его смещение — из нормального распределения $\mathcal{N}(0, D(M))$; проверяется столкновение с другими кластерами. При расстоянии $< 2.0$ происходит слияние.

Блок 9: Сравнительный анализ

Сводный график включает все модели и теоретические значения. Ожидаемые диапазоны фрактальной размерности приведены далее.

МодельОжидаемое $D$Причина отклонения от $1.71$
DLA на сетке ($p=1$)$1.68$–$1.74$Сеточная анизотропия
Химически-ограниченная$1.72$–$1.85$Более компактные ветви
Бессеточная DLA$1.70$–$1.72$Изотропность
Граница баллистической$1.25$–$1.50$Размерность линии, не объёма
Кластер-кластерная (CCA)$1.40$–$1.60$Рыхлые открытые структуры

Ограничения и рекомендации

Производительность

Главное узкое место — цикл random_walk в чистом Python. Рекомендации:

  • замена цикла на векторизованные операции NumPy;
  • использование KD-дерева (scipy.spatial.cKDTree) для поиска соседей в бессеточной модели;
  • применение Numba или Cython для JIT-компиляции.

Статистика

Для надёжных оценок $D$ требуется усреднение по 5–10 независимым реализациям. Текущий код строит по одному кластеру для каждого набора параметров.

Метод ящиков

При $N < 200$ метод даёт завышенные оценки из-за недостаточного диапазона масштабов. Рекомендуется использовать точки с $3 \leq \ln(1/\varepsilon) \leq 6$.

Выводы

В рамках третьего этапа:

  • Разработан программный комплекс из 8 модулей на Python с использованием NumPy и Matplotlib.
  • Реализованы четыре модели агрегации: сеточая DLA, химически-ограниченная, бессеточная и кластер-кластерная.
  • Внедрены два метода вычисления фрактальной размерности: метод радиуса гирации и метод ящиков.
  • Проведён сравнительный анализ; полученные значения $D$ соответствуют теоретическим предсказаниям.
  • Объектно-ориентированная архитектура с наследованием обеспечивает переиспользование кода.
  • Сформулированы ограничения и направления дальнейшей оптимизации.
Арсений Агаев
Арсений Агаев
студент 3 курса бакалавриата группы НПИ-01-23

Python-разработчик

Дмитрий Диденко
Дмитрий Диденко
студент 3 курса бакалавриата группы НПИ-01-23

Аналитик

Диана Садова
Диана Садова
студентка 3 курса бакалавриата группы НПИ-01-23

Алгоритмист

Арина Жукова
Арина Жукова
студентка 3 курса бакалавриата группы НПИ-01-23

Теоретик