Аттрактор Лоренца
2024-12-04 15:14![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Аттрактор Лоренца был впервые изучен Эдом Н. Лоренцом, метеорологом, около 1963 года. Он был получен из упрощенной модели конвекции в атмосфере Земли. Он также естественным образом возникает в моделях лазеров и динамо. Система чаще всего выражается как 3 связанных нелинейных дифференциальных уравнения.
Процесс не образует предельных циклов и никогда не достигает устойчивого состояния. Вместо этого он является примером детерминированного хаоса. Как и другие хаотические системы, система Лоренца чувствительна к начальным условиям. Два начальных состояния, как бы близко они ни находились, обычно рано или поздно разойдутся.
Типичная трасса каждой координаты показана на рисунке.

Вот текст программы на Си, воспроизводящей этот аттрактор. Печатаем триста шагов.
∂x/∂t = A·(y − x)Один из часто используемых наборов констант: A = 10, B = 28, C = 8/3.
∂y/∂t = x·(B − z) − y
∂z/∂t = x·y − C·z
Процесс не образует предельных циклов и никогда не достигает устойчивого состояния. Вместо этого он является примером детерминированного хаоса. Как и другие хаотические системы, система Лоренца чувствительна к начальным условиям. Два начальных состояния, как бы близко они ни находились, обычно рано или поздно разойдутся.
Типичная трасса каждой координаты показана на рисунке.

Вот текст программы на Си, воспроизводящей этот аттрактор. Печатаем триста шагов.
Компилируем, запускаем.#include "stdio.h"
int main()
{
const int N = 300;
const double H = 0.01;
const double A = 10.0;
const double B = 28.0;
const double C = 8.0 / 3.0;
double x = 0.1;
double y = 0;
double z = 0;
for (int i = 0; i < N; i++) {
double x_next = x + H * A * (y - x);
double y_next = y + H * (x * (B - z) - y);
double z_next = z + H * (x * y - C * z);
x = x_next;
y = y_next;
z = z_next;
printf("%d %g %g %g\n", i, x, y, z);
}
}
Если Вы думаете, что хаос возможен только с вещественными числами - смею вас разуверить. Переделаем программу на целые.$ cc lorenz-real.c -o lorenz-real
$ ./lorenz-real
...
297 -12.4511 -9.23727 35.4193
298 -12.1297 -8.22112 35.6249
299 -11.7388 -7.21403 35.6721
Запускаем.#include "stdio.h"
int main()
{
const int N = 300;
const long long K = 100000000;
const long long RH = 100;
const long long A = 10;
const long long B = 28;
const long long CN = 8;
const long long CD = 3;
long long x = K / 10;
long long y = 0;
long long z = 0;
for (int i = 0; i < N; i++) {
long long x_next = x + A * (y - x) / RH;
long long y_next = y + (x * (B*K - z) - y*K) / RH / K;
long long z_next = z + (x * y - CN * z * K / CD) / RH / K;
x = x_next;
y = y_next;
z = z_next;
printf("%d %g %g %g\n", i, (double)x/K, (double)y/K, (double)z/K);
}
}
Выходит ровно то же самое. Дело не в числах, а в природе реальности. Здесь математика переходит в физику. Многие процессы вокруг нас, кажущиеся случайными, на самом деле лоренцовы аттракторы, развивающиеся по чётко определённым правилам.$ cc lorenz-integer.c -o lorenz-integer
$ ./lorenz-integer
...
297 -12.4511 -9.23727 35.4193
298 -12.1297 -8.22112 35.6249
299 -11.7388 -7.21403 35.6721
no subject
Date: 2024-12-05 00:04 (UTC)no subject
Date: 2024-12-05 00:20 (UTC)no subject
Date: 2024-12-05 00:26 (UTC)no subject
Date: 2024-12-05 06:59 (UTC)no subject
Date: 2024-12-05 07:18 (UTC)no subject
Date: 2024-12-06 14:48 (UTC)