使用 Python 绘制 Mandelbrot 分形图

是由于今天个人电脑计算能力的强大,才有可能让我们在家中就能绘出从前只有在世界级研究中心里才能见到的绚丽图案。

from pylab import *
from numpy import NaN

def m(a):
    z = 0
    for n in range(1, 100):
        z = z**2 + a
        if abs(z) > 2:
            return n
    return NaN

X = arange(-2, .9, .002)
Y = arange(-1,  1, .002)
Z = zeros((len(Y), len(X)))

for iy, y in enumerate(Y):
    print (iy, "of", len(Y))
    for ix, x in enumerate(X):
        Z[iy,ix] = m(x + 1j * y)

imshow(Z, cmap = plt.cm.prism, interpolation = 'none', extent = (X.min(), X.max(), Y.min(), Y.max()))
xlabel("linuxidc")
ylabel("linuxidc.com")
savefig("www.linuxidc.com.png")
show()

如下图:

使用 Python 绘制 Mandelbrot 分形图

Mandelbrot集

数学定义: $$f_c(z) = z^2+c$$

Mandelbrot集是\(f_c(z)\)在z=0,关于复数c=x+yi的函数迭代不发散序列集合。

绘制Mandelbrot集最简单的方法是使用逃逸时间进行绘制。逃逸时间指的是,在指定范围M进行有限次数N迭代,而不超出M区域的次数。使用不同的颜色绘制不同的迭代次数。

1.设置迭代的最多次数,N

2.设置初始化\(z_0\)的值,

3.设置逃逸半径R的值,通常为2

# -*- coding: utf-8 -*-

import numpy as np
import matplotlib.pyplot as plot 

x0=0 #初始值z0的x0
y0=0 #初始值z0的y0
zoom=2.0 #放大倍率
N=200 #最大迭代次数
R=2 #迭代半径
a=6.0 #绘制图的横轴大小
b=5.0 #绘制图的纵轴大小
step=0.001 #绘制点的步长

def iterate(c,N,R):
    z=c
    for i in range(N):
        if abs(z)>R: 
            return i
        z = z*z+c
    return N

x=np.arange(-a/(2.0*zoom)+x0,a/(2.0*zoom)+x0,step)
y=np.arange(b/(2.0*zoom)+y0,-b/(2.0*zoom)+y0,-step)
cx,cy=np.meshgrid(x, y)
c = cx + cy*1j
ufunc=np.frompyfunc(iterate,3,1)
Z=ufunc(c,N,R).astype(np.float)
plot.imshow(Z,extent=(-a/2.0,a/2.0,-b/2,b/2.0))
cb = plot.colorbar(orientation='vertical',shrink=1)
cb.set_label('www.linuxidc.com')
plot.show()

图中是使用参数:x0=0 y0=0 zoom=2.0 N=200 R=2 a=6.0 b=4.0 step=0.001。生成的图像。不同的是,它们依次使用的是二次、三次幂的迭代。

如下图:

使用 Python 绘制 Mandelbrot 分形图

猜你喜欢

转载自www.linuxidc.com/Linux/2019-05/158411.htm