Аттрактор Лоренца является знаковым примером в теории хаоса и нелинейной динамики. Он представляет собой набор решений системы обыкновенных дифференциальных уравнений, предложенной Эдвардом Лоренцем в 1963 году, который демонстрирует сложное и хаотическое поведение.
Математическое описание
Аттрактор Лоренца описывается следующей системой нелинейных дифференциальных уравнений:
dt / dx = σ ( y − x )
dt / dy = x ( ρ − z ) − y
dt / dz = x y − β z
Где:
- x, y, z — переменные системы,
- σ (сигма), ρ (ро), β (бета) — параметры системы.
Для типичных значений параметров σ = 10, ρ = 28, β = 3 / 8, система демонстрирует хаотическое поведение.
Исходный код на языке D
import std.stdio;
import std.math;
import std.conv;
import std.array;
import std.file;
import std.datetime;
// Параметры системы Лоренца
immutable double sigma = 10.0;
immutable double rho = 28.0;
immutable double beta = 8.0 / 3.0;
// Функция для вычисления производных
void lorenz(double t, double[] u, double[] du) {
du[0] = sigma * (u[1] - u[0]);
du[1] = u[0] * (rho - u[2]) - u[1];
du[2] = u[0] * u[1] - beta * u[2];
}
// Численное интегрирование методом Рунге-Кутты 4-го порядка
void rungeKutta4(void function(double, double[], double[]) f, double[] u, double t, double dt) {
size_t n = u.length;
double[] k1 = new double[](n);
double[] k2 = new double[](n);
double[] k3 = new double[](n);
double[] k4 = new double[](n);
double[] utmp = new double[](n);
f(t, u, k1);
foreach (i; 0 .. n) utmp[i] = u[i] + dt * k1[i] / 2;
f(t + dt / 2, utmp, k2);
foreach (i; 0 .. n) utmp[i] = u[i] + dt * k2[i] / 2;
f(t + dt / 2, utmp, k3);
foreach (i; 0 .. n) utmp[i] = u[i] + dt * k3[i];
f(t + dt, utmp, k4);
foreach (i; 0 .. n) u[i] += dt / 6 * (k1[i] + 2 * k2[i] + 2 * k3[i] + k4[i]);
}
void main() {
// Начальные условия
double[] u = [1.0, 1.0, 1.0];
double t = 0.0;
double dt = 0.01;
int steps = 10000;
// Массивы для хранения результатов
double[] x = new double[](steps);
double[] y = new double[](steps);
double[] z = new double[](steps);
// Основной цикл интегрирования
foreach (i; 0 .. steps) {
rungeKutta4(&lorenz, u, t, dt);
x[i] = u[0];
y[i] = u[1];
z[i] = u[2];
t += dt;
}
// Запись результатов в файл
auto file = File("lorenz.csv", "w");
foreach (i; 0 .. steps) {
file.writeln(format("%f,%f,%f", x[i], y[i], z[i]));
}
file.close();
writeln("Simulation completed. Data written to 'lorenz.csv'.");
}
Объяснение
- Определение параметров системы: Параметры σ, ρ и β задаются как неизменяемые (immutable), чтобы избежать случайных изменений.
- Функция для вычисления производных:
lorenz
вычисляет правые части уравнений Лоренца. - Метод Рунге-Кутты 4-го порядка: Функция
rungeKutta4
выполняет численное интегрирование системы уравнений. - Основной цикл интегрирования: Начальные условия задаются в массиве
u
, и далее происходит численное интегрирование с записью результатов в массивыx
,y
иz
. - Запись результатов: Результаты численного интегрирования записываются в файл
lorenz.csv
для последующей визуализации.
Визуализация результата
Для визуализации аттрактора Лоренца можно использовать любой инструмент для построения графиков. Здесь мы используем Python и библиотеку matplotlib для построения 3D-графика на основе данных, сохраненных в lorenz.csv
.
Визуализация на Python
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import pandas as pd
# Загрузка данных
data = pd.read_csv('lorenz.csv', header=None, names=['x', 'y', 'z'])
# Построение графика
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.plot(data['x'], data['y'], data['z'])
# Настройки графика
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z')
ax.set_title('Аттрактор Лоренца')
plt.show()
Аттрактор Лоренца является ярким примером хаотических систем, демонстрируя сложное поведение даже при простых уравнениях.
Автор статьи:
Обновлено:
Добавить комментарий