KAM Torus

2011 / 10 / 28 by
Filed under: AS 
Bookmark this on Delicious
[`livedoor` not found]
[`yahoo` not found]

超久々のカオス・シリーズ。今回のお題は KAM torus。
まずは現物の提示から。

KAM torus – wonderfl build flash online

トーラスという名のとおり、ドーナツ状に穴の開いた円形っぽい形状を描いています。
KAM というのは人名の頭文字をつなげたものとのこと。Kolmogorov、Arnold、Moser という3人のロシア数学者によるものだそうです。
太陽軌道の計算過程で出てきたものらしい。ネットを漁っても日本語資料が出てこなかったんで、英語情報による知識ですが、英語苦手なんで読み間違えているかも(読んだのは KAM Torus とか Kolmogorov-Arnold-Moser theorem あたり)。

漸化式は以下のとおり。


x0 = y0 = orbit / 3;
xn+1 = xn * cos(a) + (xn * xn - yn) * sin(a)
yn+1 = xn * sin(a) - (xn * xn - yn) * cos(a)

変数 a というのは三角関数の引数、つまり角度(angle)ですね。よってその値の範囲は 0 ~ π*2。さらに言えば、0 ~ π と π ~ π*2 で縦軸を基準に対称形を描きます。

軌道という名の変数 orbit は、トーラスの中心点からどれくらい離れた位置にそのドットが打たれるかを指定します。

それぞれ極座標のθと r に相当するといった感じでしょうか。

ところで orbit は x、y の初期値にのみ影響を与え、漸化式の途中では一切影響しないということを思えば、この漸化式の外側に orbit を変化させるループが暗黙的に存在していることが理解できます。
orbit を変化させるループを回し、そして orbit が変化するたびに実際に点を打つループを回す、という2重ループが KAM Torus を描くわけですね。
orbit のループは 0 ~ 1.5 までの範囲を増分 0.05 で変動させると、見やすい感じになるっぽい。
なお orbit の最大値を増やしていくと、KAM Torus は外側に向かってその範囲を拡げていきます。

a = 1.3 のときに、上に示したような、大きな穴の周囲に小さな穴が散在するホームベースのような形状になります。a を変化させると全体形状が変化します。

疑似コードにすると以下のような感じですかね。


a = 1.3;
for (orbit = 0; orbit < 1.5; orbit += 0.05) {  x = y = orbit / 3;  for (i = 0; i < 100; i++) {   x' = x * cos(a) + (x * x - y) * sin(a);   y' = y * sin(a) + (x * x - y) * cos(a);  } }

投稿したコードではスライダーを動かすことで、a を 0 ~ π*2 の範囲で動かすことができます。



Comments

Tell me what you're thinking...
and oh, if you want a pic to show with your comment, go get a gravatar!





WP-SpamFree by Pole Position Marketing