Цель третьего этапа — описать программную реализацию комплекса моделей неравновесной агрегации и фрактального анализа, разработанного на языке 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$.
Стандартный метод вычисления фрактальной размерности по Хаусдорфу. Пространство покрывается сеткой ячеек размера $\varepsilon$, подсчитывается число непустых ячеек $N(\varepsilon)$:
$$ N(\varepsilon) \sim \varepsilon^{-D} $$
В логарифмических координатах:
$$ \ln N(\varepsilon) = -D \cdot \ln \varepsilon + C $$
Комплекс организован в виде последовательных блоков (ячеек) Jupyter-тетради. Каждый блок является самостоятельным модулем.
| Блок | Назначение | Основной класс / функция |
|---|---|---|
| 1 | Установка зависимостей, импорт библиотек | — (инициализация) |
| 2 | DLA на квадратной сетке (сеточная модель) | 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 | Сохранение результатов | — (экспорт) |
Класс DLA_grid реализует классическую диффузионно-ограниченную агрегацию на квадратной сетке. Частицы стартуют с окружности вокруг растущего кластера, совершают случайное блуждание и прилипают при касании существующих частиц.
Параметры конструктора класса DLA_grid приведены далее:
| Параметр | Тип | По умолчанию | Описание |
|---|---|---|---|
size | int | 201 | Размер квадратной сетки (рекомендуется нечётное) |
seed_point | tuple или None | None (центр) | Координаты начальной затравки |
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). На каждом шаге проверяется:
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] } $$
analyze_dimension_growth)Метод основан на степенном законе $N \sim R_g^D$. Алгоритм:
Начальный участок (первые 50 точек) исключается для устранения краевых эффектов.
box_counting)Стандартный метод Хаусдорфа:
size//2 до 2 с двукратным уменьшением).Функция analyze_p_attachment_dependence исследует, как изменяется фрактальная размерность при уменьшении вероятности прилипания $p_{attach}$.
Физический смысл: низкая вероятность прилипания ($p < 1$) позволяет частице глубже проникать во внутренние полости кластера, формируя более компактные структуры с более высокой размерностью $D$.
Параметры функции приведены далее.
| Параметр | Тип | По умолчанию | Описание |
|---|---|---|---|
N_particles | int | 500 | Число частиц в каждом кластере |
p_values | list | [1.0, 0.5, 0.25, 0.1, 0.05] | Значения вероятности прилипания |
size | int | 151 | Размер сетки |
Класс ChemicallyLimitedDLA наследует DLA_grid и переопределяет логику прилипания: вероятность зависит от числа занятых соседей $k$ у позиции прилипания.
| $k$ | $p_k$ |
|---|---|
| 1 | 0.01 |
| 2 | 0.1 |
| 3 | 0.9 |
| 4 | 1.0 |
Метод count_neighbors(point) подсчитывает число занятых соседей из четырёх возможных. При $k = 0$ прилипание не происходит, что предотвращает образование изолированных частиц.
Класс OffLatticeDLA реализует DLA в непрерывном двумерном пространстве. Частицы представлены точками с вещественными координатами, что устраняет анизотропию квадратной сетки.
Параметры модели приведены ниже.
| Параметр | Тип | По умолчанию | Описание |
|---|---|---|---|
particle_radius | float | 1.0 | Радиус частицы |
sticking_distance | float | 2.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$.
Класс BallisticAggregation моделирует осадку частиц из газовой фазы. Частицы падают сверху вниз и прилипают при первом контакте с подложкой или осевшими частицами.
Параметры приведены ниже.
| Параметр | Тип | По умолчанию | Описание |
|---|---|---|---|
width | int | 200 | Ширина подложки |
substrate_y | int | 0 | y-координата подложки |
Алгоритм add_particle():
Метод get_boundary() извлекает профиль поверхности; box_counting_boundary() вычисляет фрактальную размерность одномерного профиля (ожидаемое $D \approx 1.3$–$1.5$).
Класс ClusterClusterAggregation реализует агрегацию типа «кластер-кластер» (CCA): $N$ частиц случайно размещаются, каждый образует кластер из одной частицы, затем кластеры диффундируют и сливаются при столкновении [@jullien_scaling_1984].
Параметры приведены ниже.
| Параметр | Тип | По умолчанию | Описание |
|---|---|---|---|
N_particles | int | 300 | Начальное число частиц-кластеров |
box_size | float | 300 | Размер области (периодические границы) |
Коэффициент диффузии:
$$ D(M) = D_0 \cdot M^{-\gamma} $$
где $M$ — масса кластера, $D_0 = 2.0$, $\gamma = 1/2$ (гидродинамическое приближение).
Метод step(): случайно выбирается кластер; его смещение — из нормального распределения $\mathcal{N}(0, D(M))$; проверяется столкновение с другими кластерами. При расстоянии $< 2.0$ происходит слияние.
Сводный график включает все модели и теоретические значения. Ожидаемые диапазоны фрактальной размерности приведены далее.
| Модель | Ожидаемое $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. Рекомендации:
scipy.spatial.cKDTree) для поиска соседей в бессеточной модели;Для надёжных оценок $D$ требуется усреднение по 5–10 независимым реализациям. Текущий код строит по одному кластеру для каждого набора параметров.
При $N < 200$ метод даёт завышенные оценки из-за недостаточного диапазона масштабов. Рекомендуется использовать точки с $3 \leq \ln(1/\varepsilon) \leq 6$.
В рамках третьего этапа: