マンデルブロ集合(6) -マルチブロ-
マンデルブロ集合を描く漸化式は以下のようなものでした。
zn+1 = zn ^ 2 + c;
複素数 z を2乗したものと複素数 c を足したものを次の評価の値としますが、ここで2乗以外の冪乗にした場合、どのような図形が描画されるのか、というのが次のテーマ。
でその結果が↓
マルチブロ集合 – wonderfl build flash online
マンデルブロ集合のときに描かれるお尻みたいな部分が冪乗の指数に応じて増えていきます。その数、指数から1を引いた値。
このようなものをマルチブロ集合というらしいです。
ところで冪乗の指数を小数にしたり、あるいは負の数にしたりすることもできるそうですが、そうなると私の手には余るので、wolframalpha の Multibrot Set のページ(指数に正の実数を指定できます)や「鯵の鯖」というサイトのコンテンツ「マンデルブロ集合の不思議な世界」のページ「変化するマンデルブロ集合」とかを参照ください。
ところで漸化式の冪乗、複素数は実数部と虚数部のふたつの要素から成り立っているため、その乗算はちょっと面倒ですよね。
z * w = (a + bi) * (c + di) = (ac - bd) + (bc + ad)i
乗算はこのように計算しますが、2乗くらいならまだいいです。
z の2乗は (a^2-b^2) + (2ab)i
3乗、4乗ともなると以下のようになります。
z の3乗は (a^3 – 3ab^2) + (3a^2b – b^3)i
z の4乗は (a^4 – 6a^2b^2 + b^4) + (4 * a^3b – 4ab^3)i
もう既に人力による計算はイヤになります(てゆーか上の3乗と4乗間違ってる可能性なきにしもあらず)。
複素数クラス作って、乗算メソッドを搭載するという手もありますが、やってみたらかなり重たかったんですよねー。
では今回投稿したコードではそこいら辺をどのように実装したのか、というのが次回の話題(まぁそれでもけっこう重いわけですが)。
[ad#aquioux_net_article]
Comments
2 Comments on マンデルブロ集合(6) -マルチブロ-
-
koteitan on
木, 24th 2月 2011 11:33 PM
-
Aquioux on
土, 26th 2月 2011 10:30 PM
整数乗でいいなら、メモリを使って
z^4 = (z*z)*(z*z) … 複素乗算2回
z^5 = (z*z)*(z*z)*z … 複素乗算3回
z^6 = (z*z)*(z*z)*(z*z) … 複素乗算3回
z^7 = (z*z)*(z*z)*(z*z)*z … 複素乗算4回
z^8 = ((z*z)*(z*z))*((z*z)*(z*z)) … 複素乗算3回
とするのが三角関数より速いと思います。
オイラーの公式がサポートしてた非整数と負数の効力はなくなっちゃいますが…
そうか! たしかにおっしゃるとおりですね。
2乗の計算はそれほど複雑じゃないんだから、2乗の結果を待避しておいて、それを必要な回数だけ掛けるやり方の方が簡単ですよね。
このエントリーを書いたときは、3乗以上でも展開しなくちゃいけない、っ何か脅迫観念的な思いに囚われてました。
ご教示ありがとうございました。
Tell me what you're thinking...
and oh, if you want a pic to show with your comment, go get a gravatar!