ここでは、書籍「フラクタル: 混沌と秩序のあいだに生まれる美しい図形 アルケミスト双書」の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++;
}
}