偽計数学妨害罪

うるせぇ、こっちは遊びで数学やってんだよ

フラクタル画像倉庫2

こんにちは、チオールです。


前回の記事で予告したとおり、前回の記事で触れられなかった要素の解説や載せられなかった画像の紹介などをします。



hassium277.hatenablog.com
※☝前回

用語

まず、この記事で使う用語を定義します。

ジュリア集合

ググってみるとわかりますが、ジュリア集合の定義は書き手によって多少の揺れがあってややこしいのですが、この記事では以下のように扱います。

z_{n+1}=f(z_n)の絶対値が無限大に発散しないような初期値の集合を「f(z)のジュリア集合」と呼ぶ。

他の記事での解説では、以下のような違いが見受けられます。


f(z)z^2+cという形の関数に限定されている

・条件が「無限大に発散しない」ではない


Wikipediaの解説は後者に該当し、そっちの方が正しい定義なのではないかという気がするのですが、面倒臭いので「無限大に発散しない」という条件を採用します。

広義マンデルブロ集合

ジュリア集合は任意の複素関数に対して定義されるとしましたが、マンデルブロ集合についてはz^2+cに限定する定義が主流のようです。


これだと面白くないので、一般の複素関数に拡張した「広義マンデルブロ集合」という概念を定義します。

2変数複素関数f(z,c)について、z_{n+1}=f(z_n,c)の絶対値が無限大に発散しないような定数cの集合を「f(z,c)の広義マンデルブロ集合」と呼ぶ。


例えば普通のマンデルブロ集合は「z^2+cの広義マンデルブロ集合」と表すことができ、前回紹介したマルチブロは「z^n+cの広義マンデルブロ集合」となります。


他にもトリコーンは\bar{z}^2+cの広義マンデルブロ集合、バーニングシップフラクタル(|\text{Re}(z)|+i|\text{Im}(z)|)^2+cの広義マンデルブロ集合に相当します。


ちなみに普通のマンデルブロ集合では「z_0=0」という条件があり、厳密にはこの条件が無いと形が決まらないのですが、面倒なので定義には含めないことにしました。


この記事では特に明言されていない場合、初期値は0としています。

彩色関数

前回紹介できなかったり投稿後に発見した彩色関数をいくつか紹介します。


この項目内では、以下のコードの仕様を標準とします。

Sub f()
    Dim x, y, px, py As Double
    Dim o As Boolean
    For a = 0 To 2000
        For b = 0 To 2000
            x = 0
            y = 0
            o = True
            For c = 0 To 100
                px = x
                py = y
                x = px ^ 2 - py ^ 2 + a / 500 - 2
                y = 2 * px * py + b / 500 - 2
                If x ^ 2 + y ^ 2 > 4 Then
                    Cells(b + 1, a + 1).Interior.Color = (1 - (1 - c / 100) ^ 9) * 255
                    o = False
                    Exit For
                End If
            Next c
            If o Then Cells(b + 1, a + 1).Interior.Color = 0
        Next b
    Next a
End Sub

パーリーパーソン

f:id:Hassium277:20210319235708p:plain

RGB(x ^ 2 * 64, y ^ 2 * 64, 0)


とにかく明るい配色です。


アレンジすると雰囲気が変わります。


f:id:Hassium277:20210320200456p:plain

RGB(x ^ 2 * 64, 0, y ^ 2 * 64)


f:id:Hassium277:20210320200532p:plain

RGB(x ^ 2 * 64, y ^ 2 * 64, 255)

メタリック

f:id:Hassium277:20210320145447p:plain

RGB(120 + 20 * y, 120 + 20 * y, 120 + 20 * y)


金属っぽい配色です。


アレンジすることで光沢と立体感をそのままに別の色にすることができます。


f:id:Hassium277:20210320154302p:plain

RGB(120 + 20 * y, 120 + 20 * y, 0)


f:id:Hassium277:20210320160529p:plain

RGB(120 + 20 * y, 60 + 10 * y, 0)


f:id:Hassium277:20210320162724p:plain

RGB(0, 0, 120 + 20 * y)


f:id:Hassium277:20210320154843p:plain

256 * (120 + 20 * y)

焼樹

f:id:Hassium277:20210320200848p:plain

x ^ 2 * y ^ 2 * 20


ジュリア集合に使うともっとキモくなります。

f:id:Hassium277:20210320200952p:plain
z^2-0.797+0.15
f:id:Hassium277:20210320201034p:plain
特にキモい部分

マンハッタン距離

発散判定の部分を以下のように書き換えると、同じ彩色関数でも見た目が変わります。

If x ^ 2 + y ^ 2 > 4 Then

If Abs(x) + Abs(y) > 4 Then


f:id:Hassium277:20210320212526p:plain

RGB(120 + 20 * y, 120 + 20 * y, 120 + 20 * y)


f:id:Hassium277:20210320212654p:plain

RGB(x ^ 2 * 64, y ^ 2 * 64, 255)


f:id:Hassium277:20210320222107p:plain

x ^ 2 * y ^ 2 * 20

ジュリア集合と広義マンデルブロ集合の関係

Wikipediaの「マンデルブロ集合」のページに、こんな記述があります。

マンデルブロ集合は、 充填ジュリア集合に対する指標として提唱された集合である。

ja.wikipedia.org


実際に普通のマンデルブロ集合とz^2+cのジュリア集合の間には深い繋がりがあり、マンデルブロ集合を観察することでジュリア集合の形状をある程度制御できるようになります。


まず、z^2+ccマンデルブロ集合の内側(黒い領域)から取るとジュリア集合は収束点*1が密集した領域(黒い領域)が発生し、外側から取ると収束点が疎らになります。

f:id:Hassium277:20210319135515p:plainf:id:Hassium277:20210319135531p:plain
c=0.6i(マンデルブロ集合の内側)
f:id:Hassium277:20210319135731p:plainf:id:Hassium277:20210319135751p:plain
c=0.7i(マンデルブロ集合の外側)


※実は前回の記事に載せたコードは「y軸は下向きがプラス」という仕様になっていて、画像が上下逆に生成されるようになっています。この記事でも同じコードを流用するので、0.6iや0.7iは原点より下側に表示されます。


また、cマンデルブロ集合内の縁の近くから取るとジュリア集合はギザギザに、縁から遠い点を取ると丸っこい形になります。

f:id:Hassium277:20210319151918p:plainf:id:Hassium277:20210319151935p:plain
c=0.1+0.6i(マンデルブロ集合内の縁の近く)
f:id:Hassium277:20210319151823p:plainf:id:Hassium277:20210319151839p:plain
c=-0.1+0.3i(マンデルブロ集合内の縁から遠い点)


マンデルブロ集合は中央のハート形(「カージオイド」という名前があるようです)に無数の円が外接した形をしていますが、どの円から点を取るかによってジュリア集合の「枝分かれ」の数が変わります。

f:id:Hassium277:20210319200502p:plainf:id:Hassium277:20210319200518p:plain
c=-0.1+0.7i
f:id:Hassium277:20210319200622p:plainf:id:Hassium277:20210319200643p:plain
c=0.3+0.5i
f:id:Hassium277:20210319200719p:plainf:id:Hassium277:20210319200732p:plain
c=-0.5+0.55i
f:id:Hassium277:20210319200850p:plainf:id:Hassium277:20210319200859p:plain
c=0.38+0.22i
f:id:Hassium277:20210319200938p:plainf:id:Hassium277:20210319200945p:plain
c=0.12+0.62i


この他にも、以下のような特徴があります。

  • 外側のもじゃもじゃした領域の近くの点を使うとジュリア集合ももじゃもじゃする
  • 外側の縁ギリギリの点を使うと複雑で綺麗な画像になる
f:id:Hassium277:20210319211946p:plainf:id:Hassium277:20210319211950p:plain
c=-0.4+0.6i(もじゃもじゃ)
f:id:Hassium277:20210319212142p:plainf:id:Hassium277:20210319212147p:plain
c=-0.75+0.05i(縁ギリギリ)
f:id:Hassium277:20210319212757p:plainf:id:Hassium277:20210319212823p:plain
c=0.28+0.01i(縁ギリギリ)


さて、ここまでの説明はz^2+cの広義マンデルブロ集合とジュリア集合に限った話ですが、「広義マンデルブロ集合とジュリア集合の形状との間に関連性がある」というのは他のケースでもよくあることです。


そのため、面白いジュリア集合を生成するために広義マンデルブロ集合を元にしてパラメーターを決めるというのは有効な手段です。


ちなみにこれは今までの話とはあまり関係ない余談ですが、z^2+cマンデルブロ集合の細部をよく見るとz^2+cのジュリア集合とよく似た形が見つかることがあります。


f:id:Hassium277:20210319233520p:plainf:id:Hassium277:20210319233525p:plain
左:z^2+0.3のジュリア集合
右:z^2+cの広義マンデルブロ集合、c=1.749、2^17倍拡大


f:id:Hassium277:20210319233744p:plainf:id:Hassium277:20210319233751p:plain
左:z^2-0.77+0.14iのジュリア集合
右:z^2+cのマンデルブロ集合、c=-1.769016+0.00268i、200000倍拡大


一般の広義マンデルブロ集合とジュリア集合の間にはこのような関係は見られませんが、「見た目の面白さ」に関して以下のような経験則があります。

  • 広義マンデルブロ集合:パッと見の全体像はあまり面白くないが、細部を拡大すると色々な形があって面白い
  • ジュリア集合:全体像が面白くても、細部を拡大しても全体像とあまり変わらず面白くない

Orbit trap

フラクタル図形の彩色アルゴリズムとして、「Orbit trap」という手法があります。

en.wikipedia.org

簡単に説明すると、こんな感じです。


(1) 基準となる点または線(トラップ)を決める

(2) z_nを計算するとき、(1)で決めたトラップとの距離*2の最小値を記録する。

(3) (2)で記録した距離に応じて色を塗る


VBAでの実装は以下のようになります。

Sub f()
    Dim x, y, px, py, d As Double
    For a = 0 To 2000
        For b = 0 To 2000
            x = 0
            y = 0
            d = 8   '距離変数dを8に初期化
            For c = 0 To 500
                px = x
                py = y
                x = px ^ 2 - py ^ 2 + a / 500 - 2
                y = 2 * px * py + b / 500 - 2
                If d > x ^ 2 + y ^ 2 Then d = x ^ 2 + y ^ 2     '原点との距離がdより小さければ、dを更新
                If x ^ 2 + y ^ 2 > 4 Then Exit For
            Next c
            Cells(b + 1, a + 1).Interior.Color = (1 - d / 8) ^ 99 * 255     'dに応じて色を塗る
        Next b
    Next a
End Sub

f:id:Hassium277:20210312165844p:plain


これはトラップとして点(0,0)を使ったものです。




Sub f()
    Dim x, y, px, py, d As Double
    For a = 0 To 2000
        For b = 0 To 2000
            x = 0
            y = 0
            d = 9   '距離変数dを9に初期化
            For c = 0 To 500
                px = x
                py = y
                x = px ^ 2 - py ^ 2 + a / 500 - 2
                y = 2 * px * py + b / 500 - 2
                If d > (x - 1) ^ 2 Then d = (x - 1) ^ 2     '直線x=1との距離がdより小さければ、dを更新
                If x ^ 2 + y ^ 2 > 100 Then Exit For
            Next c
            Cells(b + 1, a + 1).Interior.Color = (1 - d / 9) ^ 99 * 255     'dに応じて色を塗る
        Next b
    Next a
End Sub

f:id:Hassium277:20210312174123p:plain


こっちは直線x=1をトラップにしたものです。





また、以下のように距離の計算を2回行うことで、2種類の図形をトラップにすることもできます。

Sub f()
    Dim x, y, px, py, d As Double
    For a = 0 To 2000
        For b = 0 To 2000
            x = 0
            y = 0
            d = 9
            For c = 0 To 500
                px = x
                py = y
                x = px ^ 2 - py ^ 2 + a / 500 - 2
                y = 2 * px * py + b / 500 - 2
                If d > (x - 1) ^ 2 Then d = (x - 1) ^ 2     'x=1との距離を計算
                If d > (y - 1) ^ 2 Then d = (y - 1) ^ 2     'y=1との距離を計算
                If x ^ 2 + y ^ 2 > 100 Then Exit For
            Next c
            Cells(b + 1, a + 1).Interior.Color = (1 - d / 9) ^ 99 * 255
        Next b
    Next a
End Sub


f:id:Hassium277:20210312212233p:plain





直線以外の一般の曲線に対して距離の計算を行うのは(多分)困難ですが、簡単な計算で求まる「距離もどき」で代用することができます。

Sub f()
    Dim x, y, px, py, d As Double
    For a = 0 To 2000
        For b = 0 To 2000
            x = 0
            y = 0
            d = 9
            For c = 0 To 500
                px = x
                py = y
                x = px ^ 2 - py ^ 2 + a / 500 - 2
                y = 2 * px * py + b / 500 - 2
                If d > (y - Sin(2 * x)) ^ 2 Then d = (y - Sin(2 * x)) ^ 2
                If x ^ 2 + y ^ 2 > 100 Then Exit For
            Next c
            Cells(b + 1, a + 1).Interior.Color = (1 - d / 9) ^ 99 * 255
        Next b
    Next a
End Sub


f:id:Hassium277:20210313133514p:plain


これはy=\text{sin}(2x)のグラフをトラップとして、曲線との距離の代わりに(y-\text{sin}(2x))^2という値を使用しています。


一般に、f(x,y)=0という方程式で表せる曲線に対してf(x,y)^2は距離の代わりとして使用可能です。


例えば\text{cos}x\text{cos}y=0のグラフは以下のようになりますが、


f:id:Hassium277:20210313142732p:plain


これをトラップにするとこうなります。


f:id:Hassium277:20210313142305p:plain


なお、所詮「距離もどき」なので上手くいかない場合もあります。


例えば(x^2+y^2-1)^3-x^2y^3=0のグラフは見事なハート型になるのですが、


f:id:Hassium277:20210313150541p:plain


これをトラップにしてもハート形は現れません。


f:id:Hassium277:20210313150620p:plain


(x^2+y^2-1)^3-x^2y^3=0のグラフとの距離もどきが一定の点」のグラフを描いてみると、正しい距離とは大きく異なっていることが直感的にわかります。


f:id:Hassium277:20210313151402p:plain


上手くいくかどうかを式から判別する方法は私にはわからなかったので、グラフ描画ソフトで事前に確認するか、上手くいくことを祈りながら実行するしかありません。


それはさておき、コードの以下の部分を

Cells(b + 1, a + 1).Interior.Color = (1 - d / 9) ^ 99 * 255


 

Cells(b + 1, a + 1).Interior.Color = (1 - d / 9) ^ 99 * 511


こう書き換えると、


f:id:Hassium277:20210313202012p:plain


f:id:Hassium277:20210314212043p:plain


線が立体っぽくなります。


Orbit trapについて説明できることは以上なので、ここからはorbit trapで描画した画像を紹介します。

原点トラップ

f:id:Hassium277:20210314221610p:plain
z^2-0.4+0.6i
f:id:Hassium277:20210314225713p:plain
z^2-0.75+0.05i

点をトラップにしたものを疑似立体化すると、球体をくっつけたような見た目になるようです。




f:id:Hassium277:20210314232340p:plain
z^2+0.15


...と思いきや、様子の違うものがありました。


cを原点の近くにとると、球の縁の線が現れなくなるようです。何故?


ちなみに、ジュリア集合にorbit trapを使う場合、距離の計算式の位置を変える必要があります。

px = x
py = y
x = px ^ 2 - py ^ 2 + a / 500 - 2
y = 2 * px * py + b / 500 - 2
If d > x ^ 2 + y ^ 2 Then d = x ^ 2 + y ^ 2

これがマンデルブロ集合の計算に使ったコードで、xとyの値を更新した後で距離の計算をしています。

If d > x ^ 2 + y ^ 2 Then d = x ^ 2 + y ^ 2
px = x
py = y
x = px ^ 2 - py ^ 2 + 0.15
y = 2 * px * py

ジュリア集合の場合は、xとyの更新をする前に距離を計算するようにしてください。

大炎上?

f:id:Hassium277:20210315213932p:plain
バーニングシップフラクタル、y=0


前回の記事で「赤で塗ると炎っぽくなる」的なことを言いましたが、これはなんかもう「燃えてる」って感じではないですね。


あと全く関係ない話なんですが、先述の通り今まで紹介してきた画像は全て上下が反転しています。


ということで、バーニングシップフラクタルは以下の向きが正しい向きになります。


f:id:Hassium277:20210315223624p:plain


恐らくこの画像を見て「船っぽい」と思う人はあまりいないと思うので、バーニングシップという名前を付けた人も上下逆さまに描画したのかもしれませんね。

六芒星

f:id:Hassium277:20210316201607p:plain
(y-1)^3-3(y-1)(x-1)^2=0


(y-1)^3-3(y-1)(x-1)^2=0y^3-3yx^2=0を平行移動した図形で、y^3-3yx^2=0のグラフは3本の直線になります。


f:id:Hassium277:20210316213021p:plain


一般にf(x,y)g(x,y)=0という形の方程式のグラフはf(x,y)=0g(x,y)=0のグラフを重ね合わせたものになります。


y^3-3yx^2=0y×(y+\sqrt{3}x)×(y-\sqrt{3}x)=0と書けるので、y=0y+\sqrt{3}x=0y-\sqrt{3}x=0という3本の直線になるというわけです。


なお、「複数のグラフを重ねた図形をトラップにした場合」と先述の「複数の図形をトラップにした場合」というのでは得られる図形が異なります。


f:id:Hassium277:20210316221441p:plainf:id:Hassium277:20210313202012p:plain
左:(x-1)(y-1)=0をトラップにした場合
右:x-1=0とy-1-0をトラップにした場合



ジュリア集合をこの方法で描画するとこんな感じになります。

f:id:Hassium277:20210316222934p:plain
z^2-0.8+0.15i、(y-1)^3-3(y-1)(x-1)^2=0
f:id:Hassium277:20210316233941p:plain
z^2+0.5+0.4i、(y-1)^3-3(y-1)(x-1)^2=0
f:id:Hassium277:20210316234119p:plain
z^2+0.7i、3(y-1)^3-9(y-1)(x-1)^2=0
f:id:Hassium277:20210316234214p:plain
z^2+0.3、3(y-1)^3-9(y-1)(x-1)^2=0


最後の2枚では(y-1)^3-3(y-1)(x-1)^2=0ではなく、左辺を3倍した3(y-1)^3-9(y-1)(x-1)^2=0という式を使用しています。


3(y-1)^3-9(y-1)(x-1)^2=0のグラフは(y-1)^3-3(y-1)(x-1)^2=0と完全に同じですが、距離もどきの値は異なり結果として描画される星のサイズが小さくなります。


f:id:Hassium277:20210317011500p:plainf:id:Hassium277:20210316234119p:plain
左:(y-1)^3-3(y-1)(x-1)^2=0
右:3(y-1)^3-9(y-1)(x-1)^2=0

成功例

f:id:Hassium277:20210318182033p:plain
z^2+0.3、(x-1)^2+Abs(x-1)(y+1)+(y+1)^2-0.5
f:id:Hassium277:20210318205925p:plain
z^2-0.8+0.2i、(x-1)^2-Abs(x-1)(y-1)+(y-1)^2-0.5
f:id:Hassium277:20210318210603p:plain
z^2-1、(x+1)^2+Abs(x+1)(y+1)+(y+1)^2-0.5


先程「距離もどきが良い感じに機能しない例」としてハート形の曲線を上げましたが、x^2+|x|y+y^2-0.5=0という別の方程式を使えばハート形の曲線を描画することができます。


彩色関数を以下のように書き換えることで、背景を白にすることができます。

RGB(255, (1 - (1 - d / 9) ^ 99) * 255, (1 - (1 - d / 9) ^ 99) * 255)

f:id:Hassium277:20210318185705p:plain

あとこれは余談なんですが、cの虚部が0のときz^2+cのジュリア集合は(普通に描画すると)左右対称になります。


なのでorbit trapでトラップの位置を左右逆にすれば、生成される画像も左右逆になると思っていました。


ところが、実際に描画してみるとこうなりました。

f:id:Hassium277:20210318182325p:plainf:id:Hassium277:20210318182033p:plain
z^2+0.3


また、cの虚部が0でないときも原点を中心として点対称になりますが、トラップを180度回転させた場合も単純に回転させたものとは異なる画像になりました。

f:id:Hassium277:20210318205853p:plainf:id:Hassium277:20210318205925p:plain
z^2-0.8+0.2i

いろいろな広義マンデルブロ集合

ガッカリ定理

f:id:Hassium277:20210321161745p:plain
z^2+z+cの広義マンデルブロ集合


普通のマンデルブロ集合と異なる2次関数を使った広義マンデルブロ集合で、関数が違うので違う形になります。


・・・と思ったのですが、いろいろ実験しているうちに「普通のマンデルブロ集合の初期値を0.5に変えたやつ」とほぼ同じ形であることに気付きました。


f:id:Hassium277:20210321161745p:plainf:id:Hassium277:20210321192314p:plain
左:z^2+z+cの広義マンデルブロ集合
右:z_0=0.5としたときのz^2+cの広義マンデルブロ集合


これはz^2+z=(z+\frac{1}{2})^2-\frac{1}{4}と変形できることに起因していて、このことは以下のように一般化できるようです。

f(z,c)=az^2+bz+cの広義マンデルブロ集合は、初期値を\frac{b}{2}としたときのz^2+cの広義マンデルブロ集合と相似である

吸引力の変わるただ二つの不動点

f:id:Hassium277:20210321192906p:plain
z^2+czの広義マンデルブロ集合


f(z,c)=z^2+czz=0のときにz=f(z,c)が成り立つため、初期値を0にすると全ての点で収束してしまいます。


初期値を変えた場合は以下のようになります。

f:id:Hassium277:20210321214821p:plain
z_0=1
f:id:Hassium277:20210321214854p:plain
z_0=0.1
f:id:Hassium277:20210321214916p:plain
z_0=0.01
f:id:Hassium277:20210321220409p:plain
z_0=0.0001
f:id:Hassium277:20210321223337p:plain
z_0=0.00000001
f:id:Hassium277:20210321230917p:plain
z_0=0.0000000000000001


どうやらz_0を0に近づけていっても、z_0がちょうど0であるときとは収束の仕方が同じにならないようです。


ちなみに、z_0=-1にするとz_1=1-cz_2=(1-c)^2+c(1-c)=1-cになりz_0=0のときと同じように全ての点で収束してしまいますが、


f:id:Hassium277:20210321203617p:plain


描画するとバグります。


計算誤差のせいでしょうか?

指数関数と三角関数

f:id:Hassium277:20210322010013p:plain
exp(z)+cの広義マンデルブロ集合


z_{n+1}=\text{exp}(z_n)+cは、実部と虚部に分けると以下のようになります。


\begin{cases}x_{n+1}=\text{cos}(y_n)\text{exp}(x_n)+a\\y_{n+1}=\text{sin}(y_n)\text{exp}(x_n)+b\end{cases}


なお、発散判定は前回の記事やここまで使っていた方法と同様にx^2+y^2の大きさで判定していますが、どうやらこの場合は正しい方法ではないようです。


普通のマンデルブロ集合では「|z_n|が2を超えたら二度と原点付近には戻ってこない」という性質があるため発散が判定できていましたが、\text{exp}(z_n)+cではy_nが0でなければx_nが負になる可能性があり、x_nが負になれば絶対値がどんなに大きくても一気に原点付近へ引き戻されます。


また、判定の上手くいかなさを裏付けるかのように、判定方法を変えると収束領域の形状が変化してしまいます。

f:id:Hassium277:20210322010047p:plain
x^2>100
f:id:Hassium277:20210322142917p:plain
x>10


指数関数といえば、複素数版の三角関数は指数関数を使って表すことができます。


2\text{sin}(x+iy)=\text{sin}(x)(\text{exp}(y)+\text{exp}(y))+i\text{cos}(x)(\text{exp}(y)-\text{exp}(-y))
2\text{cos}(x+iy)=\text{cos}(x)(\text{exp}(y)+\text{exp}(-y))+i\text{sin}(x)(\text{exp}(-y)-\text{exp}(y))

f:id:Hassium277:20210322161852p:plain
2sin(z)+c
f:id:Hassium277:20210322161916p:plain
2cos(z)+c


\text{exp}(z)+cはかなり独特な見た目でしたが、三角関数の方は多項式関数と形が似ている部分がありますね。


形が似ているといえば、こんなものを発見しました。

f:id:Hassium277:20210322161938p:plain
exp(z)+exp(-z)+c


周りのわさわさした部分はさておき、中央には普通のマンデルブロ集合によく似た図形が見えます。


これは\text{exp}(z)+\text{exp}(-z)という関数そのものが2次関数と似ていることに由来しています。

f:id:Hassium277:20210322195520p:plain
exp(x)+exp(-x)とx^2のグラフの比較


y=\text{exp}(x)+\text{exp}(-x)のグラフは「重力下で両端を固定された鎖の形状を表す曲線」として知られていますが、昔は鎖の形は放物線になると考えられていたようです。


かの有名なガリレオ・ガリレイも勘違いしていたらしいので、ガリレオ\text{exp}(z)+\text{exp}(-z)+cの広義マンデルブロ集合を見せたら普通のマンデルブロ集合と勘違いするかもしれないですね。*3

対称性増やし

f:id:Hassium277:20210328170603p:plain
z^2+c^2
f:id:Hassium277:20210328165306p:plain
z^2+c^3
f:id:Hassium277:20210328170053p:plain
exp(z)+c^5


f(z,c)=g(z)+cという形の関数においてcc^nに置き換えると、対応する広義マンデルブロ集合はn回回転対称になります。



元から(原点を中心として)m回回転対称なものは、c^nへの置換によりm×n回回転対称になります。

f:id:Hassium277:20210328210417p:plain
z^4+c^2
f:id:Hassium277:20210328210537p:plain
z^4+c^3
f:id:Hassium277:20210328220958p:plain
z^3+c^4


cに依存しない定数を足すことで、回転対称性は変わらずに形が変化します。

f:id:Hassium277:20210328195813p:plain
z^2+c^3+i
f:id:Hassium277:20210328195849p:plain
z^2+c^5-1.5
f:id:Hassium277:20210328211218p:plain
exp(z)+c^5+1+2i
f:id:Hassium277:20210328224257p:plain
z^4+c^3+0.5+0.6i


なお、定数じゃない項を足すと対称性は崩れます。

f:id:Hassium277:20210328232638p:plain
z^2+c^5+c


また、マルチブロ等の一部の広義マンデルブロ集合に限った話ですが、zc^nを直接掛けたりすることでも対称性が変わることがあります。


f:id:Hassium277:20210328201751p:plain

分数関数

f:id:Hassium277:20210323132107p:plain
1/z^2+c


\frac{1}{z^2}+cはマルチブロ集合(z^n+cの広義マンデルブロ集合)のn=-2の場合に相当しますが、前回の記事で紹介したn≥2の場合とは大分様子が異なります。


例えばn=2であればzの絶対値が大きければ大きいほど発散しやすいため、広義マンデルブロ集合は原点付近に島状に分布していました。


一方n=-2では絶対値が大きければ大きいほどz^nの絶対値が小さくなるため、広義マンデルブロ集合は原点の周りに海状に分布するようです。




f:id:Hassium277:20210323190045p:plain
z^2+1/c
f:id:Hassium277:20210323190142p:plain
z^2+1/(z+c)


cが分母側に来る場合も、cの絶対値が大きいほど小さい値が足されることになり広義マンデルブロ集合が外側に広がっていくことがあります。




f:id:Hassium277:20210322215758p:plain
cz+1/z
f:id:Hassium277:20210322215846p:plain
z^2+c/z


分数関数では、バーニングシップフラクタルで見られたようなノイズ状の発散領域がよく見られます。




f:id:Hassium277:20210322215931p:plain
(0.1+i)z+1/z+c


この画像は計算回数不足(100回)により生じた偽りの姿で、(0.1+i)z+\frac{1}{z}+cの広義マンデルブロ集合の真の姿は以下のようになります。

f:id:Hassium277:20210322220018p:plain
(0.1+i)z+1/z+c (真の姿)



指数関数と同様に、分数関数でも絶対値による収束判定が正常に機能しないことがあるようです。


例えば\frac{1}{z^2}という関数を反復する場合、発散するときは「でかい数→小さい数→めっちゃでかい数→めっちゃ小さい数...」というサイクルで発散していきます。


しかし\frac{1}{z^2}+c(c≠0)の場合、小さい数になった時にcが足されることで次の数が大きくならず、結果として計算途中で絶対値が大きくなっても発散が確定しません。


判定が正しくないのは「そういうものだ」と諦めて生成される画像を楽しめばいい話ですが、分数関数の場合はゼロ除算の問題も発生します。


少なくともExcelVBAでは、計算途中で分母がゼロになるとエラーが出て計算が止まります。


そのため、以下のように割り算の実行前にゼロ除算が発生しないかチェックする処理を挟む必要があります。

Sub f()
    Dim x, y, px, py As Double
    Dim o As Boolean
    For a = 0 To 2000
        For b = 0 To 2000
            x = a / 500 - 2
            y = b / 500 - 2
            o = True
            For c = 0 To 500
                If x = 0 And y = 0 Then
                    Cells(b + 1, a + 1).Interior.Color = RGB(cr(c * 9), cr(c * 9 + 85), cr(c * 9 + 170))
                    o = False
                    Exit For
                Else
                    px = x
                    py = y
                    x = (px ^ 2 - py ^ 2) / (px ^ 2 + py ^ 2) ^ 2 + a / 500 - 2
                    y = -2 * px * py / (px ^ 2 + py ^ 2) ^ 2 + b / 500 - 2
                    If x ^ 2 + y ^ 2 > 100 Then
                        Cells(b + 1, a + 1).Interior.Color = RGB(cr(c * 9), cr(c * 9 + 85), cr(c * 9 + 170))
                        o = False
                        Exit For
                    End If
                End If
            Next c
            If o Then Cells(b + 1, a + 1).Interior.Color = 0
        Next b
    Next a
End Sub

Function cr(ByVal c As Long) As Integer
    cr = (c Mod 256) * (255 - (c Mod 256)) / 65
End Function


初期値を0とすると確定でゼロ除算が発生するため、そういう場合は初期値をcや1に変更します。


ちなみに、分数関数でもゼロ除算対策が要らないときもあります。

f:id:Hassium277:20210323222922p:plain
(0.1+i)z+1/(z^2+2)+c


例えば\frac{1}{z^2+2}z=±\sqrt{2}のときにゼロ除算が発生します。


しかし、描画する際の初期値は\frac{1}{1000}刻みの有理数で、計算過程の値もずっと有理数なので±\sqrt{2}をドンピシャで踏むことは起こり得ません。

いろいろなジュリア集合

多項式

f:id:Hassium277:20210324003229p:plain
z^2-0.1+0.65i
f:id:Hassium277:20210324003104p:plain
z^2-1.7485+0.001i
f:id:Hassium277:20210324003316p:plain
z^3+0.01+1.11i
f:id:Hassium277:20210324003355p:plain
z^3+0.4+0.003i
f:id:Hassium277:20210324003437p:plain
z^3+0.5+0.476i
f:id:Hassium277:20210324003553p:plain
z^5+0.7+0.35i
f:id:Hassium277:20210324003627p:plain
z^5+0.595+0.545i


「ジュリア集合と広義マンデルブロ集合の関係」の項目で言及した「広義マンデルブロ集合の縁近くに点を取ると複雑で綺麗な画像になる」というのは他の関数でも大抵当てはまります。


なお、縁ギリギリの点を使ったときのジュリア集合に見られるカラフルな領域は発散が遅い領域なので、計算回数が少ないと違う見た目になることがあります。

f:id:Hassium277:20210324175558p:plain
z^2+(-1+0.01i)z、n=500
f:id:Hassium277:20210324175647p:plain
z^2+(-1+0.01i)z、n=50000

※念のため言っておきますが、彩色関数は同じではありません。

指数関数と三角関数

f:id:Hassium277:20210324175856p:plain
exp(z)+0.4+i


\text{exp}(z)+cのジュリア集合には、広義マンデルブロ集合にもみられたヤシの木のような模様が現れます。

f:id:Hassium277:20210324200715p:plain
2cos(z)-1.208+0.02i


多項式関数のジュリア集合では、「定数項に対応する点を広義マンデルブロ集合上で内側から外側へ移動させると、外側へ出た瞬間にジュリア集合の収束領域が一気に消滅する」という現象が見られました。

f:id:Hassium277:20210324212509p:plainf:id:Hassium277:20210319212142p:plain
z^2+cでの例:cを0.75から0.75+0.05iに動かすと収束領域が消える


2cos(z)-1.208+0.02iという式もそういう意図で作ったものですが、予想に反して一部の領域は黒いまま残りました。


結果として、「湖面に浮いた得体のしれない油膜に群がる水棲昆虫」みたいなキモいビジュアルになりました。

分数関数

f:id:Hassium277:20210324235721p:plain
1/z^2-0.5+0.384i
f:id:Hassium277:20210324235839p:plain
(0.1+i)z+1/(z^2+2)-0.5-1.4i
f:id:Hassium277:20210325140124p:plain
(0.1+i)z+1/z
f:id:Hassium277:20210325140204p:plain
(1+0.1i)z+1/z


多項式関数などと比べると、分数関数では同じ彩色関数を使っても全然違うカラーリングになることが少なからずあります。

f:id:Hassium277:20210319211946p:plainf:id:Hassium277:20210325140124p:plain
同じ彩色関数
f:id:Hassium277:20210325141139p:plain
z^2+(0.1+0.3i)/z
f:id:Hassium277:20210325141235p:plain
z^2-0.5926/z


上の2枚はz^2+\frac{c}{z}という形の式から生成されていますが、z^2+\frac{c}{z}の広義マンデルブロ集合を見ても対応する位置には何もありません。

f:id:Hassium277:20210325151603p:plain
z^2+c/zにおけるc=-0.5926とc=0.1+0.3i


そもそも広義マンデルブロ集合の形状は初期値によって変わるので、「広義マンデルブロ集合がジュリア集合の特徴を表しているかどうか」は初期値に左右されます。


上のz^2+\frac{c}{z}の広義マンデルブロ集合では初期値として(特に意味も無く)z_0=1を選びましたが、これが適切でなかったため対応関係が崩れたと考えられます。


なお、広義マンデルブロ集合における初期値について「\frac{\partial}{\partial z}f(z,c)=0を満たす点を初期値にするとよい」という説明を見たことがあるのですが、それでうまくいく理由が全く分からないので参考にはしてません。

非正則関数

今まで紹介してきたもののほとんどは、「複素数の関数としてきれいに表せる式」を使って定義されるものばかりでした。


数学的な言い方をすると、今まで紹介してきたものの定義式は「正則(微分可能)」であるといえます。

f:id:Hassium277:20210228210311p:plainf:id:Hassium277:20210315215126p:plain
例外:トリコーンとバーニングシップフラクタル


非正則な関数についても広義マンデルブロ集合やジュリア集合を定義することが可能で、正則なものでは見られないような特徴を持つものもあります。


というわけで、非正則関数によるフラクタル画像を紹介します。

トリコーン

f:id:Hassium277:20210326200008p:plain
(x-iy)^2-0.4+0.1iのジュリア集合
f:id:Hassium277:20210326200103p:plain
(x-iy)^2+0.2+0.5iのジュリア集合
f:id:Hassium277:20210326200134p:plain
(x-iy)^2-0.55+0.05iのジュリア集合


トリコーンのジュリア集合です。


z^2+cのジュリア集合と雰囲気はよく似ていますが、探してみると意外と似た形は無いようです。

海の幸

f:id:Hassium277:20210325233956p:plain
(|x|+i|y|)^2-1.1iのジュリア集合
f:id:Hassium277:20210325233522p:plain
(|x|+i|y|)^2+0.76-01.1iのジュリア集合
f:id:Hassium277:20210325233422p:plain
(|x|+i|y|)^2+0.3-0.4iのジュリア集合
f:id:Hassium277:20210325233818p:plain
(|x|+i|y|)^2+0.296iのジュリア集合
f:id:Hassium277:20210325233903p:plain
(|x|+i|y|)^2-0.4+0.086iのジュリア集合


バーニングシップフラクタルのジュリア集合です。


生物っぽい形が多いような気がします。

f:id:Hassium277:20210327224715p:plain
exp(|x|+i|y|)+cの広義マンデルブロ集合


指数関数にバーニングシップフラクタルと同じ変換を適用してみたところ、バーニングシップフラクタルとよく似た船っぽい形になりました。

f:id:Hassium277:20210327224917p:plain
exp(|x|+i|y|)-0.99-0.2i

滑らかさ

f:id:Hassium277:20210326202010p:plain
xy+y+a,xy-x+bの広義マンデルブロ集合
f:id:Hassium277:20210326210518p:plain
xy+y-1.3,xy-xのジュリア集合
f:id:Hassium277:20210326210609p:plain
xy+y-0.5,xy-x+1のジュリア集合


トリコーンやバーニングシップは正則っぽさや独自の特徴を持っていましたが、非正則関数によるフラクタル図形の多くには共通する特徴があります。

f:id:Hassium277:20210326215040p:plainf:id:Hassium277:20210326215043p:plain
非正則関数によるフラクタル図形と正則関数によるフラクタル図形の比較


一言でいうと、非正則関数によるフラクタル図形の特徴は「滑らかさ」です。


普通のマンデルブロ集合では収束領域の縁は無限に細かいパーツが付いており、発散の遅い線状の領域も折れ曲がってたり分岐していたりして、滑らかな部分は(多分)存在しません。


一方で、(xy+y+a,xy-x+b)のような非正則フラクタル図形には所々滑らかな部分が見られます。


ちなみにマンデルブロ集合には「マンデルブロ集合内での位置によってジュリア集合の枝分かれの数が変わる」という性質がありましたが、(xy+y+a,xy-x+b)にも似た性質があります。

f:id:Hassium277:20210326224557p:plainf:id:Hassium277:20210326224603p:plain
xy+y+0.1,xy-x+0.2のジュリア集合
f:id:Hassium277:20210326224748p:plainf:id:Hassium277:20210326224752p:plain
xy+y+0.2,xy-x+0.7のジュリア集合
f:id:Hassium277:20210326224823p:plainf:id:Hassium277:20210326224827p:plain
xy+y+0.2,xy-x+0.9のジュリア集合
f:id:Hassium277:20210326224859p:plainf:id:Hassium277:20210326224904p:plain
xy+y,xy-x+0.95のジュリア集合

ニセマンデルブロ集合

f:id:Hassium277:20210327132735p:plain
x^2-y^2+a,xy+bの広義マンデルブロ集合
f:id:Hassium277:20210327133119p:plain
x^2-y^2+0.47,xy+0.7のジュリア集合
f:id:Hassium277:20210327133219p:plain
x^2-y^2+0.315,xy+0.1のジュリア集合


z^2+cの虚部の係数"2"を1に変えたものです。


式の形が似ているせいか、細部が普通のマンデルブロ集合に似ています。


係数を他の値にすると以下のようになります。

f:id:Hassium277:20210327145841p:plain
x^2-y^2+a,3xy+bの広義マンデルブロ集合
f:id:Hassium277:20210327152412p:plain
x^2-y^2-0.45,3xyのジュリア集合
f:id:Hassium277:20210327162706p:plain
x^2-y^2+a,-xy+bの広義マンデルブロ集合
f:id:Hassium277:20210327162755p:plain
x^2-y^2-0.3,-xy+0.4のジュリア集合

マンデルモドキ

f:id:Hassium277:20210325205022p:plain
???


これは以下のコードから生成される図形です。

Sub f()
    Dim x, y As Double
    Dim o As Boolean
    For a = 0 To 2000
        For b = 0 To 2000
            x = 0
            y = 0
            o = True
            For c = 0 To 500
                x = x ^ 2 - y ^ 2 + a / 500 - 2
                y = 2 * x * y + b / 500 - 2
                If x ^ 2 + y ^ 2 > 100 Then
                    Cells(b + 1, a + 1).Interior.Color = RGB(cr(c * 7), cr(c * 8), cr(c * 9))
                    o = False
                    Exit For
                End If
            Next c
            If o Then Cells(b + 1, a + 1).Interior.Color = 0
        Next b
    Next a
End Sub

Function cr(ByVal c As Long) As Integer
    cr = (c Mod 256) * (255 - (c Mod 256)) / 65
End Function


パッと見普通のマンデルブロ集合と全く同じに見えますが、正しいコードでは以下のように計算しています。

px = x
py = y
x = px ^ 2 - py ^ 2 + a / 500 - 2
y = 2 * px * py + b / 500 - 2


この計算は以下のように書き換えられます。


\begin{cases}x_{n+1}=x_n^2-y_n^2+a\\y_{n+1}=2x_ny_n+b\end{cases}


x_{n+1}y_{n+1}の計算にはx_ny_nの値を使っており、コード中ではpxとpyがx_ny_nに対応しています。


一方、先程のコードでは前の項を保存せずにxとyを直接使用しているため、数式で書くと以下のようになります。


\begin{cases}x_{n+1}=x_n^2-y_n^2+a\\y_{n+1}=2x_{n+1}y_n+b\end{cases}


これをx_ny_nの式に書き直すと以下のようになります。


\begin{cases}x_{n+1}=x_n^2-y_n^2+a\\y_{n+1}=2x_n^2y_n-2y_n^3+2ay_n+b\end{cases}


式の形が大きく異なるせいか、先程の偽マンデルブロ集合と比べて見た目の「非正則っぽさ」が強いように見えます。


ちなみにジュリア集合は以下のような感じになります。

f:id:Hassium277:20210325220518p:plain
x^2-y^2-1.4,2y(x^2-y^2-1.4)のジュリア集合
f:id:Hassium277:20210327173214p:plain
x^2-y^2+0.35,2y(x^2-y^2+0.35)+0.01のジュリア集合

指魚

f:id:Hassium277:20210327230020p:plain
x^2cos(y)+a,x^2sin(y)+bの広義マンデルブロ集合


指数関数から指数関数を取り除き、x^2に置き換えてみました。


式の形が似ているせいか、非正則っぽさが弱いようにみえます。

f:id:Hassium277:20210327230802p:plain
x^2cos(y)+1.1,x^2sin(y)-0.6のジュリア集合
f:id:Hassium277:20210327230637p:plain
x^2cos(y)-1.8,x^2sin(y)+0.2のジュリア集合

分複茶釜

f:id:Hassium277:20210327173751p:plain
x^2+y^2-1.4,2xyのジュリア集合(原点トラップ)


複素数に似た概念として、「分解型複素数」というものがあります。


ja.wikipedia.org


複素数は実数に対してi^2=-1を満たす新しい数を追加してできた概念ですが、分解型複素数j^2=1を満たす数を追加したものです。


orbit trap無しで描画したときのジュリア集合とマンデルブロ集合は以下のようになります。

f:id:Hassium277:20210327184206p:plain
x^2+y^2-1.4,2xyのジュリア集合(orbit trap無し)
f:id:Hassium277:20210327182858p:plain
分解型複素数マンデルブロ集合


全然面白く無いですね。


ちなみに、普通のマンデルブロ集合の式に絶対値関数を混ぜると、分解型複素数版っぽい部分が中途半端に混ざることがあります。

f:id:Hassium277:20210327194239p:plain
x^2-|y|y+a,2xy+bの広義マンデルブロ集合(右上が分解型複素数っぽい)
f:id:Hassium277:20210327184754p:plain
x^2-|y|y-1.4,2xyのジュリア集合(右上が分解型複素数っぽい)
f:id:Hassium277:20210327200832p:plain
|x|x+y^2+a,2xy+bの広義マンデルブロ集合(右側が分解型複素数っぽい)
f:id:Hassium277:20210327202150p:plain
|x|x+y^2-0.3,2xy+0.4のジュリア集合(右側が分解型複素数っぽい)
f:id:Hassium277:20210327201032p:plain
|x|x-y^2+0.284,2xy+0.01のジュリア集合(左側が分解型複素数っぽい)


分解型っぽくない部分はこんな感じです。

f:id:Hassium277:20210327201336p:plain
x^2-|y|y-0.14,2xy+0.65のジュリア集合
f:id:Hassium277:20210327201601p:plain
x^2-|y|y+0.28,2xy+0.01のジュリア集合

にんにくと歯車の市松風炒め

余り物です。

f:id:Hassium277:20210327231511p:plain
x-y^2+0.3,-y-x^2+0.9のジュリア集合
f:id:Hassium277:20210327232118p:plain
x-y^2+a,-y-x^2+bの広義マンデルブロ集合
f:id:Hassium277:20210327232402p:plain
x-y^2+0.62,x+y^2-1.5のジュリア集合
f:id:Hassium277:20210329004322p:plain
y-x^2,y^2-(y-x^2)-1.04のジュリア集合
f:id:Hassium277:20210327232519p:plain
x^2+y-1,y^2-xのジュリア集合
f:id:Hassium277:20210327232716p:plain
y^2-x+a,x^2-y+bの広義マンデルブロ集合
f:id:Hassium277:20210327232808p:plain
y^2-x,x^2-y-1のジュリア集合
f:id:Hassium277:20210327232858p:plain
y^2-x+0.1,x^2-y-0.6のジュリア集合
f:id:Hassium277:20210329190759p:plain
-1.2xy+1.2x,0.5xy-0.8yのジュリア集合

折り返し変換

バーニングシップフラクタルの計算では2乗する前に実部と虚部の絶対値をとっていますが、このことは「実部と虚部の負の部分を折り返している」と解釈することができます。


このとき、|x|の代わりに|x-r|+rとすることで「x<rの部分を折り返す」という操作を行うことができ、rの値を変えることでフラクタル図形の見た目を変えることができます。

f:id:Hassium277:20210329155502p:plain
(|x+2|-2+iy)^2+cの広義マンデルブロ集合
f:id:Hassium277:20210329161319p:plain
(x+i(|y+2|-2))^2+cの広義マンデルブロ集合
f:id:Hassium277:20210329164704p:plain
(|x+2|-2+i(|y+2|-2))^2+cの広義マンデルブロ集合


上の3枚はそれぞれ「x<-2の領域を折り返す」「y<-2の領域を折り返す」「両方折り返す」という操作をしています。


なお、普通のマンデルブロ集合の周りの領域をよく見るとトリコーンっぽい形が見えますが、


f:id:Hassium277:20210329164847p:plain


f:id:Hassium277:20210329164909p:plain


f:id:Hassium277:20210329164927p:plain


実は外側にデカいのがいます。


折り返し変換を適用したマンデルブロ集合を拡大すると、細部にも網目状の模様が現れていることがわかります。

f:id:Hassium277:20210329191313p:plain
(Abs(x+2)-2+i(Abs(y+2)-2))^2+c(c=-1.769016+0.00268i、200000倍拡大)


ジュリア集合に対して折り返し変換を適用するとこうなります。

f:id:Hassium277:20210329191728p:plain
(|x+2|-2+i(|y+2|-2))^2+0.28+0.01iのジュリア集合
f:id:Hassium277:20210329191830p:plain
(|x+2|-2+i(|y+2|-2))^2-0.75+0.05i


非正則関数によるフラクタル図形に対しても適用可能です。

f:id:Hassium277:20210329204404p:plain
|x+3-3-(|y+3|-3)^2+0.3,-(|y+3|-3)-(|x+3|-3)^2+0.3のジュリア集合
f:id:Hassium277:20210329195427p:plain
(|x+1|-1)^2-(|y+1|-1)^2+0.47,(|x+1|-1)(|y+1|-1)+0.7のジュリア集合

何?

最初に説明したジュリア集合・広義マンデルブロ集合の定義に当てはまらないものをまとめて紹介します。

対称性増やし:ジュリア集合編

ジュリア集合の初期値を書き変えることで、広義マンデルブロ集合での対称性増やしと同じようなことができます。


f:id:Hassium277:20210329221426p:plain

Sub f()
    Dim x, y, px, py, cx, cy As Double
    Dim o As Double
    For a = 0 To 2000
        For b = 0 To 2000
            cx = a / 500 - 2
            cy = b / 500 - 2
            x = cx ^ 3 - 3 * cx * cy ^ 2
            y = 3 * cx ^ 2 * cy - cy ^ 3
            o = True
            For c = 0 To 500
                px = x
                py = y
                x = px ^ 2 - py ^ 2
                y = 2 * px * py + 0.7
                If x ^ 2 + y ^ 2 > 100 Then
                    Cells(b + 1, a + 1).Interior.Color = RGB(cr(c * 7), cr(c * 8), cr(c * 9))
                    o = False
                    Exit For
                End If
            Next c
            If o Then Cells(b + 1, a + 1).Interior.Color = 0
        Next b
    Next a
End Sub

Function cr(ByVal c As Long) As Integer
    cr = (c Mod 256) * (255 - (c Mod 256)) / 65
End Function


これは「z_0=c^3z_{n+1}=z_n^2+0.7iという数列の絶対値が発散しない複素数c」を計算をすることを意味しています。


また、広義マンデルブロ集合のときと同様に、定数を足して対称性を崩さず変形させることができます。

f:id:Hassium277:20210329222712p:plain
z^2+0.7,z_0=c^3+0.2-0.5i

第三の変数

f:id:Hassium277:20210330161242p:plain
z^2+c+(n mod 2)/2の広義マンデルブロ集合(?)


広義マンデルブロ集合は2変数関数f(z,c)(と初期値)によって決まるフラクタル図形でしたが、3変数関数を使うようにもできます。


例えば上の画像のものでは、z_nnを計算に組み込んだz_{n+1}=z_n^2+c+\frac{1}{2}(n\ \text{mod}\ 2)という式を使っています。

f:id:Hassium277:20210330013423p:plain
z^2+c+(n mod 200)/200の広義マンデルブロ集合(?)
f:id:Hassium277:20210330021127p:plain
z^2+c+1/(n-1)の広義マンデルブロ集合(?)


三項漸化式を使うこともできます。

f:id:Hassium277:20210330211745p:plain
z_{n+2}=(z_{n+1}+iz_n)^2+cの広義マンデルブロ集合(?)
f:id:Hassium277:20210330211919p:plain
z_{n+2}=z_{n+1}z_n+cの広義マンデルブロ集合(?)


それぞれに対するジュリア集合っぽいものも考えることができます。

f:id:Hassium277:20210330212053p:plain
z^2+i(n mod 200)/200-0.1+0.6iのジュリア集合(?)
f:id:Hassium277:20210330212140p:plain
z^2+1/(n-1)-0.8+0.1iのジュリア集合(?)
f:id:Hassium277:20210330212319p:plain
z_{n+2}=(z_{n+1}+iz_n)^2+0.02-0.14iのジュリア集合(?)
f:id:Hassium277:20210330212350p:plain
z_{n+2}=z_{n+1}z_n+0.281+0.01iのジュリア集合(?)

*1:厳密には「発散しない点」ですが、面倒なので「収束する」と表記しています。

*2:実際の計算では距離の2乗の値を使っていますが、面倒なので「距離」と書きます。

*3:念のため言っておくと、これはジョークです。