1. ホーム
  2. フラクタル
  3. 非線型変換を含むフラクタル

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

エノンのアトラクター

今回描いたエノンのアトラクターです。

エノンのアトラクター

エノンのアトラクターの非線形方程式

エノンのアトラクターを描くための非線形方程式は以下となります。\[ x \to 1+y-1.4x^2, \ \ y \to 0.3 x \]

プログラムコード

今回作成したエノンのアトラクターのプログラムコードを示します。なお、今回は横軸(\(x\)軸)と縦軸(\(y\)軸)の縮尺比を3:1にして描いています。また、最初の座標を\((0.1,0)\)とし、反復回数を200000回にしています。

int iteration_num = 200000; // 反復回数 

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

  translate(width/2.0,height/2.0);
  stroke(255,255,255);

  float x_scale = width/3.0;
  float y_scale = height/1.0;
  float x = 0.1;
  float y = 0.0;
  float next_x, next_y;
  point(x*x_scale, -y*y_scale);
  int iter = 0;
  while(iter<iteration_num){
    // 非線形変換
    next_x = 1.0+y-1.4*pow(x,2);
    next_y = 0.3*x;
    x = next_x;
    y = next_y;
    point(x*x_scale, -y*y_scale);    
    iter++;
  }
}

ダフィング・アトラクター

次に描いたダフィング・アトラクターです。

ダフィング・アトラクター

ダフィング・アトラクターの非線形方程式

ダフィング・アトラクターを描くための非線形方程式は以下となります。\[ x \to 2.75x-0.2y-x^3, \ \ y \to x \]

プログラムコード

今回作成したダフィング・アトラクターのプログラムコードを示します。最初の座標を\((0.1,0)\)とし、反復回数を200000回にしています。

int iteration_num = 200000; // 反復回数 

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

  translate(width/2.0,height/2.0);
  stroke(255,255,255);

  float x_scale = width/5.0;
  float y_scale = height/5.0;
  float x = 0.1;
  float y = 0.0;
  float next_x, next_y;
  point(x*x_scale, -y*y_scale);
  int iter = 0;
  while(iter<iteration_num){
    next_x = 2.75*x-0.2*y-pow(x,3);
    next_y = x;
    x = next_x;
    y = next_y;
    point(x*x_scale, -y*y_scale);    
    iter++;
  }
}

ティンカーベル

次はティンカーベルです。

ティンカーベル

ティンカーベルの非線形方程式

ティンカーベルを描くための非線形方程式は以下となります。\[ x \to (x^2-y^2)+0.9x-0.6y, \ \ y \to 2xy + 2x +0.5y \]

プログラムコード

今回作成したティンカーべルのプログラムコードを示します。最初の座標を\((0.1,0)\)とし、反復回数を200000回にしています。また、図形は全体的に中心からずれているので、座標系の中心位置を多少ずらしています。

int iteration_num = 200000; // 反復回数 

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

  translate(width*3.0/5.0,height/3.0);
  stroke(255,255,255);

  float x_scale = width/3.0;
  float y_scale = height/3.0;
  float x = 0.1;
  float y = 0.0;
  float next_x, next_y;
  point(x*x_scale, -y*y_scale);
  int iter = 0;
  while(iter<iteration_num){
    next_x = (pow(x,2)-pow(y,2))+0.9*x-0.6*y;
    next_y = 2.0*x*y+2.0*x+0.5*y;
    x = next_x;
    y = next_y;
    point(x*x_scale, -y*y_scale);    
    iter++;
  }
}

デ・ヨング・アトラクター

次はデ・ヨング・アトラクターです。

デ・ヨング・アトラクター

デ・ヨング・アトラクターの非線形方程式

デ・ヨング・アトラクターを描くための非線形方程式は以下となります。\[ x \to \sin (2y) – \cos (2.5 x), \ \ y \to \sin (x) – \cos (y) \]

プログラムコード

今回作成したデ・ヨング・アトラクターのプログラムコードを示します。最初の座標を\((0.1,0)\)とし、反復回数を200000回にしています。

int iteration_num = 200000; // 反復回数 

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

  translate(width/2.0,height/2.0);
  stroke(255,255,255);

  float x_scale = width/4.0;
  float y_scale = height/4.0;
  float x = 0.1;
  float y = 0.0;
  float next_x, next_y;
  point(x*x_scale, -y*y_scale);
  int iter = 0;
  while(iter<iteration_num){
    next_x = sin(2.0*y)-cos(2.5*x);
    next_y = sin(x)-cos(y);
    x = next_x;
    y = next_y;
    point(x*x_scale, -y*y_scale);    
    iter++;
  }
}

リントンの幽霊

次はリントンの幽霊です。

リントンの幽霊

リントンの幽霊の非線形方程式

リントンの幽霊を描くための非線形方程式は以下となります。\[ x \to \sin (1.2y), \ \ y \to -x – \cos (2y) \]

プログラムコード

今回作成したリントンの幽霊のプログラムコードを示します。最初の座標を\((0.1,0)\)とし、反復回数を200000回にしています。

int iteration_num = 200000; // 反復回数 

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

  translate(width/2.0,height/2.0);
  stroke(255,255,255);

  float x_scale = width/4.0;
  float y_scale = height/4.0;
  float x = 0.1;
  float y = 0.0;
  float next_x, next_y;
  point(x*x_scale, -y*y_scale);
  int iter = 0;
  while(iter<iteration_num){
    next_x = sin(1.2*y);
    next_y = -x-cos(2.0*y);
    x = next_x;
    y = next_y;
    point(x*x_scale, -y*y_scale);    
    iter++;
  }
}

古典的なバリー・マーティンのアトラクター

最後は、古典的なバリー・マーティンのアトラクターです。

古典的なバリー・マーティンのアトラクター

古典的なバリー・マーティンのアトラクターの非線形方程式

古典的なバリー・マーティンのアトラクターを描くための非線形方程式は以下となります。\[ x \to y – \mathrm{sgn}(x) \times \sqrt{|(4x-0.5)|}, \ \ y \to 1-x \]

プログラムコード

今回作成した古典的なバリー・マーティンのアトラクターのプログラムコードを示します。最初の座標を\((0.1,0)\)とし、反復回数を700000回にしています。

int iteration_num = 700000; // 反復回数 

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

  translate(width/2.0,height/2.0);
  stroke(255,255,255);

  float x_scale = width/200.0;
  float y_scale = height/200.0;
  float x = 0.1;
  float y = 0.0;
  float next_x, next_y;
  point(x*x_scale, -y*y_scale);
  int iter = 0;
  while(iter<iteration_num){
    next_x = y - sqrt(abs(4.0*x-0.5))*x/abs(x);
    next_y = 1.0-x;
    x = next_x;
    y = next_y;
    point(x*x_scale, -y*y_scale);    
    iter++;
  }
}

コメントを残す