何かを書き留める何か

数学や読んだ本について書く何かです。最近は社会人として生き残りの術を学ぶ日々です。

cmathとmatplotlibでMandelbrot集合を描画する。

cmathに思いをはせて

cmathモジュールの活用例を求めて色々と考えた後、まずはMandelbrot集合を書いてみようと思い立った。 Mandelbrot集合の定義はWikipediaを参照してほしい。

マンデルブロ集合 - Wikipedia

簡単に述べると、ある複素数列が収束する初期値の集合である。

最初は定義をよく確認せず実装してしまいうまくいかず、以下のサイトのお世話になった。 以前からMandelbrot集合の存在は知っていたが定義をきちんと理解したのは今回が初めてかもしれない。

aoking.hatenablog.jp

方針として、複素数列が収束するかを判定する函数floatrangeとなるジェネレータを実装し、Mandelbrot集合を計算、matplotlibで描画、いう流れである。

import cmath
import decimal
import itertools

import matplotlib.pyplot as plt


def mandelbrot(c):
    z = complex(10, 10)
    for _ in range(1000):
        z = z**2 + c
        if abs(z) > 2:
            return False
    else:
        return True

def drange(x, y, jump):
    while x < y:
        yield float(x)
        x += decimal.Decimal(jump)

xs = []
ys = []
for x, y in itertools.product(drange(-2, 2, 0.01), drange(-2, 2, 0.01)):
    if mandelbrot(complex(x, y)):
        xs.append(x)
        ys.append(y)

plt.axis('off')
plt.plot(xs, ys, ".", color='k')
plt.savefig("mandelbrot.png")

実行結果は以下の通りである。

f:id:XaroCydeykn:20170620225403p:plain

あまりきれいではない。

解析学っぽいことに触れると、自分の中に位相空間の知識が欠落していることにいやでも気づかされる。 しばらく時間ができそうな気配がするので、位相空間という借金を返済しようかと考えている。