该文章是我在2014年发布在某sdn的,搬运过来。
广义曼德勃罗特集的探索与交互式可视化
引言
曼德勃罗特集(Mandelbrot Set)以其复杂的边界和无限的自相似性而闻名,它是分形几何中的一个经典实例,展现了数学与艺术的完美结合。本篇文章将引导你通过Python编程,结合matplotlib库,实现广义曼德勃罗特集的可视化,并添加放大缩小功能,使读者能够互动探索这个数学奇观的细节。
广义曼德勃罗特集的定义
传统的曼德勃罗特集由复数 c 的集合构成,对于每一个 c,若序列 𝑧𝑛+1=𝑧𝑛^2+𝑐 对于任意 n 都保持有界,则 c 属于曼德勃罗特集。然而,在广义曼德勃罗特集中,幂运算的指数可以是任意复数,例如 1+5𝑗,这为我们打开了探索更多奇异结构的大门。
Python 实现
首先,我们需要导入必要的Python库,包括numpy用于数值计算,matplotlib用于绘图,以及time库用于测量绘制时间。
Python
1import numpy as np 2import matplotlib.pyplot as plt 3from matplotlib import cm 4import time
接着,定义绘制广义曼德勃罗特集的函数,这里我们使用了两种方法来实现,一种是基于迭代次数的规范化处理,另一种则是基本的迭代绘制。
Python
1def draw_mandelbrot2(cx, cy, d, N=600): 2 x0, x1, y0, y1 = cx-d, cx+d, cy-d, cy+d 3 y, x = np.ogrid[y0:y1:N*1j, x0:x1:N*1j] 4 c = x + y*1j 5 smooth_mand = np.frompyfunc(smooth_iter_point,1,1)(c).astype(np.float) 6 plt.imshow(smooth_mand, cmap=cm.Blues_r, extent=[x0,x1,y1,y0]) 7 plt.axis('off') 8 plt.show() 9 10def smooth_iter_point(c): 11 z = c 12 d = 1+5j # 幂运算的指数 13 for i in range(1, 20): 14 if abs(z) > 10: break 15 z = z**d + c 16 absz = abs(z) 17 if absz > 2.0: 18 mu = i - log(log(abs(z),2),2) 19 else: 20 mu = i 21 return mu
为了增加交互性,我们利用matplotlib的事件处理机制,实现基于鼠标的放大和缩小功能。
Python
1def on_press(event): 2 global g_size 3 if not (event.xdata and event.ydata): 4 return 5 if event.button == 1: # 左键:放大 6 g_size /= 2 7 elif event.button == 3: # 右键:缩小 8 g_size *= 2 9 draw_mandelbrot2(event.xdata, event.ydata, g_size)
最后,初始化画布并连接鼠标事件处理器。
Python
1fig, ax = plt.subplots() 2g_size = 2.5 3fig.canvas.mpl_connect('button_press_event', on_press) 4draw_mandelbrot2(0,0,g_size) 5plt.show()
运行与探索
运行上述代码,你将看到一个充满细节的广义曼德勃罗特集图像。通过鼠标左键和右键,你可以自由地放大和缩小,探索这个数学世界的奥秘。
结语
通过本篇技术博客,我们不仅实现了广义曼德勃罗特集的可视化,还引入了交互式放大缩小功能,为数学探索提供了生动的工具。这不仅是一次编程实践,也是对数学之美的直观体验。鼓励读者尝试修改指数值,探索不同幂次下的曼德勃罗特集形态,享受数学与编程带来的乐趣。