Атракторът на Лоренц с Python

Светът ни е странен, но някои математически задачи показват, че е още по-странен, отколкото мислим. Системата на Лоренц, решена с метода на Ойлер и нарисувана с matplotlib.

Атракторът на Лоренц в 3D

Представи си свят, в който дори най-малката пеперуда може да унищожи цялата планета. Звучи абсурдно, нали? И все пак в това има известна истина. В средата на XX век математикът Едуард Лоренц създава прост математически модел на атмосферната конвекция. Моделът съдържа система от три обикновени диференциални уравнения, които днес познаваме като уравненията на Лоренц:

dxdt=σ(y−x)dydt=x(ρ−z)−ydzdt=xy−βz\begin{aligned} \frac{dx}{dt} &= \sigma (y - x) \\ \frac{dy}{dt} &= x (\rho - z) - y \\ \frac{dz}{dt} &= x y - \beta z \end{aligned}

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

Решаване на системата

Ще ползваме най-простия метод – този на Ойлер:

yn+1=yn+hf(tn,yn)y_{n+1} = y_n + h f(t_n, y_n)

където hh е стъпката. Приложен към системата на Лоренц:

import numpy as np
import matplotlib.pyplot as plt

sigma, rho, beta = 10, 28, 8 / 3
h, t = 0.01, 10000

x = np.empty(t + 1); y = np.empty(t + 1); z = np.empty(t + 1)
x[0], y[0], z[0] = 10, 10, 10

for i in range(t):
    x[i + 1] = x[i] + h * (sigma * (y[i] - x[i]))
    y[i + 1] = y[i] + h * (x[i] * (rho - z[i]) - y[i])
    z[i + 1] = z[i] + h * (x[i] * y[i] - beta * z[i])

fig = plt.figure(figsize=(12, 9))
ax = fig.add_subplot(projection="3d")
ax.plot(x, y, z, color="g", alpha=0.7, linewidth=0.5)
plt.show()

Атракторът на Лоренц

Чувствителност към началните условия

Три траектории, които започват на разстояние 10−510^{-5} една от друга, се разделят след няколко секунди симулирано време:

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