Mandelbrot(曼德布洛特)集合是在复平面上组成分形的点的集合。
Mandelbrot集合的定义(摘自维基百科)
Mandelbrot集合可以用下面的复二次多项式定义:
其中c是一个复参数。对于每一个c,从z=0开始对函数
进行迭代。
序列
的值或者延伸到无限大,或者只停留在有限半径的圆盘内。
Mandelbrot集合就是使以上序列不发散的所有c点的集合。
从数学上来讲,Mandelbrot集合是一个复数的集合。一个给定的复数c或者属于Mandelbrot集合,或者不是。
用程序绘制Mandelbrot集合时不能进行无限次迭代,最简单的方法是使用逃逸时间(迭代次数)进行绘制,具体算法如下:
- 判断每次调用函数 得到的结果是否在半径R之内,即复数的模小于R
- 记录下模大于R时的迭代次数
- 迭代最多进行N次
- 不同的迭代次数的点使用不同的颜色绘制
import numpy as np
import pylab as pl
import time
from matplotlib import cm
def inter_point(c):
z=c
for i in range(1,100):
if abs(z)>2:
break
z=z*z+c
return i
def draw_mandelbrot(cx,cy,d):
x0,x1,y0,y1=cx-d,cx+d,cy-d,cy+d
y,x=np.ogrid[y0:y1:200j,x0:x1:200j]
c=x+y*1j
start=time.perf_counter()
mandelbrot=np.frompyfunc(inter_point,1,1)(c).astype(np.float)
print("time=",time.perf_counter()-start)
pl.imshow(mandelbrot,cmap=cm.Blues_r,extent=[x0,x1,y0,y1])
pl.gca().set_axis_off()
x,y=0.27322626,0.595153338
pl.subplot(231)
draw_mandelbrot(-0.5,0,1.5)
for i in range(2,7):
pl.subplot(230+i)
draw_mandelbrot(x,y,0.2**(i-1))
pl.subplots_adjust(0.02,0,0.98,1,0.02,0)
pl.show()
time= 0.2717320999999999
time= 0.31482999999999994
time= 0.4434923000000002
time= 0.5119992999999998
time= 0.6302547000000001
time= 0.7690006
import numpy as np
import pylab as pl
import time
from matplotlib import cm
def draw_mandelbrot(cx,cy,d,N=200):
global mandelbrot
x0,x1,y0,y1=cx-d,cx+d,cy-d,cy+d
y,x=np.ogrid[y0:y1:N*1j,x0:x1:N*1j]
c=x+y*1j
ix,iy=np.mgrid[0:N,0:N]
mandelbrot=np.ones(c.shape,dtype=np.int)*100
ix.shape=-1
iy.shape=-1
c.shape=-1
z=c.copy()
start=time.perf_counter()
for i in range(1, 100):
z*=z
z+=c
tmp=abs(z)>2.0
mandelbrot[ix[tmp],iy[tmp]]=i
np.logical_not(tmp,tmp)
ix,iy,c,z=ix[tmp],iy[tmp],c[tmp],z[tmp]
if len(z)==0:
break
print("time=",time.perf_counter()-start)
pl.imshow(mandelbrot,cmap=cm.Blues_r,extent=[x0,x1,y0,y1])
pl.gca().set_axis_off()
x,y=0.27322626,0.595153338
pl.subplot(231)
draw_mandelbrot(-0.5,0,1.5)
for i in range(2,7):
pl.subplot(230+i)
draw_mandelbrot(x,y,0.2**(i-1))
pl.subplots_adjust(0.02,0,0.98,1,0.02,0)
pl.show()
time= 0.04651939999999932
time= 0.030365299999999706
time= 0.04211450000000028
time= 0.0633827999999994
time= 0.10660480000000128
time= 0.1617885000000001