Python繪製Mandelbrot Set與Julia Set

看了[這篇文章](matrix67.com/blog/archi)感覺畫出一個分形並不是想像的那麼難,並且被這美麗而又統一的圖案深深的吸引了。所以決定用Python繪Mandlebrot Set和Julia Set。因為兩個集合是同一個式子的不同參數的遞歸,並且Mandlebrot是對Julia的一種概括,可以點擊Mandlebrot Set中的一點,觀察對應Julia Set的變化或許更為直觀,也更能體會兩者其中美妙的關聯。

計算思路

Mandlebrot Set 與 Julia Set都是對 z^2+c 的迭代,不同的是,Mandlebrot Set是將複平面每一點帶入c,z的初始值為0。Julia Set是將複平面的每一個值帶入z,c是一個固定值有我們點Mandlebrot Set上的一點得到。c決定了Julia Set的形狀,Mandlebrot Set便是選取所有的c在z=0時的切片,蘊含了所有的Julia Set的細節特徵。這個式子有四個參數控制,分別是z,c的實部和虛部,兩個集合分別是這個四維圖像的投影。

如何上色

一般不採取迭代一定次數後|z|對應到Color Map,那樣顏色很雜亂,到最後的結果會很難受。只需要採取很簡單的方法就可以做到,就是使用逃逸速度,對每一點進行迭代,|z|大於2的時候就知道繼續迭代下去肯定發散,記錄此時已經迭代的次數,對應Color Map即可。

前提

安裝matplotlib和numpy,Anaconda已經包含這些。matplotlib包含了簡單的color map,直接用就好了,看起來也很漂亮。numpy則是可以直接像matlab一樣對所有的元素進行計算,速度快而且簡單。

import numpy as npimport matplotlib.pyplot as pltjulia_C = -0 + 0jdef julia_set(x, y): z = np.array(x + 1j * y) r = np.zeros(z.shape) m = np.ones(z.shape, dtype=bool) for i in range(24): z[m] = z[m] ** 2 + julia_C m = np.abs(z) < 2 r += m return rdef mandelbrot_set(x, y): c = np.array(x + 1j * y) z = np.zeros(c.shape, dtype=complex) r = np.ones(c.shape) m = np.ones(c.shape, dtype=bool) for i in range(50): z[m] = z[m] ** 2 + c[m] m = np.abs(z) < 2 r += m return rdef complex_str(c): return np.array_str(np.array([julia_C]), suppress_small=True, precision=3)def grid(width, offset, n): x = np.linspace(-width + offset, width + offset,n) y = np.linspace(-width, width, n) return np.meshgrid(x,y), (x.min(), x.max(), y.min(), y.max())fig, (ax, bx) = plt.subplots(1, 2)ax.set_title("Mandelbrot Set(Mirror to Julia Set)")bx.set_title("Julia Set c=" + complex_str(julia_C))(X, Y), extent = grid(2, 0, 1000)cf = ax.imshow(mandelbrot_set(X,Y), extent=extent)(X, Y), extent = grid(2, 0, 1000)julia = julia_set(X, Y)img = bx.imshow(julia, extent=extent, cmap="gray")def onclick(event): if event.inaxes != ax: return global X, Y, julia_C julia_C = event.xdata + 1j * event.ydata julia = julia_set(X, Y) img.set_data(julia) bx.set_title("Julia Set c=" + complex_str(julia_C)) fig.canvas.draw_idle()fig.canvas.mpl_connect(button_press_event, onclick)plt.tight_layout()plt.show()

欣賞幾張美麗的分形

c = 0時, Julia是一個圓

選擇相近的Mandlebrot Set區域,對應的Julia Set也會有很大的相似性

也可以把 z^2+c 替換為 z^3+c

cmap換成gray時,也很不錯

你可以在左邊的圖表上隨便的點,觀察他們的規律!!

推薦閱讀:

從網易雲歌單說到貪心演算法
地圖生成與C4D聯動
A Discipline of Programming 筆記,1-4章
沈向洋:You Are What You Write,大家都要看

TAG:Python | 分形理論 | 編程 |