朱利亚集合和曼德布洛特集合及其图像
朱利亚集合(Julia Set)和 曼德布洛特集合(Mandelbrot Set)除了数学理论上的意义,所生成的分形图像,因其独特的几何美感和无限的复杂性,还被广泛应用于计算机图形学和艺术创作中,生成具有迷人复杂图案的分形图像。本文将使用Python 及NumPy、Matplotlib 库来计算和绘制朱利亚集合(Julia Set)和 曼德布洛特集合(Mandelbrot Set)的图像。
朱利亚集合(Julia Set)和 曼德布洛特集合(Mandelbrot Set),都是复数平面上的 fractals(分形),它们彼此之间有着密切的关系,但又在图形上表现得不同。
曼德布洛特集合(Mandelbrot Set)和 朱利亚集合(Julia Set)公式是一样的,
其中C是复数常数。
这是两种等价表达方式,第一种是连续形式,第二种是递归形式。
但它们的定义和计算方法有所不同:
朱利亚集合:
C是固定的复数常数
Z 是变量,代表复平面上的每个点
曼德布洛特集合:
C是变量,代表复平面上的每个点
Z的初始值固定为 0 (Z0 = 0)
两者关系:
曼德布洛特集合可以被视为朱利亚集合的"参数空间"或"索引"。曼德布洛特集合中的每个点对应一个特定的朱利亚集合。
曼德布洛特集合(Mandelbrot Set)和朱利亚集合(Julia Set)是描述同一数学现象——分形几何——的两个不同的视角或方式。具体来说,它们都是基于相同的迭代过程,但从不同的角度进行观察和研究。
朱利亚集合(Julia Set)图像
常数c的选择会极大影响朱利亚集合的形状。
调整迭代次数可以影响图像的精细程度。
使用Python 及NumPy、Matplotlib 库来计算和绘制朱利亚集合图像。
【您可能需要使用以下命令安装:
pip install numpy matplotlib 】
源码如下:
import numpy as np
import matplotlib.pyplot as plt
def julia_set(h, w, max_iter, c):
# h: 图像高度像素
# w: 图像宽度像素
# max_iter: 最大迭代次数,增加其值可以获得更精细的细节,但计算时间加长
# c: 朱利亚集合的复数参数
# 创建复平面上的网格
# np.ogrid 生成一个开放网格,比 np.mgrid 更内存效率
# 1j 告诉 numpy 使用复数步长,从而创建复数网格
y, x = np.ogrid[-1.4:1.4:h*1j, -2:2:w*1j]
# 将 x 和 y 组合成复数平面
z = x + y*1j
# 初始化发散时间数组,全部设置为最大迭代次数
divtime = max_iter + np.zeros(z.shape, dtype=int)
for i in range(max_iter):
# 应用朱利亚集合迭代公式
z = z**2 + c
# 检查哪些点发散(模大于2)
# np.conj 计算复数的共轭,用于计算模的平方
diverge = z*np.conj(z) > 2**2
# 找出本次迭代新发散的点
div_now = diverge & (divtime==max_iter)
# 记录新发散点的发散时间
divtime[div_now] = i
# 将发散的点设置为2,防止溢出
z[diverge] = 2
return divtime
# 设置参数
h, w = 1000, 1500
max_iter = 100
c = -0.4 + 0.6j # 可以尝试不同的 c 值
# 计算朱利亚集合
julia = julia_set(h, w, max_iter, c)
# 创建图像
fig, ax = plt.subplots(figsize=(12, 8))
#其中cmap='hot',使用 'hot' 颜色映射来显示结果。还可选用如 'viridis'、'cool' 或 'plasma'
ax.imshow(julia, cmap='hot', extent=[-2, 2, -1.4, 1.4])
ax.set_title(f'Julia Set for c = {c}')
ax.set_xlabel('Re(z)')
ax.set_ylabel('Im(z)')
# 显示图像
plt.show()
# 保存图像(可选)
# plt.savefig('julia_set.png', dpi=300, bbox_inches='tight')
运行效果:
以下是一些著名的和视觉上吸引人的 c 值,您可以在之前的代码中尝试:
- c = -0.4 + 0.6j
经典的"树枝状"朱利亚集合 - c = -0.8 + 0.156j
著名的"龙形"朱利亚集合 - c = -0.7269 + 0.1889j
复杂的螺旋结构 - c = 0.285 + 0.01j
精致的"雪花"图案 - c = -0.835 - 0.2321j
"兔子"朱利亚集合 - c = -0.8 + 0.2j
"海马"形状 - c = -0.75
对称的分形图案 - c = -0.1 + 0.651j
有趣的"爪形"结构 - c = -0.39054 - 0.58679j
"树枝状"结构 - c = 0.355534 - 0.337292j
复杂的分形结构
曼德布洛特集合(Mandelbrot Set)图像
使用 NumPy 和 Matplotlib 库来计算和绘制曼德布洛特集合(Mandelbrot Set)图像。源码如下:
import numpy as np
import matplotlib.pyplot as plt
def mandelbrot_set(h, w, max_iter, y, x):
"""
计算 Mandelbrot 集。
参数:
h, w : int
图像的高度和宽度。
max_iter : int
最大迭代次数。
y, x : numpy.ndarray
复平面上的y和x坐标网格。
返回:
numpy.ndarray
每个点的发散时间。
"""
# 创建复数平面
c = x + y*1j
# 初始化z为c(Mandelbrot集的特性)
z = c
# 初始化发散时间数组
divtime = max_iter + np.zeros(z.shape, dtype=int)
for i in range(max_iter):
# 应用Mandelbrot迭代公式: z = z^2 + c
z = z**2 + c
# 检查哪些点发散(模大于2)
diverge = z*np.conj(z) > 2**2
# 找出本次迭代新发散的点
div_now = diverge & (divtime==max_iter)
# 记录新发散点的发散时间
divtime[div_now] = i
# 将发散的点设置为2,防止数值溢出
z[diverge] = 2
return divtime
def plot_mandelbrot(h, w, max_iter, y_range, x_range, cmap='viridis', title='Mandelbrot Set'):
"""
绘制 Mandelbrot 集。
参数:
h, w : int
图像的高度和宽度。
max_iter : int
最大迭代次数。
y_range : tuple
y轴的范围,格式为(y_min, y_max)。
x_range : tuple
x轴的范围,格式为(x_min, x_max)。
cmap : str, 可选
颜色映射的名称。默认为'viridis'。
title : str, 可选
图像的标题。默认为'Mandelbrot Set'。
"""
# 创建复平面上的网格
y, x = np.ogrid[y_range[0]:y_range[1]:h*1j, x_range[0]:x_range[1]:w*1j]
# 计算Mandelbrot集
mandelbrot = mandelbrot_set(h, w, max_iter, y, x)
# 创建图像
fig, ax = plt.subplots(figsize=(12, 8))
# 绘制Mandelbrot集
im = ax.imshow(mandelbrot, cmap=cmap, extent=[x_range[0], x_range[1], y_range[0], y_range[1]])
# 设置标题和坐标轴标签
ax.set_title(title)
ax.set_xlabel('Re(c)')
ax.set_ylabel('Im(c)')
# 添加颜色条
plt.colorbar(im, ax=ax, label='Iteration count')
# 显示图像
plt.show()
# 保存图像(可选)
# plt.savefig('mandelbrot_set.png', dpi=300, bbox_inches='tight')
# 设置参数
h, w = 1000, 1500
max_iter = 100
# 完整的 Mandelbrot 集
plot_mandelbrot(h, w, max_iter, [-1.4, 1.4], [-2, 0.8], title='Full Mandelbrot Set')
运行效果:
调整参数可探索 Mandelbrot 集图像的不同部分,观察细节精细的结构:
# 主体左侧的小芽结构
plot_mandelbrot(h, w, max_iter, [-0.1, 0.1], [-1.5, -1.3], title='Left Bulb of Mandelbrot Set')
# 主体顶部的螺旋结构
plot_mandelbrot(h, w, max_iter, [0.3, 0.5], [-0.1, 0.1], title='Top Spiral of Mandelbrot Set')
# 主体右侧的触须结构
plot_mandelbrot(h, w, max_iter, [-0.05, 0.05], [0.25, 0.35], title='Right Tendril of Mandelbrot Set')
# 主体底部的细小分支
plot_mandelbrot(h, w, max_iter, [-1.0, -0.8], [-0.1, 0.1], title='Bottom Filaments of Mandelbrot Set')
# 主卡迪奥球体边缘的细节
plot_mandelbrot(h, w, max_iter, [-0.02, 0.02], [-0.78, -0.74], title='Main Cardioid Edge Detail')
# 深度放大的边界细节
plot_mandelbrot(h, w, max_iter*2, [-0.001, 0.001], [-0.751, -0.749], title='Deep Zoom Boundary Detail')
OK!