Система Лоренца и хаос

Три простых уравнения, которые навсегда изменили представление о предсказуемости, и почему прогноз погоды на месяц вперёд невозможен в принципе.

Детерминированный хаос — поведение полностью предсказуемой по уравнениям системы, которое из-за чувствительности к начальным условиям становится практически непредсказуемым на длинных интервалах.

В 1963 году метеоролог Эдвард Лоренц упростил уравнения конвекции воздуха до трёх обыкновенных дифференциальных уравнений. Он ожидал получить скучное затухание или периодические колебания. Вместо этого траектория системы стала бесконечно блуждать, никогда не повторяясь и никогда не уходя в бесконечность. Так был открыт странный аттрактор — геометрический объект, на котором живёт хаос. А заодно родилась знаменитая метафора: взмах крыльев бабочки в Бразилии может вызвать торнадо в Техасе.

Уравнения системы Лоренца

Система описывается тремя связанными уравнениями для координат x, y, z:

x' = sigma * (y - x)
y' = x * (rho - z) - y
z' = x * y - beta * z

Здесь sigma, rho и beta — параметры. Классические значения, при которых возникает хаос: sigma = 10, rho = 28, beta = 8/3. Координаты x, y, z не имеют простого «физического» смысла вроде положения — это абстрактные величины, описывающие интенсивность конвекции и распределение температуры. Важно не происхождение уравнений, а их поразительное поведение.

Странный аттрактор-бабочка

Если нарисовать траекторию (x, y, z) в трёхмерном пространстве, получится фигура, похожая на крылья бабочки или маску. Траектория кружит вокруг одного «крыла», затем непредсказуемо перескакивает на другое, кружит там, снова перескакивает. Она никогда не пересекает саму себя и никогда не замыкается в цикл. При этом она остаётся в ограниченной области — не улетает в бесконечность. Это и есть аттрактор: множество, к которому притягиваются все близкие траектории. «Странный» он потому, что имеет дробную (фрактальную) размерность и хаотическую динамику.

Как работает под капотом

Чтобы посчитать траекторию, нам нужен численный метод для системы трёх уравнений. Мы используем метод Рунге-Кутты 4-го порядка (RK4), но обобщённый на вектор состояния. Состояние — это список [x, y, z]. Правая часть возвращает список производных. Все коэффициенты RK4 (k1, k2, k3, k4) тоже становятся списками, и мы складываем их покомпонентно.

Самое интересное — чувствительность к начальным условиям. Запустим две траектории, отличающиеся в начале всего на 1e-5 по координате x. На малых временах они почти совпадают. Но расстояние между ними растёт экспоненциально: каждые несколько единиц времени оно увеличивается примерно на порядок. Очень быстро траектории становятся совершенно разными. Именно поэтому невозможно предсказать погоду надолго: мы никогда не знаем начальное состояние атмосферы абсолютно точно, а крошечная ошибка лавинообразно нарастает.

import math

def lorenz(state, sigma=10.0, rho=28.0, beta=8.0/3.0):
    x, y, z = state
    dx = sigma * (y - x)
    dy = x * (rho - z) - y
    dz = x * y - beta * z
    return [dx, dy, dz]

def rk4_step(f, state, h):
    k1 = f(state)
    s2 = [state[i] + 0.5 * h * k1[i] for i in range(3)]
    k2 = f(s2)
    s3 = [state[i] + 0.5 * h * k2[i] for i in range(3)]
    k3 = f(s3)
    s4 = [state[i] + h * k3[i] for i in range(3)]
    k4 = f(s4)
    return [state[i] + (h / 6.0) * (k1[i] + 2*k2[i] + 2*k3[i] + k4[i]) for i in range(3)]

def dist(a, b):
    return math.sqrt(sum((a[i] - b[i])**2 for i in range(3)))

h = 0.01
stateA = [1.0, 1.0, 1.0]
stateB = [1.0 + 1e-5, 1.0, 1.0]

print("  t        distance")
t = 0.0
for step in range(1, 4001):
    stateA = rk4_step(lorenz, stateA, h)
    stateB = rk4_step(lorenz, stateB, h)
    t += h
    if step % 500 == 0:
        print(str(round(t, 1)).rjust(5), "   ", "%.6e" % dist(stateA, stateB))

Вывод:

  t        distance
  5.0     1.319564e-03
 10.0     2.169485e-01
 15.0     1.488962e+01
 20.0     2.094652e+01
 25.0     1.987139e+01
 30.0     2.534301e+01
 35.0     3.107856e+01
 40.0     2.760418e+01

Начальное расстояние было 1e-5. К t=5 оно выросло до ~1.3e-3 (в сотни раз), к t=10 — до ~0.2, к t=15 — уже около 15. После этого расстояние перестаёт расти экспоненциально и колеблется на масштабе самого аттрактора (порядка 20-30): траектории уже полностью независимы, дальше «разойтись» некуда. Точные значения после t=15 чувствительны к деталям вычислений — важно качественное: две почти одинаковые системы стали совершенно разными.

Печать самой траектории

import math

def lorenz(state, sigma=10.0, rho=28.0, beta=8.0/3.0):
    x, y, z = state
    return [sigma * (y - x), x * (rho - z) - y, x * y - beta * z]

def rk4_step(f, state, h):
    k1 = f(state)
    s2 = [state[i] + 0.5 * h * k1[i] for i in range(3)]
    k2 = f(s2)
    s3 = [state[i] + 0.5 * h * k2[i] for i in range(3)]
    k3 = f(s3)
    s4 = [state[i] + h * k3[i] for i in range(3)]
    k4 = f(s4)
    return [state[i] + (h/6.0)*(k1[i] + 2*k2[i] + 2*k3[i] + k4[i]) for i in range(3)]

state = [1.0, 1.0, 1.0]
h = 0.01
print("  t        x         y         z")
for step in range(1, 101):
    state = rk4_step(lorenz, state, h)
print(" 1.0  ", round(state[0], 4), round(state[1], 4), round(state[2], 4))

Вывод:

  t        x         y         z
 1.0   -7.5688 -9.4441 24.4984

Уже на интервале до t=1 видно, что точка убежала далеко от старта (1, 1, 1) и кружит где-то на «крыле» аттрактора.

Частые ошибки

  • Покомпонентное сложение векторов. Нельзя писать state + h*k1 для списков — в Python это сконкатенирует или упадёт. Нужны генераторы вида [state[i] + h*k1[i] for i in range(3)].
  • Слишком большой шаг. При h=0.1 RK4 ещё держится, но при h=0.5 решение взрывается — хаотические системы требуют мелкого шага.
  • Ожидание точного совпадения с чужим выводом. Из-за хаоса даже разный порядок арифметики даёт расходящиеся числа на больших t. Сравнивать нужно качественно, а не до последней цифры.
  • Путаница «хаос = случайность». Система Лоренца полностью детерминирована: одни и те же начальные условия дают один и тот же результат. Непредсказуемость идёт от чувствительности, а не от случайности.

Зачем это нужно

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

  • Система Лоренца — три простых уравнения, порождающие хаос при sigma=10, rho=28, beta=8/3.
  • Странный аттрактор-бабочка — ограниченная непериодическая траектория с фрактальной структурой.
  • Чувствительность к начальным условиям: расстояние между близкими стартами растёт экспоненциально.
  • Это фундаментальный предел предсказуемости погоды и других нелинейных систем.
Проверьте себя
1. Что означает чувствительность к начальным условиям в системе Лоренца?
AСистема ведёт себя случайно и недетерминированно
BМалое различие в старте экспоненциально нарастает со временем
CРешение всегда уходит в бесконечность
DРезультат не зависит от начальных условий
2. Какие параметры дают классический хаотический режим Лоренца?
Asigma=1, rho=1, beta=1
Bsigma=10, rho=28, beta=8/3
Csigma=0, rho=0, beta=0
Dsigma=28, rho=10, beta=3
3. Почему странный аттрактор называют 'странным'?
AПотому что траектория уходит в бесконечность
BПотому что он периодический
CПотому что он имеет фрактальную структуру и хаотическую динамику
DПотому что его нельзя вычислить