どうも、108Hassiumです。
最近、ちょっと珍しい有理関数(多項式÷多項式という形で表せる関数)を発見しました。
その一つがf(z,c)=(z−1)(z−c)cで、この関数のマンデルブロ集合は以下のようになります。
☝c/(z-1)(z-c)のマンデルブロ集合(青い領域が発散する領域で、灰色っぽい領域が収束する領域)※この記事におけるマンデルブロ集合とジュリア集合の定義は以下の記事のものを採用します。
式と画像を見ると
cが2か所にある
網目状の領域がある
収束する領域が上下方向に向かって広がっている
・・・などいろいろと珍しそうな点が見つかりますが、私が注目したのはこれらの要素ではありません。
まず、f(x)=(x−1)(x−c)cのグラフを描画すると以下のようになります。

原点から離れるにつれてだんだん水平な線に近づいていく、有理関数としては大して珍しくもない形をしています。
続いて、f(f(x))のグラフはこうなります。

先程とは違う形に見えると思いますが、原点から離れると平らになっていくのは同じです。
ではf(f(f(x)))はどうなるかというと・・・

傾きは平らにならず、左右の端が急激に上方向へ伸びていくようになりました。
これこそが、私が注目した「ちょっと珍しい性質」です。
この性質によりzn+1=(zn−1)(zn−c)cという数列は、「0→1→∞→0…」という3周期のサイクルに近づくようにして無限大に発散していくことになります。
☝z_nが発散していく様子ちなみに、先程マンデルブロ集合の定義の引用元として載せた記事ではz2−1c+1が似た性質を持つことについて触れています。
zn+1=zn2−1c+1は「1→∞→1…」という2周期のサイクルに近づくようにして発散していきます。
☝z_{n+1}=1.4/(z_n^2-1)+1が発散する様子というわけで、このような変な発散の仕方をする関数の見つけ方や性質について解説します。
用語定義
解説の前に、解説に必要な単語をいくつか定義しておきます。
まず、有理関数の次数を「分子の次数-分母の次数」と定義します。
例えばz2−1zは、分子が1次で分母が2次なのでこの関数の次数は-1になります。
また、z21+1のような場合は、z21+z2と変形できるので0次になります。
ちなみに有理関数の次数の定義は何種類かあるようで、wikipediaの「有理関数」のページでは違う定義の次数が使われています。(次数の定義自体は載っていませんが、英語版には3種類の定義が載っています)
次数を調べることで、有理関数のz→∞での挙動がわかります。
※以下、x→∞limf(x)をf(∞)と略記します。また、実数の場合は∞には+∞と-∞の2種類がありましたが、複素有理関数を扱う場合は区別しなくていいらしいです。知らんけど。
0次の場合は、g(z)+c(g(z)は-1次以下)という形に変形することでf(∞)を計算できます。
次に、以下の性質を「n周期発散」と呼ぶことにします。
f(z),f(f(z)),f(f(f(z))),…fn−1(z)の次数が全て0以下
fn(z)の次数は2以上
※fm(z)=mf(f(f(…f(z)…)))
例えばz2−1c+1は、
という性質を持つので2周期発散で、さっきの(z−1)(z−c)cは3周期発散になります。
さて、説明は割愛しますが2周期発散関数を見つけるのは簡単です。
というわけで、3周期発散の関数を見つける方法を解説します。
3周期発散関数の探し方
有理関数全体の中から探すのは大変なので、分母が2次の関数に探索範囲を絞ります。
まずはf(z)=az2+bz+cdz2+ez+gと置いて、f(f(f(z)))の次数を愚直に計算してみます。
まずf(f(z))を計算します。
f(f(z))=f(az2+bz+cdz2+ez+g)=(d(az2+bz+cdz2+ez+g)2+e(az2+bz+cdz2+ez+g)+g)÷(a(az2+bz+cdz2+ez+g)+b(az2+bz+cdz2+ez+g)+c)=a(dz2+ez+g)2+b(dz2+ez+g)(az2+bz+c)+c(az2+bz+c)2d(dz2+ez+g)2+e(dz2+ez+g)(az2+bz+c)+g(az2+bz+c)2=(ad2+abd+a2c)z4+(2ade+b2d+abe+2abc)z3+(ae2+2adg+bcd+b2e+abg+b2c+2ac2)z2+(2aeg+bce+b2g+2bc2)z+ag2+bcg+c3(d2+ade+a2g)z4+(2d2e+bde+ae2+2abg)z3+(de2+2d2g+cde+be2+aeg+b2g+2acg)z2+(2deg+ce2+beg+2bcg)z+dg2+ceg+c2g
f(f(z))が2次になるには、この式の分母の4次の項と3次の項の係数が0にならなければならないので、そのような連立方程式を解くことで2周期発散関数を見つけることができます。(本当はもっと簡単な方法があります)
次に、f(f(f(z)))を計算します。
f(f(f(z)))=f((ad2+abd+a2c)z4+(2ade+b2d+abe+2abc)z3+(ae2+2adg+bcd+b2e+abg+b2c+2ac2)z2+(2aeg+bce+b2g+2bc2)z+ag2+bcg+c3(d2+ade+a2g)z4+(2d2e+bde+ae2+2abg)z3+(de2+2d2g+cde+be2+aeg+b2g+2acg)z2+(2deg+ce2+beg+2bcg)z+dg2+ceg+c2g)
・・・面倒くせぇ!
f(f(f(z)))を展開するだけでも死ぬほど面倒ですが、展開した後に連立方程式を解くことを考えるとこのやり方を続けるのは絶望的です。
というわけで、試行錯誤したところ次のようなやり方を発見しました。
まず、f(z)=(z−a)(z−b)cz+d+eと置きます。
この置き方には以下のような特徴があります。
分子が1次なので計算しやすい
f(∞)の値がわかりやすい(=e)
f(z)=∞になるzの値がわかりやすい(=a,b)
次に、f(f(f(a)))という値を考えます。
最終的にきれいな値にはなりませんでしたが、もしf(f(f(a)))=aが成り立つとf(f(f(∞)))の値は以下のようになります。
f(f(f(∞)))=f(f(e))=f(a)=∞
これに何の意味があるかというと、f(f(f(∞)))=∞ということはf(f(f(z)))の次数は最低でも1以上であることになります。
3周期発散関数を見つけるには1次ではなく2次以上でなければならないのですが、結論から言えば何とかなります。
さて、まずは(e−a)(e−b)ce+d+e=aという方程式を解くのですが、式1本に対し変数が5個もあるのでいくつかの変数は適当な定数を代入してもよさそうです。
ただし、さっきの次数に関する考察を破綻させないためには以下のような制限が付きます。
とりあえず、(a,c,e)=(1,0,0)を代入してみます。
(e−a)(e−b)ce+d+e=a
(0−1)(0−b)0×0+d+0=1
bd=1
d=b
a,c,d,eの値をf(z)に代入すると(x−1)(x−b)bになり、bをcに書き換えると最初に紹介した(x−1)(x−c)cという関数になります。
この関数が3周期発散性を持っていることは既に説明しましたが、他のパターンはどうでしょうか?
例えば(a,c,e)=(2,0,1)とするとd=b−1になり、f(z)=(z−2)(z−b)b−1+1という別の関数が生成されます。
そして、f(f(f(z)))のグラフを描画させてみると2次の形をしていることがわかります。
☝f(x)=(b-1)/(x-2)(x-b)+1(赤)、y=f(f(f(x)))(緑)のグラフ実はこの計算方法で得られる関数は、c=0とすると必ずf(f(f(z)))が2次になるっぽいです。
また、c=0とするともう一つ便利なことがあります。
マンデルブロ集合を描画するにはf(z)の臨界点を求める必要があるのですが、c=0のときは臨界点が2a+bという比較的簡単な式で表せます。
実はc=0でも臨界点が綺麗な式で表せて次数も2次以上になる組み合わせがあるのですが、それに関する説明は今回は割愛したいと思います。
マンデルブロ集合・ジュリア集合との関係
そもそも何でこんなことを考えたかというと、もちろん面白いフラクタル図形を描画するためです。
というわけで、3周期発散関数のマンデルブロ集合とジュリア集合をいくつか紹介します。
☝c/(z-1)(z-c)のマンデルブロ集合これは冒頭でも紹介したやつです。
☝(c-1)/(z-2)(z-c)+1のマンデルブロ集合計算法の説明のところで例として出した式を使ったものですが、よく見るとさっきの(z−1)(z−c)cを平行移動しただけのものに見えます。
☝-(c-1)^2(c+1)/(z^2-c^2)+1のマンデルブロ集合こちらは(a,c,e)=(−b,0,1)を代入したものです。
☝-(c-1)^2(c+1)/(z^2-1)+cのマンデルブロ集合先程のものとそっくりですが、中央の大きな穴の形が違うので相似ではないっぽいです。
☝(z+c^3)/(z-c)^2のマンデルブロ集合続いて、ジュリア集合を紹介します。
☝i/(z-1)(z-i)のジュリア集合
☝(-1.6+2.2i)/(z-1)(z+1.6-2.2i)のジュリア集合
☝(0.3+1.6i)/(z-1)(z-0.3-1.6i)のジュリア集合
☝-(0.6+0.5i-1)^2(0.6+0.5i+1)/(z^2-(0.6+0.5i)^2)+1のジュリア集合
☝-(1.1+1.3i-1)^2(1.1+1.3i+1)/(z^2-(1.1+1.3i)^2)+1のジュリア集合
-(-0.9+i-1)^2(-0.9+i-+1)/(z^2-(-0.9+i-)^2)+1のジュリア集合さて、これらのフラクタル図形には奇妙な共通点が1つあります。
どの図形も穴が開いた形をしているのですが、よく見ると3つの穴が1点でつながっている箇所がたくさんあります。


一方、2周期発散関数であるz2−1c+1のマンデルブロ集合とジュリア集合を観察してみると、1点に集まる穴の個数は2個になっていることがわかります。
☝c/(z^2-1)+1のマンデルブロ集合
☝(1.18+0.96i)/(z^2-1)+1のジュリア集合この性質が発散周期と関係あるのかはよくわかりませんが、ジュリア集合に限れば大体説明が付きます。
そもそもジュリア集合における「穴」というのはzn+1=f(zn)が無限大に発散する点の集まりなわけですが、3周期発散関数の場合は無限大に発散することは3周期のサイクルに収束していくことと同じです。
ということは、ジュリア集合の3周期の領域が三つ葉状になるのと同様に、無限大に発散する領域が三つ葉状になっても何ら不思議ではないのです。
☝z^2-0.1+0.7iのジュリア集合(3周期)ちなみに、3周期発散関数のジュリア集合でも必ずしも三つ葉状の穴ができるわけではありません。
☝0.3/(z-1)(z-0.3)のジュリア集合こういったケースは、z2+cのジュリア集合における「飛び地」に対応するものではないかと思います。
☝z^2-1.75のジュリア集合(3周期)なお、マンデルブロ集合の場合にも同じような特徴が発生する理由は全く分かりません。
最後に
「f(f(f(z)))が1次の場合はどうなるのか」「4周期発散関数を見つける方法」等の話題についてもすでに検証しているのですが、あまり面白い結果が得られていないので今回はこの辺で終わりたいと思います。
もしいい感じの結果が出たらこの記事に追記するか、新規の記事としてまとめたいと思います。
というわけで、さようなら。
追記:続きを書きました。