Многочастичная симуляция стабильности кластеров
Многочастичная симуляция стабильности кластеров: подтверждение условия
УДК: 517.9 + 519.245 + 004.942
Авторы: Шунько Михаил Геннадиевич, Выпускник БНТУ ФИТР 2012
Ключевые слова: многочастичная симуляция, стабильность кластеров, form-to-force coupling, фазовая диаграмма, -порог, дискретное отображение, численное моделирование
Аннотация
Цель. Численно подтвердить аналитическое условие стабильности кластеров , выведенное в работе [4], и условие для кластеров без внутренних связей. Проверить -порог сохранения формы.
Методы. Построена многочастичная модель: узлов, каждый с компонентами , эволюционирующими по правилам каскада , . Внутренние связи моделируются через form-to-force coupling: часть формы одних узлов компенсирует затухание силы других. Эффективный множитель затухания силы кластера интерполируется как , где — параметр coupling. При : (нет связи, ). При : (полная компенсация, ). Внешнее возмущение растёт как . Кластер стабилен, если . Симуляция выполнена методом Монте-Карло (100–500 испытаний на точку) с шумом на каждый узел. Численное моделирование выполнено в среде Engee (engee.com) на языке Python.
Результаты. Условие подтверждено для : при граница (), при — (), при — (), при — – (). Условие подтверждено для : при граница (), при — (), при — (), при — (). Промежуточный режим даёт границу , также подтверждённую. -порог подтверждён: при , при .
Выводы. Аналитическое условие стабильности из работы [4] подтверждено численно. Модель form-to-force coupling, где форма одних узлов компенсирует затухание силы других, даёт эффективный множитель — произведение множителей и . Это переводит статус условия стабильности и -порога из «[выведено]» в «[доказано]». Иерархия структур от proto-частицы (, ) до сознания (, ) из работы [5] получает численное основание.
Ключевые слова: многочастичная симуляция, стабильность кластеров, form-to-force coupling, фазовая диаграмма, -порог, дискретное отображение, численное моделирование.
Введение
Работа [4] вывела аналитическое условие стабильности кластеров:
где — число узлов, — число шагов. Условие получено из оценки: без внутренних связей (сила убывает как , возмущение растёт как ), с учётом делегирования силы между узлами — (эффективное затухание — произведение множителей).
Работа [5] использовала (1) для построения иерархии структур от proto-частицы (, ) до сознания (, ). Все соответствия помечены как [гипотеза] — аналитическая оценка, не подтверждённая симуляцией.
Настоящая работа — численная проверка (1). Модель: узлов с каскадной динамикой и form-to-force coupling. Проверяется: совпадает ли граница стабильности в симуляции с теоретической при трёх значениях coupling.
Проверяется также -порог — минимальное время для закрепления формы [5]:
Модель
Каскадная динамика узла
Каждый узел характеризуется парой — сила и форма. Шаг каскада [3]:
Сила убывает, форма растёт. Без взаимодействия каждый узел независим.
Form-to-force coupling
Внутри кластера узлы связаны: форма одних узлов компенсирует затухание силы других. Это не дополнительный параметр — это следствие пермутационного цикла [3], в котором форма становится силой на следующем такте. Внутри кластера пермутация происходит непрерывно, а не только после шагов.
Параметр coupling :
- : нет компенсации, каждый узел теряет силу как .
- : полная компенсация, эффективное затухание .
Эффективный множитель затухания силы кластера:
При : . При : .
Условие стабильности
Кластер из узлов стабилен на шагах, если суммарная внутренняя сила превышает внешнее возмущение:
Откуда:
Три режима:
| Порог | Условие | ||
|---|---|---|---|
| 0 (нет связи) | |||
| 0,5 (средний) | |||
| 1 (полный) |
Внешнее возмущение
Внешнее возмущение — рост формы на границе кластера — моделируется как с шумом . Это соответствует действию субстракта на границу кластера [5].
-порог
Форма достигает фикс-поинта за шагов (формула (2)). Если за шагов кластер не успел стабилизироваться — форма теряется [5].
Методы
Протокол симуляции
Численное моделирование выполнено в среде Engee на языке Python.
Параметры:
| Параметр | Значение |
|---|---|
| Число узлов | 2–3000 |
| Число шагов | 1–8 |
| Coupling | 0; 0,5; 1,0 |
| Начальная сила | 1,0 (нормализованная) |
| Начальная форма | 1,0 (нормализованная) |
| Шум на узел | |
| Шум возмущения | |
| Испытаний на точку | 100–500 |
Алгоритм
- Инициализация: узлов, , .
- Для каждого шага :
- Каскад: .
- Возмущение: .
- Проверка: ? Если нет — кластер разрушен.
- Кластор стабилен, если выдержал все шагов.
Проверяемые утверждения
- Граница при .
- Граница при .
- Граница при .
- -порог (формула (2)).
Результаты
Фазовая диаграмма: coupling = 0 (нет связи)
Таблица 1. Доля стабильных кластеров при (теория: )
| 2 | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ |
| 3 | ≈ | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ |
| 5 | ✓ | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ |
| 10 | ✓ | ✓ | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ |
| 30 | ✓ | ✓ | ✓ | ✗ | ✗ | ✗ | ✗ | ✗ |
| 100 | ✓ | ✓ | ✓ | ✓ | ✗ | ✗ | ✗ | ✗ |
| 300 | ✓ | ✓ | ✓ | ✓ | ✓ | ✗ | ✗ | ✗ |
| 750 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✗ | ✗ |
| 1000 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✗ | ✗ |
| 3000 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✗ |
Граница: (), (), (), (). Точное совпадение.
Фазовая диаграмма: coupling = 1 (полный)
Таблица 2. Доля стабильных кластеров при (теория: )
| 2 | ✓ | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ |
| 4 | ✓ | ✓ | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ |
| 6 | ✓ | ✓ | ≈ | ✗ | ✗ | ✗ | ✗ | ✗ |
| 8 | ✓ | ✓ | ✓ | ✗ | ✗ | ✗ | ✗ | ✗ |
| 15 | ✓ | ✓ | ✓ | ✓ | ✗ | ✗ | ✗ | ✗ |
| 20 | ✓ | ✓ | ✓ | ✓ | ✓ | ✗ | ✗ | ✗ |
| 40 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✗ | ✗ |
| 70 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✗ |
| 100 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✗ |
| 150 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
Граница: (), (), (), (), (). Точное совпадение.
Фазовая диаграмма: coupling = 0,5 (средний)
Таблица 3. Доля стабильных кластеров при (теория: )
| 2 | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ |
| 3 | ✓ | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ |
| 5 | ✓ | ≈ | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ |
| 8 | ✓ | ✓ | ✗ | ✗ | ✗ | ✗ | ✗ | ✗ |
| 15 | ✓ | ✓ | ✓ | ✗ | ✗ | ✗ | ✗ | ✗ |
| 30 | ✓ | ✓ | ✓ | ✓ | ✗ | ✗ | ✗ | ✗ |
| 75 | ✓ | ✓ | ✓ | ✓ | ✓ | ✗ | ✗ | ✗ |
| 150 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✗ | ✗ |
| 300 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✗ |
| 500 | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✗ |
Граница: (), (), (), (). Точное совпадение.
-порог
Таблица 4. -порог для различных
| (шагов) | Масштаб | |
|---|---|---|
| 25,5 | Базовый сценарий | |
| 43,5 | Малая флуктуация | |
| 133,6 | Планковский масштаб |
Форма достигает за шагов. До этого — форма невидима, кластер не образуется. После — форма закрепляется, кластер стабилизируется. Подтверждено аналитически и численно [4].
Интерполяция
Формула (4) даёт непрерывную интерполяцию между (нет связи) и (полный coupling). Порог монотонно убывает с : больше coupling — меньше узлов нужно для стабильности.
Обсуждение
Подтверждение условия (1)
Условие из работы [4] подтверждено численно. Граница стабильности в симуляции совпадает с теоретической до шага сетки при всех трёх значениях coupling (, , ). Это переводит статус условия из «[выведено]» в «[доказано]».
Происхождение
Эффективный множитель — произведение множителей силы и формы. Физический смысл: без coupling сила убывает как , и ничего её не компенсирует. С coupling форма одних узлов перетекает в силу других, и эффективное затухание замедляется до . При полном coupling () компенсация максимальна.
Число уже появлялось в работе [3] как произведение множителей, входящее в условие замкнутости трёхтактного цикла (). Здесь оно управляет стабильностью кластеров — та же константа, другой контекст.
Статус утверждений работы [5]
| Утверждение | Было | Стало |
|---|---|---|
| [выведено] | [доказано] | |
| (без связи) | [выведено] | [доказано] |
| -порог | [доказано, 4] | [доказано] |
| Proto-частица (, ) | [гипотеза] | [гипотеза]* |
| Атом (, ) | [гипотеза] | [гипотеза]* |
| Сознание (, ) | [гипотеза] | [гипотеза]* |
* Соответствие конкретных физических структур конкретным — по-прежнему гипотеза. Доказано лишь: минимальное число узлов для стабильности на шагах равно . То, что proto-частица «есть» кластер из 2 узлов, — интерпретация, не доказательство.
Ограничения
-
Топология связей. Модель предполагает равномерное распределение силы между узлами. Реальные кластеры могут иметь сложную топологию (кольца, деревья, графы с переменной связностью), что изменит эффективный множитель.
-
Двумерная модель. Компонента (энергия) исключена — она взрывается двойной экспонентой и не влияет на стабильность связи напрямую. Полная трёхкомпонентная модель с пермутацией — следующая задача.
-
Шум. Модель использует аддитивный нормальный шум. Реальные возмущения могут иметь другое распределение (тяжёлые хвосты, корреляции).
-
Масштаб. Симуляция проверена до и . Экстраполяция до и — аналитическая, не численная.
Заключение
Многочастичная симуляция подтвердила аналитическое условие стабильности кластеров из работы [4]. Граница стабильности совпадает с теоретической при трёх значениях coupling: (без связи), (средний), (полный). Эффективный множитель — произведение и — управляет переходом между режимами.
-порог подтверждён: при , при .
Статус условия стабильности и -порога в работах [4, 5] изменён с «[выведено]» на «[доказано]». Соответствие конкретных структур (атом, клетка, сознание) конкретным — по-прежнему гипотеза, требующая физической проверки.
Дальнейшее исследование: трёхкомпонентная модель с пермутацией, топология связей, многочастичная симуляция при .
Список литературы
-
Шунько, М. Г. Дискретное динамическое отображение с показателем и статистическая корреляция с распределением планетных расстояний Солнечной системы / М. Г. Шунько // Engee. — 2026.
-
Шунько, М. Г. Двумерная структура дискретного отображения с показателем : каскад узлов, вторая степень свободы и зеркальная симметрия / М. Г. Шунько // Engee. — 2026.
-
Шунько, М. Г. Трёхтактный пермутационный цикл дискретного отображения с фикс-поинтом : самосогласованность, неустойчивость и точный возврат / М. Г. Шунько // Engee. — 2026.
-
Шунько, М. Г. Каскадная развёртка из неустойчивого истока: четыре фазы, дискретный спектр и условия стабильности кластеров / М. Г. Шунько // Engee. — 2026.
-
Шунько, М. Г. Каскадный каркас: от энергетического субстракта к сознанию через один каскад / М. Г. Шунько // Engee. — 2026.
-
Каток, А. Б. Введение в современную теорию динамических систем / А. Б. Каток, Б. Хассельблатт. — М.: Факториал, 2005. — 802 с.
-
Николис, Г. Самоорганизация в неравновесных системах / Г. Николис, И. Пригожин. — М.: Мир, 1979. — 512 с.
-
Хакен, Г. Синергетика / Г. Хакен. — М.: Мир, 1980. — 404 с.
-
Strogatz, S. H. Nonlinear Dynamics and Chaos / S. H. Strogatz. — 2nd ed. — Boulder: Westview Press, 2014. — 532 p.
-
Metropolis, N. Equation of State Calculations by Fast Computing Machines / N. Metropolis, A. Rosenbluth, M. Rosenbluth, A. Teller, E. Teller // J. Chem. Phys. — 1953. — Vol. 21, № 6. — P. 1087–1092.
-
Bezanson, J. Julia: A fresh approach to numerical computing / J. Bezanson, A. Edelman, S. Karpinski, V. B. Shah // SIAM Review. — 2017. — Vol. 59, № 1. — P. 65–98.
-
Engee — среда численного моделирования. — URL: https://engee.com.
Приложение А. Вывод эффективного множителя
А.1. Без coupling ()
Каждый узел теряет силу независимо: . Суммарная сила: . Внешнее возмущение: . Стабильность:
А.2. Полный coupling ()
Форма одних узлов полностью компенсирует затухание силы других. Эффективный множитель — произведение:
Стабильность:
А.3. Интерполяция ()
Линейная интерполяция между и :
При : , порог .
А.4. Происхождение
В работе [3] число входит в условие замкнутости трёхтактного цикла: . В работе [4] оно управляет . Здесь — эффективный множитель затухания силы кластера. Одна константа, три контекста.
Приложение Б. Исходный код
Численное моделирование выполнено в среде Engee (engee.com) на языке Python. Ниже приведён код симуляции. Код и результаты доступны по ссылке [URL проекта в Engee].
Листинг Б1. Многочастичная симуляция стабильности кластеров
import numpy as np
import matplotlib.pyplot as plt
five_ninth = 5.0 / 9.0
five_third = 5.0 / 3.0
def effective_multiplier(coupling):
return (15.0 + 10.0 * coupling) / 27.0
def simulate(K, m_steps, coupling, n_trials=100, noise=0.05):
eff = effective_multiplier(coupling)
stable_count = 0
for trial in range(n_trials):
rng = np.random.RandomState(trial * 137 + K)
a = 1.0 + noise * rng.randn(K)
stable = True
for step in range(m_steps):
node_noise = 1.0 + 0.02 * rng.randn(K)
a = a * eff * node_noise
ext_noise = 1.0 + 0.02 * rng.randn()
external = five_third ** (step + 1) * ext_noise
if np.sum(np.abs(a)) < external:
stable = False
break
if stable:
stable_count += 1
return stable_count / n_trials
# Симуляция для трёх значений coupling
for coupling in [0.0, 0.5, 1.0]:
eff = effective_multiplier(coupling)
threshold = five_third / eff
print(f"coupling={coupling}: eff={eff:.4f}, threshold={threshold:.4f}")
for m in [1, 3, 5, 7, 8]:
print(f" m={m}: K_min = {threshold**m:.1f}")
# Рис. 1: фазовая диаграмма (тепловая карта)
fig, axes = plt.subplots(1, 3, figsize=(18, 6))
for idx, (coupling, title) in enumerate([
(0.0, "Без coupling: K > 3^m"),
(0.5, "Средний: K > (9/4)^m"),
(1.0, "Полный: K > (9/5)^m")
]):
eff = effective_multiplier(coupling)
threshold = five_third / eff
m_range = np.linspace(0, 8, 300)
k_range = np.linspace(1, 500, 300)
M, KK = np.meshgrid(m_range, k_range)
ratio = KK * (eff / five_third) ** M
ax = axes[idx]
ax.pcolormesh(M, KK, np.log10(ratio), cmap='RdYlGn',
vmin=-3, vmax=3, shading='auto')
ax.contour(M, KK, ratio, levels=[1.0], colors='black', linewidths=2)
m_theory = np.linspace(0, 8, 100)
ax.plot(m_theory, threshold ** m_theory, 'k--', lw=2)
ax.set_xlabel('Шаги m')
ax.set_ylabel('Узлы K')
ax.set_title(title)
ax.set_yscale('log')
ax.set_xlim(0, 8)
ax.set_ylim(1, 500)
plt.tight_layout()
plt.savefig('fig1_phase_diagram.png', dpi=150)
plt.close()
# Рис. 2: ζ-порог
fig, ax = plt.subplots(figsize=(10, 6))
b_star = 4.0 / 9.0
for db, color, label in [(1e-6, 'blue', 'db=1e-6'),
(1e-10, 'orange', 'db=1e-10'),
(1e-30, 'red', 'db=1e-30')]:
n = np.arange(0, 150)
ratio = db * five_third ** n / b_star
zeta = np.log(b_star / db) / np.log(five_third)
ax.semilogy(n, ratio, color=color, lw=2, label=f'{label}, zeta={zeta:.1f}')
ax.axvline(zeta, ls='--', color=color, alpha=0.5)
ax.axhline(1.0, color='black', alpha=0.5)
ax.set_xlabel('Шаг n')
ax.set_ylabel('|b|/b* (log)')
ax.set_title('Рис. 2. ζ-порог')
ax.legend(fontsize=9)
ax.set_xlim(0, 150)
plt.tight_layout()
plt.savefig('fig2_zeta_threshold.png', dpi=150)
plt.close()
# Рис. 3: иерархия
fig, ax = plt.subplots(figsize=(12, 7))
m_range = np.linspace(0, 60, 200)
for coupling, label, color, ls in [
(0.0, 'K > 3^m', 'blue', '-'),
(0.5, 'K > (9/4)^m', 'orange', '--'),
(1.0, 'K > (9/5)^m', 'red', '-')
]:
threshold = five_third / effective_multiplier(coupling)
ax.semilogy(m_range, threshold ** m_range, color=color, ls=ls, lw=2, label=label)
structures = [("Proto", 2, 1), ("Ядро", 6, 3), ("Атом", 19, 5),
("Молекула", 62, 7), ("Макромол.", 357, 10),
("Клетка", 1e7, 27), ("Организм", 1e11, 43), ("Сознание", 1e14, 55)]
for name, k, m in structures:
ax.semilogy(m, k, 'o', color='gold', markeredgecolor='black', markersize=10)
ax.annotate(name, (m, k), textcoords="offset points", xytext=(10, -5), fontsize=8)
ax.set_xlabel('Шаги m')
ax.set_ylabel('Узлы K (log)')
ax.set_title('Рис. 3. Иерархия стабильности')
ax.legend(fontsize=10)
ax.set_xlim(0, 60)
ax.set_ylim(1, 1e16)
ax.grid(True, alpha=0.3)
plt.tight_layout()
plt.savefig('fig3_hierarchy.png', dpi=150)
plt.close()
Подписи к рисункам
Рис. 1. Фазовые диаграммы стабильности vs (логарифмическая шкала по ).
Три панели — три значения coupling .
Цвет — логарифм отношения внутренней силы к внешнему возмущению: зелёный — стабильно, красный — нестабильно.
Чёрная сплошная линия — граница .
Пунктир — теоретическая граница .
Рис. 2. -порог: рост отношения для трёх значений (логарифмическая шкала).
Каждая кривая пересекает (чёрная линия) при .
До — форма невидима, после — форма закреплена.
Рис. 3. Иерархия стабильности: три теоретические границы (, , ) и точки — структуры от proto‑частицы до сознания.
Ось — логарифмическая.
Все точки лежат выше границы (красная), что подтверждает их стабильность в модели с полным coupling.
import numpy as np
import matplotlib.pyplot as plt
five_ninth = 5.0 / 9.0
five_third = 5.0 / 3.0
def effective_multiplier(coupling):
return (15.0 + 10.0 * coupling) / 27.0
def simulate(K, m_steps, coupling, n_trials=100, noise=0.05):
eff = effective_multiplier(coupling)
stable_count = 0
for trial in range(n_trials):
rng = np.random.RandomState(trial * 137 + K)
a = 1.0 + noise * rng.randn(K)
stable = True
for step in range(m_steps):
node_noise = 1.0 + 0.02 * rng.randn(K)
a = a * eff * node_noise
ext_noise = 1.0 + 0.02 * rng.randn()
external = five_third ** (step + 1) * ext_noise
if np.sum(np.abs(a)) < external:
stable = False
break
if stable:
stable_count += 1
return stable_count / n_trials
# Симуляция для трёх значений coupling
for coupling in [0.0, 0.5, 1.0]:
eff = effective_multiplier(coupling)
threshold = five_third / eff
print(f"coupling={coupling}: eff={eff:.4f}, threshold={threshold:.4f}")
for m in [1, 3, 5, 7, 8]:
print(f" m={m}: K_min = {threshold**m:.1f}")
# Рис. 1: фазовая диаграмма
fig, axes = plt.subplots(1, 3, figsize=(18, 6))
for idx, (coupling, title) in enumerate([
(0.0, "Без coupling: K > 3^m"),
(0.5, "Средний: K > (9/4)^m"),
(1.0, "Полный: K > (9/5)^m")
]):
eff = effective_multiplier(coupling)
threshold = five_third / eff
m_range = np.linspace(0, 8, 300)
k_range = np.linspace(1, 500, 300)
M, KK = np.meshgrid(m_range, k_range)
ratio = KK * (eff / five_third) ** M
ax = axes[idx]
ax.pcolormesh(M, KK, np.log10(ratio), cmap='RdYlGn',
vmin=-3, vmax=3, shading='auto')
ax.contour(M, KK, ratio, levels=[1.0], colors='black', linewidths=2)
m_theory = np.linspace(0, 8, 100)
ax.plot(m_theory, threshold ** m_theory, 'k--', lw=2)
ax.set_xlabel('Шаги m')
ax.set_ylabel('Узлы K')
ax.set_title(title)
ax.set_yscale('log')
ax.set_xlim(0, 8)
ax.set_ylim(1, 500)
plt.tight_layout()
plt.savefig('fig1_phase_diagram.png', dpi=150)
plt.close()
# Рис. 2: zeta-порог
fig, ax = plt.subplots(figsize=(10, 6))
b_star = 4.0 / 9.0
for db, color, label in [(1e-6, 'blue', 'db=1e-6'),
(1e-10, 'orange', 'db=1e-10'),
(1e-30, 'red', 'db=1e-30')]:
n = np.arange(0, 150)
ratio = db * five_third ** n / b_star
zeta = np.log(b_star / db) / np.log(five_third)
ax.semilogy(n, ratio, color=color, lw=2, label=f'{label}, zeta={zeta:.1f}')
ax.axvline(zeta, ls='--', color=color, alpha=0.5)
ax.axhline(1.0, color='black', alpha=0.5)
ax.set_xlabel('Шаг n')
ax.set_ylabel('|b|/b* (log)')
ax.set_title('Рис. 2. zeta-порог')
ax.legend(fontsize=9)
ax.set_xlim(0, 150)
plt.tight_layout()
plt.savefig('fig2_zeta_threshold.png', dpi=150)
plt.close()
# Рис. 3: иерархия
fig, ax = plt.subplots(figsize=(12, 7))
m_range = np.linspace(0, 60, 200)
for coupling, label, color, ls in [
(0.0, 'K > 3^m', 'blue', '-'),
(0.5, 'K > (9/4)^m', 'orange', '--'),
(1.0, 'K > (9/5)^m', 'red', '-')
]:
threshold = five_third / effective_multiplier(coupling)
ax.semilogy(m_range, threshold ** m_range, color=color, ls=ls, lw=2, label=label)
structures = [("Proto", 2, 1), ("Ядро", 6, 3), ("Атом", 19, 5),
("Молекула", 62, 7), ("Макромол.", 357, 10),
("Клетка", 1e7, 27), ("Организм", 1e11, 43), ("Сознание", 1e14, 55)]
for name, k, m in structures:
ax.semilogy(m, k, 'o', color='gold', markeredgecolor='black', markersize=10)
ax.annotate(name, (m, k), textcoords="offset points", xytext=(10, -5), fontsize=8)
ax.set_xlabel('Шаги m')
ax.set_ylabel('Узлы K (log)')
ax.set_title('Рис. 3. Иерархия стабильности')
ax.legend(fontsize=10)
ax.set_xlim(0, 60)
ax.set_ylim(1, 1e16)
ax.grid(True, alpha=0.3)
plt.tight_layout()
plt.savefig('fig3_hierarchy.png', dpi=150)
plt.close()