1. ホーム
  2. フラクタル
  3. ローレンツ・アトラクター

ここでは、書籍「フラクタル: 混沌と秩序のあいだに生まれる美しい図形 アルケミスト双書」のp.30,31に掲載されている、ローレンツ・アトラクターを再現してみました。

ローレンツ・アトラクター

今回描いたローレンツ・アトラクターです。カオスと言えばこの図形といえるくらい、よく見かける図形ですね。

ローレンツ・アトラクター

ローレンツ・アトラクターの微分方程式

ローレンツ・アトラクターを表す微分方程式は以下のようになります。\[ \begin{cases} \dot{x} = \sigma ( y – x ) \\ \dot{y} = x(\rho – z) – y \\ \dot{z} = xy – \beta z \end{cases} \\ \sigma=10, \ \ \beta = \frac{8}{3}, \ \ \rho = 28 \]

プログラムコード

今回作成したローレンツ・アトラクターのプログラムコードを示します。微分方程式の数値解析には最も初歩的なオイラー法を用いました。また、最初の座標を(1,0,0)とし、反復回数を100000回にしています。視点を調整すると、いろいろな角度からローレンツ・アトラクターを眺めることができます。

int iteration_num = 100000; // 反復回数 

void setup(){
  size(600,600,P3D);
  background(0,0,0);

  // 視点を調整する
  translate(320.0,450.0, 200.0);
  rotateY(radians(-40));
  rotateX(radians(90));
  
  stroke(255,255,255);

  float scale = width/100.0;
  // 初期値
  float x = 1.0;
  float y = 0.0;
  float z = 0.0;
  point(x*scale, -y*scale, z*scale);
  // オイラー法による数値解析
  int iter = 0;
  float dx, dy, dz;
  float sigma = 10.0;
  float beta = 8.0/3.0;
  float rho = 28.0;
  float dt = 0.001;
  while(iter<iteration_num){
    dx = sigma * (y - x);
    dy = x * (rho - z) - y;
    dz = x * y - beta *z;
    x = x + dx * dt;
    y = y + dy * dt;
    z = z + dz * dt;
    point(x*scale, -y*scale, z*scale);    
    iter++;
  }
}

コメントを残す