参见:维基百科-朱利亚集合

朱利亚集合(又译为茹利亚集合,英文:Julia set)是一个在复平面上形成分形的点的集合。以法国数学家加斯顿·朱利亚(Gaston Julia)的名字命名。
定义:
朱利亚集合可以由下式进行反复迭代得到:

$$f_c(z)=z^2+c$$
对于固定的复数$c$,取某一$z$值(如$z=z_0$),可以得到序列
$$z_0, f_c(z_0), f_c(f_c(z_0)), f_c(f_c(f_c(z_0))), f_c(f_c(f_c(z_0))) …$$
这一序列可能发散于无穷大或始终处于某一范围之内并收敛于某一值。我们将使其不扩散的z值的集合称为朱利亚集合。

简言之,要绘制Julia Set图像,就是对复平面上任意一点按照 $f_c(z)=z^2+c$进行迭代,看多少步会发散,这个发散值被定义为zmax,然后将复平面上所有点迭代到发散的步数用云图方式画出来,就是Julia Set图像了。

所以写一个iterate函数,就是对于输入z0,按照公式迭代,返回迭代到发散的步数。具体代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import matplotlib.pyplot as plt
import numpy as np
def iterate(n,z0,zmax):
z=z0*z0+C
for i in range(n):
if abs(z)>zmax:
return i
z=z*z+C
return n
C=0.285+0.01j
n,zmax=200,10.
imin,imax,jmin,jmax=-1.5,1.5,-1.5,1.5
step=0.005
i=np.arange(imin,imax,step)
j=np.arange(jmax,jmin,-step)
I,J=np.meshgrid(i, j)
ufunc=np.frompyfunc(iterate,3,1)
Z=ufunc(n,I+1j*J,zmax).astype(np.int16)
plt.imshow(Z,extent=(imin,imax,jmin,jmax))
cb = plt.colorbar(orientation='vertical',shrink=1)
cb.set_label('iteration count')
plt.savefig('0.285+0.01j.png',dpi=300)
plt.show()

这里生成网格点用了numpymeshgrid(),绘制云图用到了matplotlib的imshow()函数。对于C=0.285+0.01j得到的图像就像如下:

C=0.285+0.01j

还可以取其他的C值得到各种漂亮的图像哦,比如:0.285+0.0j0.360284+0.100376j等等。。

如果要绘制曼德博集合(Mandelbrot set)。方法与Julia Set基本一致,不同的是迭代发生了变化,变成了:$f_c(z)=z^2+z_0$。因此只要对上边的函数做小小改的就可以画出曼德博集合了:

1
2
3
4
5
6
7
def iterate(n,z0,zmax):
z=z0*z0+z0
for i in range(n):
if abs(z)>zmax:
return i
z=z*z+z0
return n

绘制出的图形如下:

Mandelbrot_set