Теория хаоса и нелинейная динамика: Аттрактор Лоренца

Теория хаоса и нелинейная динамика: Аттрактор Лоренца

Аттрактор Лоренца является знаковым примером в теории хаоса и нелинейной динамики. Он представляет собой набор решений системы обыкновенных дифференциальных уравнений, предложенной Эдвардом Лоренцем в 1963 году, который демонстрирует сложное и хаотическое поведение.

Математическое описание

Аттрактор Лоренца описывается следующей системой нелинейных дифференциальных уравнений:

dt / dx​ = σ ( yx )

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()

    Аттрактор Лоренца является ярким примером хаотических систем, демонстрируя сложное поведение даже при простых уравнениях.


    Карпов Ярослав

    Автор статьи:

    Обновлено:

    27.05.2024


    Комментарии

    Добавить комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *