虚数の虚数乗(2)

 問題: z^z^z^z^... という式の値が収束する複素数 z の範囲を求めよ。

* これは前回の続きです >> [id:rikunora:20100429]
虚数虚数乗の虚数乗の虚数乗・・・という計算をどこまでも繰り返していったら、
一定値に収束する数と、そうでない数があります。
前回見たように、i^i^i^i^... という式はとある複素数に収束していました。
一方、10^10^10^10^... といった式は、どう見ても発散します。
ならば、どんな複素数が収束して、どんな複素数が発散するのか?
結果はちょっと想像が付きませんが、パソコンで繰り返し計算して様子を探ることはできます。
今回はそれを試してみました。

ところで、複素数の計算を繰り返し行って収束を見る、ということで有名なフラクタル図形があります。
マンデルブロー集合です >> wikipedia:マンデルブロ集合
今やろうとしていることは、このマンデルブロー集合の描き方にそっくりです。
そこで、既にあるマンデルブロー集合の描画プログラムを元に改造して、今回のプログラムを作ることにしました。
探したところ、こんなプログラムがありました。
* CodeZine -- マンデルブロー集合による新しいフラクタル図形を探索する
>> http://codezine.jp/article/detail/256
このプログラムの数式の部分を差し替えて、今回のプログラムとしました。
肝心の数式部分は、Wolfram|Alphaのお世話になりましょう。>> http://www.wolframalpha.com/

この式に従って、複素数複素数乗を、実数部と虚数部に分けて繰り返し計算します。
問題なのは、繰り返し計算が発散したのか、収束したのかの見分け方です。
ここでは、繰り返し計算の1つ前の値と今回の値がほとんど違わなくなったら収束したと見なすことにしました。
つまり Abs( Z[n-1] - Z[n] ) < ε ということです。
こうしてできたのが、下の URLにあるアプレットです。
* 虚数虚数乗 Applet (要Java、環境によっては非常に重たいので注意!)
>> http://brownian.motion.ne.jp/memo/PowPow.html
さっそく結果を見てみましょう。

(中心(0,0)、範囲2.5)
おおっ、何とも複雑な図形ではありませんか!
黒い部分は上限回数まで収束しなかったところ、
それ以外の部分は収束の速度(繰り返し計算の回数)によって色分けしてあります。

(中心(0,0)、範囲5.0)
もう少し広い範囲はこうなっていました。

(中心(0,0)、範囲20.0)
もっと広い範囲はこんな感じ。鳥の羽のように広がっています。

(中心(0.8,0)、範囲2.5、閾値0.00001)
収束判定の閾値をうんと小さくしてみました。
青い円は(1,0)を中心に広がっているのですが、閾値を小さくすると半径も小さくなってゆきます。
この青円は、閾値を極限まで0に近づけると、1点(1,0) になるのだと思います。

(中心(0.8,0)、範囲2.5、閾値0.01、繰り返し上限256、カラー階調128)
繰り返し上限回数と、カラー階調を変えてみました。
繰り返し上限回数を上げると、色の付いている範囲が広がります。
本当はどこまでが収束する範囲なのでしょうか? 微妙です。

(中心(0.8,0)、範囲5.0、閾値0.01、繰り返し上限256、カラー階調128)
範囲を広げたところです。

(中心(0.8,0)、範囲5.0、閾値0.00001、繰り返し上限1024、カラー階調128)
閾値を小さくして、繰り返し回数を上げてみました。
最終的には原点を中心とする円と、(1,0)から上下に広がる羽のような部分に収束するのでしょうか。
・・・謎です。
というわけで、z^z^z^z^... の収束範囲は、恐ろしく複雑な図形だったのです。
恐ろしげな式の形通りのイメージだという気がします。

# しかし、GW中何をやっているのだろふ。。。
# いや、これはこれで、たいへん充実した過ごし方なのだ。