十幾行python代碼,帶你畫一個漂亮的Mandelbrot集
想必大多對數(shù)學(xué)感興趣的人都對Mandelbrot集有所耳聞。
雖然每個做這個程序的都要說,但是我還是以我的語言再解釋一次吧。
對于復(fù)平面上任意一個復(fù)數(shù)C,從X0=0開始,Xn=Xn-1^2+C反復(fù)迭代 ,如果結(jié)果始終不會發(fā)散,則C屬于曼德布洛特集。
所以繪制曼德布洛特集其實很簡單,按照定義把這些點找出來就可以啦。
用python實現(xiàn)一下:
import numpy as np
from matplotlib import pyplot as plt
n=1000
Y, X = np.mgrid[-1.5:1.5:3/n, -2:1:3/n]
C = X+1j*Y
#做出復(fù)平面C,每一個元素,都是復(fù)平面上該點的坐標(biāo)。
#下面來檢查一下這些點,哪些滿足Mandelbrot集定義
pic = np.zeros((n,n)) ?#定義一個平面,用來保存定義要求的每一次迭代的結(jié)果。
ans = np.zeros((n,n)) ?#用來繪制最終曼德布洛特集的平面。
for i in range(20):
? ? pic=pic**2+C ?? #按照曼德布洛特集的定義進(jìn)行迭代。
? ?
ans = np.float32(np.abs(pic)<100) ?
#檢查多次迭代后,最終結(jié)果模值小于100的點都認(rèn)為收斂,從而得到每一點的收斂情況
# 把收斂結(jié)果然后轉(zhuǎn)化成浮點類型,放在ans中。
plt.imshow(ans,cmap="rainbow")
plt.show()? ?#把a(bǔ)ns畫出來
怎么樣,是不是很簡單? 我們來看看結(jié)果如何。

總共13行就實現(xiàn)了這樣的效果。
現(xiàn)在修改一下程序,我們把迭代過程中的每一步滿足的點集都繪制在一張圖上。修改的方法很簡單,讓保存最終結(jié)果的ans是每一步結(jié)果的和,看下修改后的代碼
import?numpy?as?np
from?matplotlib?import?pyplot?as?plt
n=1000
Y, X = np.mgrid[-1.5:1.5:3/n, -2:1:3/n]
C = X+1j*Y
pic = np.zeros((n,n))??
ans = np.zeros((n,n))??
for?i?in?range(20):
? ? pic=pic**2+C? ??
????ans += np.float32(np.abs(pic)<100)??
????#這里ans放入循環(huán)體中,對每一步求和,從而展示出逐漸收斂的過程。
plt.imshow(ans,cmap="rainbow")
plt.show()? ?
看看結(jié)果:

效果是不是挺驚艷。
如果想繪制局部圖形,還是老程序,但是需要修改對應(yīng)的參數(shù):
import numpy as np
from matplotlib import pyplot as plt
n=1000
Y, X = np.mgrid[-0.05:0.05:0.1/n, 0.2:0.3:0.1/n]??
#在這里只選擇平面上自己想繪制的部分區(qū)間。
C = X+1j*Y
pic = np.zeros((n,n)) ?
ans = np.zeros((n,n))??
for i in range(200):
#由于繪制范圍變小,為了在局部依然明確的區(qū)分出收斂情況,則需要相應(yīng)提高迭代次數(shù)。
? ? pic=pic**2+C ??
? ? ans += np.float32(np.abs(pic)<100)??
plt.imshow(ans,cmap="rainbow")
plt.show() ?

怎么樣,沒有疑問了吧。