洛倫茨吸引子

<image>

洛倫茨吸引子（Lorenz attractor）是洛倫茨振子（Lorenz oscillator）的長期行為對應的分形結構，以愛德華·諾頓·洛倫茨（Edward Norton Lorenz）的姓氏命名。洛倫茨振子是能產生混沌流的三維動力系統，又稱作勞侖次系統（Lorenz system），其一組混沌解稱作洛倫茨吸引子，以其雙紐線形狀而著稱。映射展示出動力系統（三維系統的三個變量）的狀態是如何以一種複雜且不重複的模式，隨時間的推移而演變的。

<image>

## 簡述

<image>

洛倫茨吸引子及其導出的方程組是由愛德華·諾頓·洛倫茨於1963年發表，最初是發表在《大氣科學雜誌》（Journal of the Atmospheric Sciences）雜誌的論文《Deterministic Nonperiodic Flow》中提出的，是由大氣方程中出現的對流卷方程簡化得到的。

這一洛倫茨模型不只對非線性數學有重要性，對於氣候和天氣預報來說也有著重要的含義。行星和恆星大氣可能會表現出多種不同的准周期狀態，這些准周期狀態雖然是完全確定的，但卻容易發生突變，看起來似乎是隨機變化的，而模型對此現象有明確的表述。

從技術角度看來，洛倫茨振子具有非線性、三維性和確定性。2001年，沃里克·塔克爾（Warwick Tucker）證明出在一組確定的參數下，系統會表現出混沌行為，顯示出人們今天所知的奇異吸引子。這樣的奇異吸引子是豪斯多夫維數在2與3之間的分形。彼得·格拉斯伯格（Peter Grassberger）已於1983年估算出豪斯多夫維數為2.06 ± 0.01，而關聯維數為2.05 ± 0.01。

此系統也會出現在單模雷射和發電機的簡化模型中。除此之外，閉環對流、水輪轉動等物理模型也有此系統的應用。

## 洛倫茨方程

<image>

洛倫茨方程是基於納維－斯托克斯方程、連續性方程和熱傳導方程簡化得出，最初的形式為：

$$\frac { \partial \vec v }{\partial t} + \left( \vec v \cdot \nabla \right) \vec v = -\frac {\nabla p}{\rho} + \nu \nabla ^2 \vec v + \vec g$$

$$\frac { \partial \rho }{\partial t} + \nabla\cdot \left( \rho \vec v \right) = 0$$

$$\frac { \partial T }{\partial t} + \nabla\cdot\left( T \vec v \right) = \chi \nabla ^2 T$$

$$\rho = \rho_0 \left( 1 - \gamma \left( T - T_0 \right) \right)$$

$\vec v$是流速，$T$是流體溫度，$T_0$是上限溫度（也可以寫成$T_0 + \Delta T$），$\rho$是密度，$p$是壓強，$\vec g$是重力，$\gamma$、$\chi$、$\nu$依次是熱膨脹係數、熱擴散率和動黏滯係數。

簡化後的形式稱為洛倫茨方程，是決定洛倫茨振子狀態的方程為一組常微分方程：

$$\frac{dx}{dt} = \sigma (y - x)$$

$$\frac{dy}{dt} = x (\rho - z) - y$$

$$\frac{dz}{dt} = xy - \beta z$$

含時間參數的形式：

$$\begin{cases} \frac{\mathrm{d}x(t)}{\mathrm{d}t}=\sigma \bigl( y(t) - x(t) \bigr)\\ \frac{\mathrm{d}y(t)}{\mathrm{d}t}=\rho \, x(t) - y(t) - x(t) \, z(t)\\ \frac{\mathrm{d}z(t)}{\mathrm{d}t} =x(t) \, y(t) - \beta \, z(t) \end{cases}$$

$\sigma$稱為普蘭特爾數，$\rho$稱為瑞利數。所有的$\sigma$，$\rho$，$\beta$ > 0，但通常$\sigma$ = 10，$\beta$ = 8/3，$\rho$不定。若$\rho<1$，則吸引子為原點，沒有任何其他穩定點。1≤ρ<13.927時，螺線軌跡接近兩點（這相當於存在阻尼振子），兩點的位置由下列式子決定：$~ x = \pm \sqrt{b (\rho-1) }$、$~ y = \pm \sqrt{b (\rho-1) }$、$~ z = \rho-1$。系統在$\rho$ = 28時表現出混沌特性，但$\rho$為其他值時會顯示出具紐結的周期軌道。例如，當$\rho = 99.96$時，圖像變為一個T(3,2)環面紐結。

初始條件的敏感依賴性

時間t=1 （放大）｜時間t=2 （放大）｜時間t=3 （放大）

<image>

｜

<image>

｜

<image>

這三幅圖是在ρ=28，σ = 10，β = 8/3的條件下生成的，展示出洛倫茨吸引子中的兩條軌跡（藍色、黃色各一）的三維演變的三個時段，這兩條軌跡的初始點只在x坐標上相差10-5。開始時，兩條軌跡似乎是重合的（藍色軌跡被黃色遮蓋，因此只能看到黃色軌跡），但一段時間後，分離就變得明顯了。

洛倫茨吸引子的Java動畫展示了振子狀態連續不斷的演變

## 瑞利數

不同ρ值時的洛倫茨吸引子

<image>

｜

<image>

ρ=14, σ=10, β=8/3 （放大）｜ρ=13, σ=10, β=8/3 （放大）

<image>

｜

<image>

ρ=15, σ=10, β=8/3 （放大）｜ρ=28, σ=10, β=8/3 （放大）

ρ值較小時，系統是穩定的，並能演變為兩個定點吸引子中的一個；當ρ大於24.74時，定點變成了排斥子，會以非常複雜的方式排斥軌跡，演變時自身從不交叉。

顯示不同ρ值時振子狀態演變的Java動畫

## 原始碼

### GNU Octave

下面是GNU Octave模擬洛倫茨吸引子的原始碼：

```
## Lorenz Attractor equations solved by ODE Solve
## x' = sigma*(y-x)
## y' = x*(rho - z) - y
## z' = x*y - beta*z
function dx = lorenzatt(X)
    rho = 28; sigma = 10; beta = 8/3;
    dx = zeros(3,1);
    dx(1) = sigma*(X(2) - X(1));
    dx(2) = X(1)*(rho - X(3)) - X(2);
    dx(3) = X(1)*X(2) - beta*X(3);
    return
end
```

```
## Using LSODE to solve the ODE system.
clear all
close all
lsode_options("absolute tolerance",1e-3)
lsode_options("relative tolerance",1e-4)
t = linspace(0,25,1e3); X0 = [0,1,1.05];
[X,T,MSG]=lsode(@lorenzatt,X0,t);
T
MSG
plot3(X(:,1),X(:,2),X(:,3))
view(45,45)
```

### Borland C

```c
#include <graphics.h>
#include <conio.h>
void main()
{
    double x = 3.051522, y = 1.582542, z = 15.62388, x1, y1, z1;
    double dt = 0.0001;
    int a = 5, b = 15, c = 1;
    int gd=DETECT, gm;
    initgraph(&gd, &gm, "C:\\BORLANDC\\BGI");
    do {
	x1 = x + a*(-x+y)*dt;
	y1 = y + (b*x-y-z*x)*dt;
	z1 = z + (-c*z+x*y)*dt;
	x = x1;	y = y1;	z = z1;
	putpixel((int)(19.3*(y - x*0.292893) + 320),
		 (int)(-11*(z + x*0.292893) + 392), 9);
    } while (!kbhit());
    closegraph();
}
```

### Borland Pascal

```delphi
Program Lorenz;
Uses CRT, Graph;
Const
  x: Real = 3.051522;
  y: Real = 1.582542;
  z: Real = 15.62388;
  dt = 0.0001;
  a = 5;
  b = 15;
  c = 1;
Var
  gd, gm: Integer;
  x1, y1, z1: Real;
Begin
  gd:=Detect;
  InitGraph(gd, gm, 'c:\bp\bgi');
  While not KeyPressed Do Begin
      x1 := x + a*(-x+y)*dt;
      y1 := y + (b*x-y-z*x)*dt;
      z1 := z + (-c*z+x*y)*dt;
      x := x1;
      y := y1;
      z := z1;
      PutPixel(Round(19.3*(y - x*0.292893) + 320),
               Round(-11*(z + x*0.292893) + 392), 9);
    End;
    CloseGraph;
    ReadKey;
End.
```

### Fortran

```fortran
program LorenzSystem

real,parameter::sigma=10
real,parameter::r=28
real,parameter::b=2.666666
real,parameter::dt=.01
integer,parameter::n=1000

real x,y,z

open(1,file='result.txt',form='formatted',status='replace',action='write')

x=10.;y=10.;z=10.

do i=1,n,1
    x1=x+sigma*(y-x)*dt
    y1=y+(r*x-x*z-y)*dt
    z1=z+(x*y-b*z)*dt
    x=x1
    y=y1
    z=z1
    write(1,*)x,y,z
enddo

print *,'Done'

 close(1)

end program LorenzSystem
```

### QBASIC/FreeBASIC("fbc -lang qb")

```qbasic
DIM x, y, z, dt, x1, y1, z1 AS SINGLE
DIM a, b, c AS INTEGER
x = 3.051522: y = 1.582542: z = 15.62388: dt = 0.0001
a = 5: b = 15: c = 1
SCREEN 12
PRINT "Press Esc to quit"
WHILE INKEY$ <> CHR$(27)
    x1 = x + a * (-x + y) * dt
    y1 = y + (b * x - y - z * x) * dt
    z1 = z + (-c * z + x * y) * dt
    x = x1
    y = y1
    z = z1
    PSET ((19.3 * (y - x * .292893) + 300), (-11 * (z + x * .292893) + 360)), 9
WEND
END
```

## 外部連結

- 洛倫茨吸引子，作者為Wolfram Demonstrations Project的Rob Morris
- 洛倫茨吸引子，planetmath.org
- 用於繪出洛倫茨吸引子或處理類似情況的原始碼，使用ANSI C及gnuplot實現
- 《同步混沌與私人通信》，由MIT林肯實驗室的Steven Strogatz與Kevin Cuomo講解電子電路中洛倫茨吸引子的實現
- 洛倫茨吸引子交互式動畫 （需Adobe Shockwave插件）
- Levitated.net：計算藝術與設計
- 3D Attractors：三維方式顯示和研究洛倫茨吸引子Mac程序
- 3D VRML Lorenz attractor（需VRML瀏覽器插件）
- J語言實現洛倫茨吸引子演示的短文 - 見J語言
- 非線性模擬的Java小程序 （選擇預設「Lorenz attractor」），作者Viktor Bachraty，編寫語言Jython
- 模擬電子技術中洛倫茨吸引子的實現
- 混沌蝴蝶——洛倫茲吸引子