ローレンツ・アトラクタ

気晴らしにProcessingでローレンツ・アトラクタを書いてみました。
ローレンツ方程式は以下のとおりです。

chart
chart2
chart3

これを解いて dx, dy, dz を求めます。

chart_2
chart2_2
chart3_2

これをProcessingで描画します。

float x = 0.01;
float y = 0.01;
float z = 0.01;

float dx;
float dy;
float dz;
float dt = 0.02;

float p = 10;
float r = 28;
float b = 8/3;

final int POINT_SIZE = 10000;

float [][] pointAry = new float[3][POINT_SIZE];

void setup() {
  size(500, 500, P3D);
  //noStroke();
  colorMode(RGB, 255);
  smooth();
  frameRate(1);
  for(int i=0; i<POINT_SIZE; i++) {
    dx = (- p*x + p*y) * dt;
    dy = (- x*z + r*x - y) * dt;
    dz = (  x*y - b*z) * dt;
    x += dx;
    y += dy;
    z += dz;
    pointAry[0][i] = x*7;
    pointAry[1][i] = y*3;
    pointAry[2][i] = z*5;
  }
}

void draw() {
  translate(width/2, height/2, 30);
  for(int i=0; i<POINT_SIZE; i++) {
    stroke(255, 0, 0, 100);
    point(pointAry[0][i], pointAry[1][i], pointAry[2][i]);
  }
  saveFrame();
}

出来上がりはこんな感じです。

lorenz